python3 urlllib爬虫练习--通过链接爬虫

 Pala   2017-10-14 14:20   60 人阅读   条评论

上一篇文章:python3 urlllib爬虫练习--通过遍历网页id来下载网页

本章通过模拟蜘蛛爬行的方法,将网页上的链接记录下来,再爬行。

from urllib import request
from urllib import error
from urllib import parse
import re
# 下载页面
def download(url, user_agent='wswp', num_retries=2):
    print('Download:', url)
    headers = {'user_agent': user_agent}
    requ = request.Request(url, headers=headers)
    try:
        html = request.urlopen(requ).read()
    # 捕捉错误
    except error.URLError as e:
        print('Download error:', e.reason)
        html = None
        # 循环次数
        if num_retries > 0:
            # 获取网页状态码
            if hasattr(e, 'code'):
                # 状态码是5xx 是服务器端问题,如果是4xx,是请求存在问题。
                if 500 <= e.code <= 600:
                    num_retries -= 1
                    # 使用递归
                    return download(url, num_retries)
    return html
    
# 爬取页面中链接
def link_crawler(seed_url, 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):
            print(link)
            if re.match(link_regex, link):
                # 拼接url,因为网页得到链接是相对路径
                link = parse.urljoin(seed_url, link)
                if link not in seen:
                    # 把链接存入到list和set()中
                    seen.add(link)
                    crawl_queue.append(link)
# 提取页面的链接
def get_links(html):
    # 通过正则提取链接
    pattern = '<a[^>]+href=["\'](.*?)["\']'
    # re.IGNORECASE 忽略大小写
    webpage_regex = re.compile(pattern, re.IGNORECASE)
    # 查找网页中所有链接
    # 改变网页的编码
    urls = webpage_regex.findall(html.decode('utf-8'))
    print(urls)
    return urls
print(link_crawler('http://example.webscraping.com/', "(/index|view)"))


本文地址:http://chenxm.cc/post/385.html
版权声明:本文为原创文章,版权归 Pala 所有,欢迎分享本文,转载请保留出处!