python爬虫读书笔记(2)

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)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值