吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2952|回复: 28
上一主题 下一主题
收起左侧

[Python 原创] 利用协程做爬虫《明朝那些事》

[复制链接]
跳转到指定楼层
楼主
E式丶男孩 发表于 2023-4-21 21:58 回帖奖励

刚学使用协程来写爬虫,看教程爬的这个小说网站,所以拿来练练手。
代码如下

import asyncio
import os.path

import aiofiles as aiofiles
import aiohttp as aiohttp
import requests as requests
from pyquery import PyQuery as q

def get_all_chapter():
    response = requests.get("https://www.mingchaonaxieshier.com/")
    pq = q(response.content)
    books = [i for i in pq("div.mulu table").items()]
    books_data = []
    for book in books:
        trs = [i for i in book('tr').items()]
        book_chapters = []
        # build chapters of every book
        for i in trs[1:]:
            for j in i('a').items():
                book_chapters.append({
                    "title": j.text(),
                    "href": j.attr('href')
                })

        books_data.append({
            "book_title": trs[0].text(),
            "chapters": book_chapters
        })
    return books_data

def build_tasks(books):
    task_list = []
    for book in books:
        for chapter in book['chapters']:
            task_list.append(asyncio.ensure_future(download_chapter(chapter, book['book_title'])))
    return task_list

async def download_chapter(chapter, book_title):
    if not os.path.exists(f"./{book_title}/"):
        os.mkdir(f"./{book_title}/")
    print(f'下载:{book_title}/{chapter["title"]}')
    async with aiohttp.ClientSession() as session:
        async with session.get(chapter['href']) as response:
            src = await response.text()
            pq = q(src)
            content__text = pq('div.content p').text()
            async with aiofiles.open(f'./{book_title}/{chapter["title"]}.txt', mode='w', encoding='utf-8') as f:
                await f.write(content__text)

def main():
    books = get_all_chapter()
    tasks = build_tasks(books)
    event_loop = asyncio.get_event_loop()
    event_loop.run_until_complete(asyncio.wait(tasks))

if __name__ == '__main__':
    main()

爬虫效果如下
p9Eb0yR.png
录制教程时这个小说网站文章内容还是挺有规律的,但是新版没有规律了,所以爬出来相当不好看,不知道大佬们有没有更好的想法
p9EbGwV.png
如上图所示,文章内容和评论等内容全放一块了,不太好提取内容,也没有更小单位的元素。

由于我使用的python版本是3.10.11,在使用协程的时候与教程内容有较大的差异,总结如下:

  1. 创建任务用ensure_future,之前的create_task创建的任务执行不了,不知道是不是新版做了改动
  2. 启动任务为event_loop.run_until_complete(asyncio.wait(tasks)),教程里面用的asyncio.wait(task_list),在我的python中运行不起来,有警告但是执行失败

以上问题如果有大佬看到麻烦请指点我一下,谢谢了

免费评分

参与人数 6吾爱币 +12 热心值 +5 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
blindcat + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
luozi1653 + 1 + 1 热心回复!
Kdocke + 1 我很赞同!
zahuitang + 1 + 1 用心讨论,共获提升!
zjun777 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
话痨司机啊 发表于 2023-4-22 01:10
本帖最后由 话痨司机啊 于 2023-4-22 01:24 编辑

[Python] 纯文本查看 复制代码
def build_tasks(books,event_loop):
    task_list = []
    for book in books:
        for chapter in book['chapters']:
            task_list.append(event_loop.create_task(download_chapter(chapter, book['book_title'])))
    return task_list

因为新的create_task 是线程安全的,所以需要获取事件循环才可以运行否则报错RUNTIMEERROR.


建议写全 asyncio.wait(aws, *, timeout=5, return_when=ALL_COMPLETED)或者用asyncio.wait_for(aws,timeout)
并且aws 必须是一个task对象的迭代

点评

原来如此,懂了,谢谢大佬  发表于 2023-4-22 08:48

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
Black_山猫 + 1 用心讨论,共获提升!
E式丶男孩 + 2 + 1 我很赞同!

查看全部评分

推荐
IT大小白 发表于 2023-4-22 11:28
本帖最后由 IT大小白 于 2023-4-22 11:31 编辑

去除评论区内容:

[Python] 纯文本查看 复制代码
content__text = pq('div.content p').text()
async with aiofiles.open(f'./{book_title}/{chapter["title"]}.txt', mode='w', encoding='utf-8') as f:
    await f.write(content__text)

##改成
content__text = pq('div.content > p')
txt =""
for i in content__text:
   txt +=q(i).text()+"\n\n"        

async with aiofiles.open(f'./{book_title}/{chapter["title"]}.txt', mode='w', encoding='utf-8') as f:
    await f.write(txt)
3#
szwangbin001 发表于 2023-4-21 22:18
4#
30345 发表于 2023-4-21 22:32
感谢分享
5#
zjk414 发表于 2023-4-21 23:05
感谢分享
6#
keber 发表于 2023-4-21 23:07
感谢分享!
7#
bigdawn 发表于 2023-4-21 23:14

感谢分享!
8#
netpeng 发表于 2023-4-21 23:38
用起来方便,感谢分享。
9#
mianhuan 发表于 2023-4-22 00:09
厉害厉害厉害
10#
lsy832 发表于 2023-4-22 00:46
当年明月写的很不错
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表