【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下载所有网页,正则表达式,从<loc>标签中提取出链接网站的URL
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。 详细内容见网站:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2def crawl_sitemap(url): sitemap = download(url) #download the sitemap file links = re.findall('<loc>(.*?)</loc>',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('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE) return webpage_regex.findall(html)