文章目录

  • 单线程爬取
  • 多线程爬取
  • 异步协程爬取

本文运用了三种方式爬取一整部小说,分别运用了单线程爬取,多线程爬取和异步协程爬取。
小说网址:`

http://www.doupo321.com/doupocangqiong/`

网页很简单,也不用过多分析,内容都在网页源代码中,就是一个多级链接爬虫,步骤就是先爬取到网页下的子链接,然后通过子链接爬取到每章小说内容。
因为这个网页的源代码都很规整,所有我们用xpath来匹配,当然你熟悉正则或者bs4也可以用bs4来匹配。然后我们就开始写代码吧。

单线程爬取

# @Time:2022/1/1312:04
# @Author:中意灬
# @File:斗破2.py
# @ps:tutu qqnum:2117472285
import time
import requests
from lxml import etree
def download(url,title):#下载内容resp=requests.get(url)resp.encoding='utf-8'html=resp.texttree=etree.HTML(html)body = tree.xpath("/html/body/div/div/div[4]/p/text()")body = '\n'.join(body)with open(f'斗破2/{title}.txt',mode='w',encoding='utf-8')as f:f.write(body)
def geturl(url):#获取子链接resp=requests.get(url)resp.encoding='utf-8'html=resp.texttree=etree.HTML(html)lis=tree.xpath("/html/body/div[1]/div[2]/div[1]/div[3]/div[2]/ul/li")for li in lis:href=li.xpath("./a/@href")[0].strip('//')href="http://"+hreftitle=li.xpath("./a/text()")[0]download(href,title)
if __name__ == '__main__':url="http://www.doupo321.com/doupocangqiong/"t1=time.time()geturl(url)t2=time.time()print("耗时:",t2-t1)

运行结果:

多线程爬取

# @Time:2022/1/1311:42
# @Author:中意灬
# @File:斗破1.py
# @ps:tutu qqnum:2117472285
import time
import requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
def download(url,title):resp=requests.get(url)resp.encoding='utf-8'html=resp.texttree=etree.HTML(html)body = tree.xpath("/html/body/div/div/div[4]/p/text()")body = '\n'.join(body)with open(f'斗破1/{title}.txt',mode='w',encoding='utf-8')as f:f.write(body)
def geturl(url):resp = requests.get(url)resp.encoding = 'utf-8'html = resp.texttree = etree.HTML(html)lis = tree.xpath("/html/body/div[1]/div[2]/div[1]/div[3]/div[2]/ul/li")return lisif __name__ == '__main__':url="http://www.doupo321.com/doupocangqiong/"t1=time.time()lis=geturl(url)with ThreadPoolExecutor(1000)as t:#创建线程池,有1000个线程for li in lis:href = li.xpath("./a/@href")[0].strip('//')href = "http://" + hreftitle = li.xpath("./a/text()")[0]t.submit(download,url=href,title=title)t2=time.time()print("耗时:",t2-t1)

运行结果:

异步协程爬取

# @Time:2022/1/1310:30
# @Author:中意灬
# @File:斗破.py
# @ps:tutu qqnum:2117472285
import requests
import aiohttp
import asyncio
import aiofiles
from lxml import etree
import time
async def download(url,title,session):async with session.get(url) as resp:#resp=requst.get()html= await resp.text()tree=etree.HTML(html)body=tree.xpath("/html/body/div/div/div[4]/p/text()")body='\n'.join(body)async with aiofiles.open(f'斗破/{title}.txt',mode='w',encoding='utf-8')as f:#保存下载内容await f.write(body)async def geturl(url):resp=requests.get(url)resp.encoding='utf-8'html=resp.texttree=etree.HTML(html)lis=tree.xpath("/html/body/div[1]/div[2]/div[1]/div[3]/div[2]/ul/li")tasks=[]async with aiohttp.ClientSession() as session:#requestfor li in lis:href=li.xpath("./a/@href")[0].strip('//')href="http://"+hreftitle=li.xpath("./a/text()")[0]# 插入异步操作tasks.append(asyncio.create_task(download(href,title,session)))await asyncio.wait(tasks)
if __name__ == '__main__':url="http://www.doupo321.com/doupocangqiong/"t1=time.time()loop = asyncio.get_event_loop()loop.run_until_complete(geturl(url))t2=time.time()print("耗时:",t2-t1)

运行结果:


因为没有进行排序,所以爬取出来的章节都是乱序的,大家可以写爬虫的时候里面自己设置一下标题,这样爬取出来的顺序就可能是有序的了。
我们可以看出,用多线程,仅仅5秒就扒完了一部1600多章的小说,但是多线程会对系统的开销较大;如果用异步协程,爬取速度会稍微慢些,需要大概20多秒,但是对系统开销较小,建议大家采用异步协程的方式,但是用单线程去爬取会慢很多,扒完一部小说耗时需要9分多钟,不是很推荐。

