python协程池爬虫_Python之协程爬虫 小说网协程爬虫案例
在Gevent协程的使用中我们已经学会简单的使用协程,这篇文章我们通过协程爬虫来测试一下具体的效果。Gevent遇到IO阻塞时会自动切换任务:
from gevent import monkey
monkey.patch_all() #
import gevent
from urllib.request import urlopen
def f(url):
print('GET: %s' % url)
resp = urlopen(url)
data = resp.read()
print('%d bytes received from %s.' % (len(data), url))
gevent.joinall([
gevent.spawn(f, 'https://www.python.org/'),
gevent.spawn(f, 'https://www.baidu.com/'),
gevent.spawn(f, 'https://www.e1yu.com/'),
])
基于以上代码,我们使用协程来抓取小说网:https://www.17k.com/all,网页的分析这里不过多介绍,主要是如何使用协程:
from gevent import monkey
monkey.patch_all()
from lxml import etree
import gevent
import requests
import time
def get_all_url(url,headers):
res=requests.get(url,headers)
tree=etree.HTML(res.text)
for i in tree.xpath('//tr[@class="bg0"]'):
item={}
item['cate']=i.xpath('./td[2]/a/text()')[0]
item['title']=i.xpath('./td[3]/span/a/text()')[0]
item['href']=i.xpath('./td[3]/span/a/@href')[0].lstrip('//')
item['count']=i.xpath('./td[5]/text()')[0]
item['author']=i.xpath('./td[6]/a/text()')[0]
item['date']=i.xpath('./td[7]/text()')[0]
item['fz']=i.xpath('./td[8]/em/text()')[0].split()[0]
#print(item)
# 构造翻页的URL请求,返回一个url列表
def get_url_list():
url_list = []
for i in range(1, 330):
url = 'https://www.17k.com/all/book/2_0_0_0_0_0_0_0_{0}.html'.format(i)
url_list.append(url)
return url_list
# 协程请求耗时
def gevent_get():
begin_time = time.time()
g_list = []
for k in get_url_list():
s = gevent.spawn(get_all_url, k, headers)
g_list.append(s)
gevent.joinall(g_list)
end_time = time.time()
print('gevent cost:%s' % str(end_time - begin_time))
# 普通请求耗时
def ordinary_get():
begin_time = time.time()
for k in get_url_list():
get_all_url(k,headers)
end_time = time.time()
print('ordinary cost:%s' % str(end_time - begin_time))
if __name__ == '__main__':
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0"
}
gevent_get()
ordinary_get()
# gevent cost:17.533002614974976
# ordinary cost:47.7977340221405
通过以上代码,可以发现,协程的效率大约是普通的2倍左右,主要就是测试一下协程的效率,没有抓取小说的详情页,可以自己试着修改一下,练习一下!
未经允许不得转载:作者:鳄鱼君,
转载或复制请以 超链接形式 并注明出处 鳄鱼君。
python协程池爬虫_Python之协程爬虫 小说网协程爬虫案例相关推荐
- python通过ip池爬_python爬虫18 | 就算你被封了也能继续爬,使用IP代理池伪装你的IP地址,让IP飘一会...
我们上次说了伪装头部 ↓ 让自己的 python 爬虫假装是浏览器 小帅b主要是想让你知道 在爬取网站的时候 要多的站在对方的角度想问题 其实 这和泡妞差不多 你要多站在妹纸的角度思考 她的兴趣是什么 ...
- python通过ip池爬_python 爬虫 代理ip池(适合初学者)
初次学习python爬虫的朋友在频繁访问被爬取页面网站时都会被拦截,也就是限制ip.这里教教大家建立代理ip池. #!/usr/bin/env python3# -*- coding: utf-8 - ...
- python通过ip池爬_Python爬虫 | IP池的使用
一.简介 爬虫中为什么需要使用代理 一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会禁止这个IP的访问.所以我们需要设 ...
- python 小说爬虫_Python实现的爬取小说爬虫功能示例
本文实例讲述了Python实现的爬取小说爬虫功能.分享给大家供大家参考,具体如下: 想把顶点小说网上的一篇持续更新的小说下下来,就写了一个简单的爬虫,可以爬取爬取各个章节的内容,保存到txt文档中,支 ...
- python并行计算进程池通信_Python使用进程池管理进程和进程间通信
与线程池类似的是,如果程序需要启动多个进程,也可以使用进程池来管理进程.程序可以通过 multiprocessing 模块的 Pool() 函数创建进程池,进程池实际上是 multiprocessin ...
- nodejs爬虫与python爬虫_Python,Node.js 哪个比较适合写爬虫?
主要看你定义的"爬虫"干什么用. 1.如果是定向爬取几个页面,做一些简单的页面解析,爬取效率不是核心要求,那么用什么语言差异不大. 当然要是页面结构复杂,正则表达式写得巨复杂,尤其 ...
- 连接池和协程池为何能提升并发能力?
你有没有发现,"内存池"和"进程池"都带有"池"字?其实,这两种技术都属于"池化技术".它通常是由系统预先分配一批资源并 ...
- Golang并发模型:轻松入门协程池
goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...
- 白话 Golang 协程池
文章目录 1.何为并发 2.并发的好处 3.Go 如何并发 4.G-P-M 调度模型 5.Go 程的代价 6.协程池的作用 7.简易协程池的设计&实现 8.开源协程池的使用 9.小结 参考文献 ...
最新文章
- mysql语句优化百条_优化mysql语句
- 使用多尺度空间注意力的语义分割方法
- mysql根据字段长度查询_SQL语句如何查询某一字符串字段长度等于某个值的所有记录...
- MOSS 权限管理总结
- 编程入门python语言是多大孩子学的-包头孩子学编程python好吗
- MongoDB 查询超时异常 SocketTimeoutException
- Delphi的内存管理及内存泄露问题
- go语言有哪些劣势?
- Web 安全漏洞之 XSS 攻击,Java 开发必看!
- 台式机自动关机+自动重启问题
- OceanBase在蚂蚁金服的智能运维实践之路
- canvas笔记-canvas加载图片及放缩及加水印(两canvas同时使用)
- 【转载】NBU异机恢复oracle
- 如何更改java应用程序标题栏默认图标
- linux ssh 免密登陆
- 信息收集端口扫描工具masscan
- 项目一. 家庭记账软件
- 查看当前目录和上一级目录的命令
- AMetal平台学习——初步了解篇
- 【开发工具】SVN断网续传、续下解决办法