利用python写爬虫的人越来越多,这也表明了用python写爬虫相比其它语言用起来更方便一些。很多新闻网站都没有反爬虫的策略,所以爬取新闻网站的数据就更加方便。但是,新闻网站多如牛毛,我们该如何去爬呢?从哪里开爬呢?是我们需要首先考虑的问题。

你需要的是异步IO实现一个高效率的爬虫。

下面我们就来看看Python3 基于asyncio的新闻爬虫,我们如何去高效地实现它。

Python3.5开始,加入了新的语法,async和await这两个关键字,asyncio也成了标准库,这对于我们写异步IO的程序来说就是如虎添翼,让我们轻而易举的实现一个定向抓取新闻的异步爬虫。

1. 异步爬虫依赖的模块

asyncio: 标准异步模块,实现python的异步机制;

uvloop:一个用C开发的异步循环模块,大大提高异步机制的效率;

aiohttp: 一个异步http请求的模块,用于下载网页;

urllib.parse: 解析url网站的模块;

logging: 记录爬虫日志;

leveldb: Google的Key-Value数据库,用以记录url的状态;

farmhash: 对url进行hash计算作为url的唯一标识;

sanicdb: 对aiomysql的封装,更方便的进行数据库mysql操作;

2. 异步爬虫实现的流程

2.1 新闻源列表

本文要实现的异步爬虫是一个定向抓取新闻网站的爬虫,所以就需要管理一个定向源列表,这个源列表记录了很多我们想要抓取的新闻网站的url,这些url指向的网页叫做hub网页,它们有如下特点:

它们是网站首页、频道首页、最新列表等等;

它们包含非常多的新闻页面的链接;

它们经常被网站更新,以包含最新的新闻链接;

它们不是包含新闻内容的新闻页面;

Hub网页就是爬虫抓取的起点,爬虫从中提取新闻页面的链接再进行抓取。Hub网址可以保存在MySQL数据库中,运维可以随时添加、删除这个列表;爬虫定时读取这个列表来更新定向抓取的任务。这就需要爬虫中有一个循环来定时读取hub网址。

2.2 网址池

异步爬虫的所有流程不能单单用一个循环来完成,它是多个循环(至少两个)相互作用共同完成的。它们相互作用的桥梁就是“网址池”(用asyncio.Queue来实现)。

这个网址池就是我们比较熟悉的“生产者-消费者”模式。

一方面,hub网址隔段时间就要进入网址池,爬虫从网页提取到的新闻链接也有进入到网址池,这是生产网址的过程;

另一方面,爬虫要从网址池中取出网址进行下载,这个过程是消费过程;

两个过程相互配合,就有url不断的进进出出网址池。

2.3 数据库

这里面用到了两个数据库:MySQL和Leveldb。前者用于保存hub网址、下载的网页;后者用于存储所有url的状态(是否抓取成功)。

从网页提取到的很多链接可能已经被抓取过了,就不必再进行抓取,所以他们在进入网址池前就要被检查一下,通过leveldb可以快速查看其状态。

3. 异步爬虫的实现细节

前面的爬虫流程中提到两个循环:

循环一:定时更新hub网站列表

async defloop_get_urls(self,):print('loop_get_urls() start')while 1:

await self.get_urls()#从MySQL读取hub列表并将hub url放入queue

await asyncio.sleep(50)

循环二: 抓取网页的循环

async defloop_crawl(self,):print('loop_crawl() start')

last_rating_time=time.time()

asyncio.ensure_future(self.loop_get_urls())

counter=0while 1:

item=await self.queue.get()

url, ishub=item

self._workers+= 1counter+= 1asyncio.ensure_future(self.process(url, ishub))

span= time.time() -last_rating_timeif span > 3:

rate= counter /spanprint('\tloop_crawl2() rate:%s, counter: %s, workers: %s' % (round(rate, 2), counter, self._workers))

last_rating_time=time.time()

counter=0if self._workers >self.workers_max:print('====== got workers_max, sleep 3 sec to next worker =====')

await asyncio.sleep(3)

4. asyncio 要点:

读读asyncio的文档就可以知道它的运行流程,这里分享一下使用时注意到的地方。

(1)使用loop.run_until_complete(self.loop_crawl())来启动整个程序的主循环;

(2)使用asyncio.ensure_future() 来异步调用一个函数,它相当于多进程的fork,gevent的spawn(),具体可以参考上述代码。

文章首发于我的技术博客猿人学Python基础教程

