用Python写网络爬虫——学习笔记(2)

【3个简单的爬虫实例】

**3种爬取网站的常用方法:

爬取网站地图(sitemap,包含了一个网站所有链接的xml格式文件)
遍历每个网页的数据库ID
跟踪网页链接
 

下载感兴趣的网页(下载html)  

为后文的三个爬虫的实现做铺垫


    1) 使用Python的urllib2模块下载URL
**互联网工程任务组定义了HTTP错误的完整列表(tools.ietf.org/html/rfc7231#section-6)

4XX错误发生在请求存在问题时,5XX错误发生在服务端存在问题时。

当发生5XX错误时需要重新下载网页,代码示例:

import urllib2
def download(url, num_retries=2):  #默认重新下载次数为2
    print ‘Downloading:’,url
    try:
        html=urllib2.urlopen(url).read()
    except urllib2.URLError as e:  #所请求的网页不存在等异常
        print ‘Downlading error:’ e.reason
        html=None
        if num_retries > 0:
            if hasattr(e, ’code’ ) and 500 <= e.code <600:
            return download(url,num_retries-1)
     return html
 
  


   2) 设置用户代理模块urllib2默认的用户代理是Python-urllib/2.7,但某些网站会封禁这个默认的用户代理,因此为了下载更加可靠,需要对用户代理进行设定。
对上面的代码进行修改优化:

import urllib2
def download(url, num_retries=2,user_agent='用户代理名'):  #默认重新下载次数为2
    print ‘Downloading:’,url
    headers = {'User-agent':user-agent}
    request = urllib2.Request(url,headers=headers)
    try:
        html=urllib2.urlopen(url).read()
    except urllib2.URLError as e:  #所请求的网页不存在等异常
        print ‘Downlading error:’ e.reason
        html=None
        if num_retries > 0:
            if hasattr(e, ’code’ ) and 500 <= e.code <600:
            return download(url,num_retries-1,,user_agent='用户代理名')
     return html


 第一个爬虫:网站地图爬虫

用sitemap下载所有网页,正则表达式,从标签中提取出链接网站的URL
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。 详细内容见网站:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2

def crawl_sitemap(url):
    sitemap = download(url) 				#download the sitemap file
    links = re.findall('(.*?)',sitemap) 	#extract the sitemap linls
    for link in links:				#download each link
        html = download(link)


第二个爬虫:ID遍历爬虫

利用网站结构的弱点,访问其内容
* http://example.webscraping.com/places/default/view/Afghanistan-1
* http://example.webscraping.com/places/default/view/Australia-14
* http://example.webscraping.com/places/default/view/Brazil-32
这些URL的特点是只在结尾处有区别,包括国家名和ID,国家名作为页面别名通常被web服务器忽略,只使用ID来匹配数据库中的相关记录,将页面别名除去仍可以找到该链接。

ID遍历爬虫不适用的情况:

○1 有些网站会检查页面别名
○2 有些网站使用不连续的大数值ID、使用非数值ID


import itertools
for page in itertools.count(1):
    url = 'http://example.webscraping.com/view/-%d' % page
    if html is None:
        break
    else:
        # success - can scrape the result
        pass

第三个爬虫:链接爬虫

让爬虫表现得更像普通用户,跟踪链接,访问感兴趣的内容
使用链接爬虫,只下载所需的网页。使用正则表达式来确定需要下载哪些页面
注意一个问题:浏览器可以根据相对链接(没有协议和服务器部分)正常工作,但是urllib2不可以,为了让urllib2能够定位网页,需要将链接转换为绝对链接的形式,这可以用Python自带的urlparse模块实现,使用urlparse模块创建绝对路径。

import urlparse
def link_crawler(seed_url, link_regex):
    #crawl from the given seed URL following links matched by link_regex
    crawl_queue = [seed_url]
    #记录哪些链接已被爬取过,避免重复下载
    seen = set(crawl_queue)
    while crawl_queue:
        url = crawl_queue.pop()
        html = download(url)
        for link in get_links(html):
            if re.match(link_regex, link):
                 #创建绝对路径
                 link = urlparse.urljoin(seed_url, link)
                if link not in seen:
                    seen.add(link)
                    crawl_queue.append(link)


def get_links(html):
    """return a list of links from html
    """
    webpage_regex = re.compile(']+href=["\'](.*?)["\']', re.IGNORECASE)
    return webpage_regex.findall(html)



 
  
 
 

你可能感兴趣的:(学习笔记)