【Python】爬虫-----多任务异步处理、异步http获取案例Ⅱ

该博客展示了如何使用Python的aiohttp和lxml库进行异步网络请求和HTML解析。通过创建协程和事件循环,实现批量下载网页内容,并利用XPath提取文本信息,最终将数据写入文件。整个过程涉及到了异步IO和前端网页结构的理解,对于提升爬虫效率和处理大量数据很有帮助。
摘要由CSDN通过智能技术生成
import asyncio
import aiohttp
import requests
from lxml import etree

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}

#异步获取正文链接源代码
async def get_request(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url=url) as response:
            page_text = await response.text('gb18030','ignore') #忽略指定编码,这个网页没办法,必须这么做不然的话会报错
            return  page_text

#回调方法
def a(t):
    page_text = t.result()
    tree = etree.HTML(page_text)
    result = tree.xpath("/html/body/div[3]/div[2]/div[1]/text()")
    a = ''.join(result)
    b = a.replace(' ', "\n")
    for i in range(0,100):
        with open(task_htmlname[i], mode="w") as f:  # 开始下载
         f.write(b.encode("gbk", "ignore").decode("gbk", "ignore"))
        print("已执行完成:", task_htmlname[i])

#获取正文链接
def get_text_html(url):
    resp = requests.get(url)
    resp.encoding='gbk'    #设置编码,这个网页没办法,必须这么做不然的话会报错
    tree = etree.HTML(resp.text)
    result = tree.xpath("/html/body/div[4]/dl/dd/a/@href")
    result_name = tree.xpath("/html/body/div[4]/dl/dd/a/text()")
    for i in range(0,100):
        html = f"https://www.qb5.tw/book_51585/{result[i]}" #合并正文链接
        html_name = result_name[i]+'.txt'                               #组成文件名
        task_html.append(html)
        task_htmlname.append(html_name)


if __name__ == '__main__':
    url_html = 'https://www.qb5.tw/book_51585/'
    task_html = []              #正文网页链接
    task_htmlname = []     #章名
    tasks = []                      #任务列表
    get_text_html(url_html)
    for url in task_html:
        print(url)
        #创建协程对象
        c = get_request(url)
        # 创建任务对象
        task = asyncio.ensure_future(c)
        # 回调
        task.add_done_callback(a)
        # 把任务加进任务列表
        tasks.append(task)
    # 创建事件循环对象
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SamRol

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值