Python爬虫

人生不得已——Python爬虫 链接爬虫

2018-11-03  本文已影响11人  阿猫阿狗py

链接爬虫

模拟用户点击链接,下载页面。

特点:只要足够耐心,可以下载到整个网站的所有页面。
缺点:会下载很多无用页面,如果有外链,可能会爬到网站外部。

正则,将非常有用。

import urllib.request
import urllib.parse
import re


def download(url, headers={}, retryCount=5):
    """
    下载页面
    :param url: 要下载的链接
    :param headers: 伪造头
    :param retryCount: 如果是服务器错误,需要尝试的次数
    :return:
    """
    print('download to '+ url)
    # 请求头对象
    request = urllib.request.Request(url, headers=headers)

    try:
        # 返回数据
        response = urllib.request.urlopen(request)
    except urllib.error.URLError as e:
        # 判断是否为服务器错误
        if hasattr(e, 'code') and 500 <= e.code < 600:
            # 重试几次
            if retryCount > 0:
                return download(url, headers, retryCount-1)
            # 最终下载失败
            return None
    return response.read()


def get_link(html):
    """
    得到页面中的链接
    :param html: 页面数据
    :return: 返回链接列表
    """
    webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
    return webpage_regex.findall(html)


def link_spider(start_link, link_regex):
    """
    链接爬虫函数
    :param start_link: 开始下载的链接
    :param link_regex: 需要的部分链接
    :return:
    """
    # 等待下载的链接的列表
    wait_download_link = [start_link]
    # 定义一个集合,用来过滤掉重复的链接
    crawled_link = set()
    while wait_download_link:
        # 从所有等待下载的连接列表中弹出一个链接
        url = wait_download_link.pop()
        # 解析链接
        urlObj = urllib.parse.urlparse(url)
        # 下载url链接的页面
        html = download(url)
        # 如果页面为空,则跳出本次循环重新开始
        if html is None:
            continue
        # 将下载过的链接放入已经下载过的链接集合中
        crawled_link.add(url)
        # 利用正则表达式筛选出页面所有的链接,编码视情况而定
        all_link = get_link(html.decode('utf-8'))
        # 遍历链接
        for link in all_link:
            # 筛选出自己需要的链接
            if re.match(link_regex, link):
                # 得到完整的有用链接
                realUrl = urlObj.scheme + '://' + urlObj.netloc + link
                # 判断链接是否已经下载过
                if realUrl not in crawled_link:
                    wait_download_link.append(realUrl)


link_spider('http://127.0.0.1:8080/places/default/index', '/places/default/view/|/places/default/index/')
上一篇 下一篇

猜你喜欢

热点阅读