【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/0014316089557264a6b348958f449949df42a6d3a2
def 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)