1.网站地图爬虫
def crawl_sitemap(url):
#下载网站地图文件
sitemap=download(url)
#正则表达式,从<loc>标签中提取出URL,获得网站地图链接
links=re.findall('<loc>(.*?)</loc>',sitemap)
#下载每个链接
for link in links:
html=download(link)
#抓取的网站
2.ID遍历爬虫
(1)对ID进行遍历,直到出现下载错误时停止。
缺陷:某些记录可能已被删除,数据库ID之间并不是连续的。此时,只要访问到某个间隔点,爬虫就会立刻退出。
import itertools for page in itertools.count(1): url='http://example.webscrapping.com/view/-%d' %page html=download(url) if html is None: break else: pass
(2)该版本中途连续发生多次下载错误后才会退出程序。
import itertools #允许最大连续数量的下载的错误 max_errors=5 #目前连续下载错误的数量 num_errors=0 for page in itertools.count(1): url='http://example.webscrapping.com/view/-%d' %page html=download(url) if html is None: #在这个网页上尝试下载收到的错误信息 num_errors+=1 if num_errors==max_errors: break else: #能够成功爬取结果 num_errors=0
3.链接爬虫
使用正则表达式来确定需要下载哪些页面。
(1)使用正则表达式确定需要下载的页面。但是该链接只有网页的路径部分,没有协议和服务器部分,也就是这是一个相对链接,浏览器知道你在浏览哪个网页, 所以在浏览器浏览时, 相对链接是能够正常工作的。但 是,urllib2是无法获知上下文的。
import re def link_crawl(seed_url,link_regex): crawl_queue=[seed_url] while crawl_queue: url=crawl_queue.pop() html=download(url) #匹配正则表达式 for link in get_links(html): if re.match(link_regex,link): crawl_queue.append(link) def get_links(html): webpage_regex=re.compile('<a[^>]+href=["\'](.*?)["\']',re.IGNORECASE) return webpage_regex.findall(html)
(2)存储已发现URL的功能,避免重复爬取相同的链接
import re import urlparse def link_crawler(seed_url,link_regex): crawl_queue=[seed_url] #保持跟踪哪个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)