新闻爬虫步骤python_抓取新闻网站:异步爬虫实现的流程和细节相关推荐

  1. python爬取新闻网站内容_python爬虫案例:抓取网易新闻

    此文属于入门级级别的爬虫,老司机们就不用看了. 本次主要是爬取网易新闻,包括新闻标题.作者.来源.发布时间.新闻正文. 首先我们打开163的网站,我们随意选择一个分类,这里我选的分类是国内新闻.然后鼠 ...

  2. python爬虫案例:抓取网易新闻

    此文属于入门级级别的爬虫,老司机们就不用看了. 本次主要是爬取网易新闻,包括新闻标题.作者.来源.发布时间.新闻正文. 首先我们打开163的网站,我们随意选择一个分类,这里我选的分类是国内新闻.然后鼠 ...

  3. 通过Python爬虫按关键词抓取相关的新闻

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途 如今各大网站的反爬机制已经可以说是到了丧心病狂的程度,比如大众点评的字符加密.微博的登录验证等.相比较而言,新闻网站的反爬机制 ...

  4. python爬虫关键词抓手机号_通过Python爬虫按关键词抓取相关的新闻

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 如今各大网站的反爬机制已经可以说是到了丧心病狂的程度,比如大众点评的字符加 ...

  5. springboot+jsoup抓取新闻网站信息

    springboot+jsoup抓取新闻网站信息 步骤: 一.导入jar包 二.解析凤凰网新闻 jsoup获取动态生成的js内容 service serviceImpl mapper domian 步 ...

  6. 逆向爬虫18 Scrapy抓取全站数据和Redis入门

    逆向爬虫18 Scrapy抓取全站数据和Redis入门 一.全站数据抓取 1. 什么是抓取全站数据? 我们曾经在过猪八戒,图片之家,BOSS直聘等网站,利用网站官方提供的搜索功能,搜索指定关键词的内容 ...

  7. 利用Crowbar抓取网页异步加载的内容 [Python俱乐部]

    利用Crowbar抓取网页异步加载的内容 [Python俱乐部] 利用Crowbar抓取网页异步加载的内容 [Python俱乐部] 利用Crowbar抓取网页异步加载的内容 在做 Web 信息提取.数 ...

  8. python frame框架抓取_Python抓取框架Scrapy爬虫入门:页面提取

    前言 Scrapy是一个非常好的抓取框架,它不仅提供了一些开箱可用的基础组建,还能够根据自己的需求,进行强大的自定义.本文主要给大家介绍了关于Python抓取框架Scrapy之页面提取的相关内容,分享 ...

  9. 某商标局公告抓取思路总结爬虫过无限debugger Js逆向调试

    某商标局公告抓取思路总结爬虫过无限debugger @[TOC](某商标局公告抓取思路总结爬虫过无限debugger) 目标地址:aHR0cDovL3dzZ2cuc2JqLmNuaXBhLmdvdi5 ...

最新文章

  1. Sql Server系列:数据库操作
  2. DataSet转换为实体(函数)
  3. Serverless在编程教育中的实践
  4. 实验7.2 二维数组 7-6 方阵循环右移
  5. python循环经典例题_python练习题:循环打印嵌套列表
  6. 实战scrapy-爬取红袖添香前20页小说
  7. API、H5跟风控相关的知识是否了解?
  8. 百度DuerOS与高通合推手机语音交互解决方案,谁会欢喜谁要愁?
  9. OpenCV精进之路(一):图像处理知识点串烧
  10. NYOJ41 - 三个数从小到大排序
  11. linux夸分区建立软链接,Linux硬链接和软链接
  12. ARKit入门到精通-1.5 -基础内容-史小川-专题视频课程
  13. JS生成 UUID的方法
  14. 家谱制作软件如何下载及安装
  15. arcsinx用计算机怎么按,数学arcsinx和arccosx怎么用公 – 手机爱问
  16. 【产品】蓝绿发布、滚动发布和灰度发布对比
  17. 最新BBS上的变态网名大全
  18. 【YOLOV5-5.x 源码解读】plots.py
  19. android 找不到手机,找不到 Android 开发者选项,难道我的手机系统没有?| 有轻功 #290...
  20. 基于JAVAWeb美食网站设计计算机毕业设计源码+数据库+lw文档+系统+部署

热门文章

  1. 技术开发人员为什么会无奈苦逼?
  2. 苏宁商品详情API接口(商品详情页面数据接口)
  3. matlab2019使用仿真,光学仿真matlab中的handles怎么用 终于明白了
  4. Python语言更适合低代码开发平台
  5. 重走长征路---OI每周刷题记录---8月16日 2014
  6. BUUCTF [极客大挑战 2019] PHP
  7. 情态动词学习笔记(1) 表推测
  8. MATLAB二维平面绘图
  9. 一个程序员该有的自我修养
  10. 学会NI-DAQmx10个函数,解决80%的数据采集应用问题