IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 论用多线程爬内容的效率 -> 正文阅读

[Python知识库]论用多线程爬内容的效率

多线程爬取小说

例子:
网站:https://www.17k.com/
随便找个小说爬
在这里插入图片描述
代码:
这是用佛如循环一个一个的爬取

import time
from concurrent.futures import ThreadPoolExecutor
from lxml import etree
import requests
url ="https://www.17k.com/list/3379384.html"
resq = requests.get(url)
resq.encoding = "utf-8"
ht = resq.text   
ee= etree.HTML(ht)
nr = ee.xpath("/html/body/div[5]/dl/dd/a/@href")
url1 ="https://www.17k.com"
def getwz(surl):
    resq1 = requests.get(surl)
    resq1.encoding = "utf-8"
    nr1 = resq1.text
    ee1 = etree.HTML(nr1)
    wz = ee1.xpath("//*[@id='readArea']/div[1]/div[2]/p/text()")
    print(wz)
t1= time.time()
for urll in nr:
    surl =url1+urll
    getwz(surl)

t2 = time.time()
print(t2-t1)#这是测试时间

这是上面的运行时间
在这里插入图片描述
可以看到效率是极其低下的

另一种

下面是利用线程池创建多个线程进行爬取

import time
from concurrent.futures import ThreadPoolExecutor   #创建线程池所需的模块
from lxml import etree
import requests
url ="https://www.17k.com/list/3379384.html"
resq = requests.get(url)
resq.encoding = "utf-8"
ht = resq.text

ee= etree.HTML(ht)
nr = ee.xpath("/html/body/div[5]/dl/dd/a/@href")
url1 ="https://www.17k.com"
def getwz(surl):
    resq1 = requests.get(surl)
    resq1.encoding = "utf-8"
    nr1 = resq1.text
    ee1 = etree.HTML(nr1)
    wz = ee1.xpath("//*[@id='readArea']/div[1]/div[2]/p/text()")
    print(wz)
if __name__ == '__main__':
    t1=time.time()
    with ThreadPoolExecutor(50) as t:   #创建线程池的格式,50是代表这个线程池有50个线程

        for urll in nr:      
            surl = url1 + urll
            t.submit(getwz,surl)  #让对象t去调用函数  这样多个函数同时进行效率高
    t2= time.time()
print(t2-t1)

0.9097669124603271
这是程序运行时间,可以看出效率高了很多

用异步操作爬取

并将内容存入文件
代码:

import asyncio
import aiohttp
import requests
from lxml import etree
url ="https://www.17k.com/list/3379384.html"
resq = requests.get(url)
resq.encoding = "utf-8"
ht = resq.text

ee= etree.HTML(ht)
nr = ee.xpath("/html/body/div[5]/dl/dd/a/@href")
url1 ="https://www.17k.com"
async  def getwz(surl):
   async with aiohttp.ClientSession() as session:
       async with session.get(surl) as resq:
           resq.encoding="utf-8"
           nr1 = await resq.text()
           ee1 =etree.HTML(nr1)
           name = ee1.xpath('//*[@id="readArea"]/div[1]/h1/text()')  #文章题目
           name1 = ''.join(name)  #将列表转化成字符串


           nr2 = ee1.xpath("//*[@id='readArea']/div[1]/div[2]/p/text()")
           nr3= ''.join(nr2)   #文章内容

           with open(name1+".txt", mode="w",encoding="utf-8") as f:
               f.write(nr3)  #写入
           

async def main():
    tasks=[]
    for urll in nr:
        surl = url1 + urll
        tasks.append(asyncio.create_task(getwz(surl)))

    await asyncio.wait(tasks)

if __name__ == '__main__':
    asyncio.run(main())
if __name__ == '__main__':
    asyncio.run(main())

爬取的效率也很快

总结

多线程爬取和与异步操作爬取效率很高

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:00:43  更:2022-01-16 13:01:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:46:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码