吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2193|回复: 20
上一主题 下一主题
收起左侧

[Python 转载] python 异步协程爬虫功能封装,方便直接调用

[复制链接]
跳转到指定楼层
楼主
rangersxiaoyan 发表于 2022-8-27 19:35 回帖奖励
本帖最后由 rangersxiaoyan 于 2022-8-27 19:39 编辑

学习了一下协程用法,赶感觉比线程还要复杂一点,为了偷懒就把他封装成包。
发出来提供给大家指点错误。

第一个文件,xiuren.py
[Python] 纯文本查看 复制代码
# coding=utf-8
# 2022年8月27日17:27:04

import aiohttp
import asyncio


class xiuren:
    def __init__(self, urls):
        self.urls = urls
        self.browser_header = {
            'cookie': 'ASPSESSIONIDASQAASCA=DFGGEPNAAJKPIAGBHOKMFNEA; cfstatshowcookie=xiurenji',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54'}

    async def get_data(self, url):
        async with aiohttp.ClientSession() as session:  # 等价于request
            async with session.get(url=url, headers=self.browser_header) as resp:  # 等价于resp=request.get()
                return [url, await resp.content.read()]  # 返回数据

    async def main(self):
        tasks = [asyncio.create_task(self.get_data(url)) for url in self.urls]  # 创建任务列表
        await asyncio.wait(tasks)  # 执行并发任务
        return [i.result() for i in tasks]  # 返回数据

    def run(self):
        loop = asyncio.get_event_loop()
        return loop.run_until_complete(self.main())  # 返回数据


调用文件随意,把第一个文件放在同目录下就行。
[Python] 纯文本查看 复制代码
from xiuren import xiuren

urls = [
    "https://www.cnblogs.com/yoyoketang/p/16195564.html",
    'https://blog.csdn.net/qq_55977554/article/details/122442552',
    'https://fanyi.baidu.com/?aldtype=16047#en/zh/Asyn%20chronous',
    'https://pc.qq.com/'

]


for i in xiuren(urls=urls).run():
    print(i)




说一下大概原理:就是传入URL列表,就是你要爬取的网站链接。返回是一个二位列表,第一个为url,第二个为获取的数据。数据为字节,如果链接是网页文件,自己转一下数据
如果对你有帮助请评价一下有用,给点热心




免费评分

参与人数 3吾爱币 +2 热心值 +3 收起 理由
fan159357 + 1 谢谢@Thanks!
lin2lin3lin5 + 1 + 1 我很赞同!
hackhase + 1 + 1 鼓励下!

查看全部评分

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

推荐
 楼主| rangersxiaoyan 发表于 2022-8-29 10:51 |楼主
老M 发表于 2022-8-28 19:53
就是爬取一个id;到时间它会自动在服务器端生成,需要通过get发送请来获取.所以,我想用异步来增加获取速度. ...

那你控制时间传入id,比如说在一秒内生成的id有两个或以上就可以用异步,不然就只能一个一个来。
推荐
老M 发表于 2022-8-28 19:53
rangersxiaoyan 发表于 2022-8-28 19:27
说出来听听,让大家帮忙分析分析

就是爬取一个id;到时间它会自动在服务器端生成,需要通过get发送请来获取.所以,我想用异步来增加获取速度.后面发现效果不是很好
沙发
老M 发表于 2022-8-27 19:49
3#
Magicy 发表于 2022-8-27 20:40
你好,想问一下,听说Py会有全局锁,所以多线程也是假的,是这样的吗?
4#
外酥内嫩 发表于 2022-8-27 21:20
Magicy 发表于 2022-8-27 20:40
你好,想问一下,听说Py会有全局锁,所以多线程也是假的,是这样的吗?

是的,Java的多线程是并行,Python的多线程是并发
5#
老M 发表于 2022-8-27 21:22
请教一下, 一个任务有返回值时,如何中断剩下的任务??
6#
 楼主| rangersxiaoyan 发表于 2022-8-28 00:09 |楼主
Magicy 发表于 2022-8-27 20:40
你好,想问一下,听说Py会有全局锁,所以多线程也是假的,是这样的吗?

是的,除非该地层。所以是同一时间是单线程。
7#
 楼主| rangersxiaoyan 发表于 2022-8-28 00:12 |楼主
老M 发表于 2022-8-27 21:22
请教一下, 一个任务有返回值时,如何中断剩下的任务??

没法中断,其实就是十几个url并发。自己可以控制量。
8#
老M 发表于 2022-8-28 08:19
rangersxiaoyan 发表于 2022-8-28 00:12
没法中断,其实就是十几个url并发。自己可以控制量。

好的,感谢楼主!!!
昨晚是试了一下,通过task.cancel(),task.stop()都不行
9#
老M 发表于 2022-8-28 08:21
rangersxiaoyan 发表于 2022-8-28 00:12
没法中断,其实就是十几个url并发。自己可以控制量。

而且发现爬虫的那个步骤不适合用异步
10#
 楼主| rangersxiaoyan 发表于 2022-8-28 19:24 |楼主
老M 发表于 2022-8-28 08:19
好的,感谢楼主!!!
昨晚是试了一下,通过task.cancel(),task.stop()都不行

不能中断,但是可以用条件在内部中断
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-5-12 11:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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