千家信息网

大规模异步新闻爬虫中如何实现一个更好的网络请求函数

发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,这篇文章将为大家详细讲解有关大规模异步新闻爬虫中如何实现一个更好的网络请求函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。downloader 的实现import
千家信息网最后更新 2025年02月22日大规模异步新闻爬虫中如何实现一个更好的网络请求函数

这篇文章将为大家详细讲解有关大规模异步新闻爬虫中如何实现一个更好的网络请求函数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

downloader 的实现

import requestsimport cchardetimport tracebackdef downloader(url, timeout=10, headers=None, debug=False, binary=False):    _headers = {        'User-Agent': ('Mozilla/5.0 (compatible; MSIE 9.0; '                       'Windows NT 6.1; Win64; x64; Trident/5.0)'),    }    redirected_url = url    if headers:        _headers = headers    try:        r = requests.get(url, headers=_headers, timeout=timeout)        if binary:            html = r.content        else:            encoding = cchardet.detect(r.content)['encoding']            html = r.content.decode(encoding)        status = r.status_code        redirected_url = r.url    except:        if debug:            traceback.print_exc()        msg = 'failed download: {}'.format(url)        print(msg)        if binary:            html = b''        else:            html = ''        status = 0    return status, html, redirected_urlif __name__ == '__main__':    url = 'http://news.baidu.com/'    s, html = downloader(url)    print(s, len(html))

这个downloader()函数,内置了默认的User-Agent模拟成一个IE9浏览器,同时接受调用者自定义的headers和timeout。使用cchardet来处理编码问题,返回数据包括:

  • 状态码:如果出现异常,设置为0

  • 内容: 默认返回str内容。但是URL链接的是图片等二进制内容时,注意调用时要设binary=True

  • 重定向URL: 有些URL会被重定向,最终页面的url包含在响应对象里面

新闻URL的清洗

我们先看看这两个新闻网址:

http://xinwen.eastday.com/a/n181106070849091.html?qid=news.baidu.com

http://news.ifeng.com/a/20181106/60146589_0.shtml?_zbs_baidu_news

上面两个带?的网站来自百度新闻的首页,这个问号?的作用就是告诉目标服务器,这个网址是从百度新闻链接过来的,是百度带过来的流量。但是它们的表示方式不完全一样,一个是qid=news.baidu.com, 一个是_zbs_baidu_news。这有可能是目标服务器要求的格式不同导致的,这个在目标服务器的后台的浏览统计程序中可能用得到。

然后去掉问号?及其后面的字符,发现它们和不去掉指向的是相同的新闻网页。

从字符串对比上看,有问号和没问号是两个不同的网址,但是它们又指向完全相同的新闻网页,说明问号后面的参数对响应内容没有任何影响。

正在抓取新闻的大量实践后,我们发现了这样的规律:

新闻类网址都做了大量SEO,它们把新闻网址都静态化了,基本上都是以.html, .htm, .shtml等结尾,后面再加任何请求参数都无济于事。

但是,还是会有些新闻网站以参数id的形式动态获取新闻网页。

那么我们抓取新闻时,就要利用这个规律,防止重复抓取。由此,我们实现一个清洗网址的函数。

g_bin_postfix = set([    'exe', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx',    'pdf',    'jpg', 'png', 'bmp', 'jpeg', 'gif',    'zip', 'rar', 'tar', 'bz2', '7z', 'gz',    'flv', 'mp4', 'avi', 'wmv', 'mkv',    'apk',])g_news_postfix = [    '.html?', '.htm?', '.shtml?',    '.shtm?',]def clean_url(url):    # 1. 是否为合法的http url    if not url.startswith('http'):        return ''    # 2. 去掉静态化url后面的参数    for np in g_news_postfix:        p = url.find(np)        if p > -1:            p = url.find('?')            url = url[:p]            return url    # 3. 不下载二进制类内容的链接    up = urlparse.urlparse(url)    path = up.path    if not path:        path = '/'    postfix = path.split('.')[-1].lower()    if postfix in g_bin_postfix:        return ''    # 4. 去掉标识流量来源的参数    # badquery = ['spm', 'utm_source', 'utm_source', 'utm_medium', 'utm_campaign']    good_queries = []    for query in up.query.split('&'):        qv = query.split('=')        if qv[0].startswith('spm') or qv[0].startswith('utm_'):            continue        if len(qv) == 1:            continue        good_queries.append(query)    query = '&'.join(good_queries)    url = urlparse.urlunparse((        up.scheme,        up.netloc,        path,        up.params,        query,        ''  #  crawler do not care fragment    ))    return url

清洗url的方法都在代码的注释里面了,这里面包含了两类操作:

  • 判断是否合法url,非法的直接返回空字符串

  • 去掉不必要的参数,去掉静态化url的参数

网络爬虫知识点

1. URL清洗

网络请求开始之前,先把url清洗一遍,可以避免重复下载、无效下载(二进制内容),节省服务器和网络开销。

2. cchardet 模块

该模块是chardet的升级版,功能和chardet完全一样,用来检测一个字符串的编码。由于是用C和C++实现的,所以它的速度非常快,非常适合在爬虫中用来判断网页的编码。
切记,不要相信requests返回的encoding,自己判断一下更放心。上一节,我们已经列举了一个例子来证明requests对编码识别的错误,如果忘了的话,可以再去回顾一下。

3. traceback 模块

我们写的爬虫在运行过程中,会出现各种异常,而且有些异常是不可预期的,也不知道它会出现在什么地方,我们就需要用try来捕获异常让程序不中断,但是我们又需要看看捕获的异常是什么内容,由此来改善我们的爬虫。这个时候,就需要traceback模块。
比如在downloader()函数里面我们用try捕获了get()的异常,但是,异常也有可能是cchardet.detect()引起的,用traceback.print_exc()来输出异常,有助于我们发现更多问题。

关于"大规模异步新闻爬虫中如何实现一个更好的网络请求函数"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

新闻 内容 参数 爬虫 网址 函数 网络 问号 清洗 服务器 模块 编码 网页 服务 两个 二进制 字符 更多 目标 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发公司任务管理制度 access数据库如何做服务器 服务器c盘空间调整大小 网络安全精心守护征文 数据库 当天时间 小米开启查找手机提示服务器出错 吃鸡一直提示无法连接服务器 小公司一般多少台服务器 图计算 数据库软件有哪些 南京新品服务器服务商 违反网络安全法处罚多少钱 众盛云互联网计算机科技 桐乡网络技术培训机构 互联网 科技创业设计大赛 无锡百特网络技术有限公司 数据库安装没快捷图标 凯达网络技术服务有限公司 计算机三级网络技术视频课 如何使用国际服务器域名 株洲java软件开发培训学费 软件开发都是怎么面试的 手机软件开发用什么语言 软件开发外包可耻吗 总显示未安装sql数据库 广州科学园软件开发 数据库的信息有用吗 pubg服务器切换欧服 为什么未来之役连不上服务器 工业控制网络技术题库 香港高防服务器是干嘛用的
0