Python分别用单线程,多线程,异步协程爬取一部小说,最快仅需要5s相关推荐

  1. python异步协程爬取百度小说之西游记

    爬虫百度小说之西游记 参考文章链接:https://blog.csdn.net/weixin_45788900/article/details/119539952 一.百度小说之西游记网址:小说网址 ...

  2. Python爬虫——aiohttp异步协程爬取同程旅行酒店评论

    大家好!我是霖hero Python并发编程有三种方式:多线程(Threading).多进程(Process).协程(Coroutine),使用并发编程会大大提高程序的效率,今天我们将学习如何选择多线 ...

  3. 送书 | aiohttp异步协程爬取同程旅行酒店评论并作词云图

    大家好!我是啃书君! Python并发编程有三种方式:多线程(Threading).多进程(Process).协程(Coroutine),使用并发编程会大大提高程序的效率,今天我们将学习如何选择多线程 ...

  4. python爬虫 asyncio aiohttp aiofiles 单线程多任务异步协程爬取图片

    python爬虫 asyncio aiohttp aiofiles 多任务异步协程爬取图片 main.py """=== coding: UTF8 ==="&q ...

  5. 链家网开源java_异步协程爬取链家租房信息

    异步协程抓取链家数据+pandas写入csv import asyncio import aiohttp import pandas from bs4 import BeautifulSoup fro ...

  6. Python初级爬虫(利用多任务协程爬取虎牙MM图片)

    Python多任务协程下载虎牙直播MM图片 # coding = utf-8 import re import gevent from gevent import monkey, pool impor ...

  7. 爬虫的单线程+多任务异步协程:asyncio 3.6

    单线程+多任务异步协程:asyncio 3.6 事件循环 无限循环的对象.事件循环中最终需要将一些 特殊的函数(被async关键字修饰的函数) 注册在该对象中. 协程 本质上是一个对象.可以把协程对象 ...

  8. 爬虫第四章 单线程+多任务异步协程

    单线程+多任务异步协程: asyncio 事件循环 loop: 无限循环的对象,事件循环中最终需要将一些特殊的函数注册到该事件循环中特殊的函数: 被ansyc关键字修饰的函数协程: 本质上是一个对象, ...

  9. python从网址爬图片协程_Python爬虫多任务协程爬取虎牙MM图片

    查看: 4420|回复: 241 [作品展示] Python爬虫多任务协程爬取虎牙MM图片 电梯直达 发表于 2019-4-17 21:35:47 | 只看该作者 |倒序浏览 |阅读模式 马上注册,结 ...

最新文章

  1. 一个类型思考了 8 年,依旧是最好的! | 每日趣闻
  2. matlab int8 矩阵,unit8_matlab数据类型转换——int8转换成unit8
  3. ant 合并 jar
  4. Nacos源码覆盖实例列表
  5. 流行的AJAX框架对比:jQuery,Mootools,Dojo,Ext JS
  6. C ++ 指针 | 指针的详细概念和使用_1
  7. php中国天气api接口,免费天气预报API接口使用教程(信息来源权威及时)
  8. 18-CSS问题-让多个div横排显示并设置间距解决方案
  9. java 易错题_java错题集(1-3)
  10. sharepoint 2013 excel services浏览excel文件 未能下载图表或图像
  11. 赵望野:前端工程师的困惑
  12. APP逆向之易班(第一篇)
  13. 【Maven】---Linux搭建Nexus3.X私服
  14. 论文写作注意事项(格式)
  15. stata 入门(双重差分模型)
  16. Raptor-寻找1000以内完数
  17. 前端实战复习——歌词滚动
  18. canvas转图片,print-js实现打印
  19. java 100以内的整数和_java计算100以内的正整数和的三种方法
  20. 快手小程序模板_快手小程序模板平台制作

热门文章

  1. 国耀明医互联网医院: 白露吃什么好 白露食疗方
  2. Win10解决:系统管理员已阻止你运行此应用
  3. Cursor攻略,吃个螃蟹
  4. iOS 添加自定义字体
  5. I/Q数据频谱分析仪简介
  6. CTF新生赛之Writeup
  7. 谷歌AI聊天机器人Bard答错问题,股价大跌7.4%;淘宝屏蔽ChatGPT;孟晚舟4月将首次当值华为轮值董事长丨每日大事件...
  8. echarts自定义地图总结(VUE)
  9. 这社会并不是靠努力和辛苦赚钱的
  10. 苹果平板电脑服务器已停止响应,苹果平板电脑ipad完全死机怎么办【解决方法】...