首页 > 其他分享 >异步爬虫例子之asyncio

异步爬虫例子之asyncio

时间:2023-04-29 19:33:36浏览次数:41  
标签:异步 url 爬虫 replace session print async response asyncio

异步爬虫例子:

import time

import aiohttp
import asyncio
import re
import os

os.environ['NO_PROXY'] = 'www.baidu.com'





class Asyn():

    def __init__(self):
        self.__headers = {
                            'authority': 'go.drugbank.com',
                            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
                            'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
                            'cache-control': 'no-cache',
                            'cookie': 'xxxxx',
                            'referer': 'https://go.drugbank.com/unearth/q?query=*&button=&searcher=drugs',
                            'sec-ch-ua': '"Chromium";v="112", "Microsoft Edge";v="112", "Not:A-Brand";v="99"',
                            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48',
                        }

    async def __fetch(self, session, url):
        print("发送请求:", url)
        async with session.get(url, verify_ssl=False, headers=self.__headers) as response:
            content = await response.text()
            # print(content)
            try:
                info1 = re.findall(r'href="/indications/.*?">(.*?)</a', content)  # 第一列表
                if not info1:
                    print(f"最大限度页")
                    return
            except Exception as e:
                print(f"最大限度页,error={e}")
                return
            # print(info1)
            # print(len(info1))
            info2 = re.findall(r'<div class="db-matches"><a (.*?)</a></div>', content)
            info2_new = []  # 第二列表
            for i in info2:
                # i = i.replace('href="/drugs/', '').replace('">', ':').replace('</a>', '').replace('<a', '')
                i = i.replace('href="/drugs/', '').replace('">', ':').replace('</a>', '').replace('<a', '').replace(' / ',
                                                                                                                    '【/】')  # 修改的

                # print(i)
                info2_new.append(i)
            # print(len(info1), info1)
            # print(len(info2_new), info2_new)

            for yaoming, chenfen in zip(info1, info2_new):
                dic = {
                    "药名": yaoming,
                    "成分": chenfen
                }
                # total_list.append(dic)
                print(dic)
            with open('异步采集.txt', 'a', encoding='utf-8') as f:
                f.write(f'{len(info1), info1}\n{len(info2_new), info2_new}\n')
            # time.sleep(0.5)


    async def main(self):
        page = int(input("输入页数:"))
        async with aiohttp.ClientSession() as session:
            url_list = [f'https://go.drugbank.com/unearth/q?approved=1&ca=0&eu=0&page={i}&query=%2A&searcher=indications'
                        for i in range(1, page + 1)]
            tasks = [asyncio.create_task(self.__fetch(session, url)) for url in url_list]
            await asyncio.wait(tasks)


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

除了get请求,aiohttp还支持其它请求类型,如POST、PUT、DELETE等,和requests使用方式类似。

可获取:

async with aiohttp.ClientSession() as session:
        async with session.post('https://www.httpbin.org/post', data=data) as response:
            print('status:', response.status)  # 状态码
            print('headers:', response.headers)  # 响应头
            print('body:', await response.text())  # 响应体
            print('bytes:', await response.read())  # 响应体二进制内容
            print('json:', await response.json())  # 响应体json数据

可设置:# 设置 1 秒的超时

async def main():
    # 设置 1 秒的超时 
    timeout = aiohttp.ClientTimeout(total=1)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        url_list = [f'https://go.drugbank.com/unearth/q?approved=1&ca=0&eu=0&page={i}&query=%2A&searcher=indications'
                    for i in range(1, 200)]
        # print(url_list)
        tasks = [asyncio.create_task(fetch(session, url)) for url in url_list]
        await asyncio.wait(tasks)

更多参考:https://z.itpub.net/article/detail/602E65B824B2FC8A6AB5BDC2A1279822

标签:异步,url,爬虫,replace,session,print,async,response,asyncio
From: https://www.cnblogs.com/code3/p/17364397.html

相关文章

  • 《asyncio 系列》3. 详解 Socket(阻塞、非阻塞),以及和 asyncio 的搭配
    楔子在前面两篇文章中,我们介绍了协程、任务和事件循环,研究了如何同时运行长耗时的操作,并探索了一些可以优化此操作的asyncioAPI。然而,到目前为止,我们只是用asyncio.sleep函数模拟了长时间的操作。由于我们想要构建的不仅是演示应用程序,因此我们将使用一些真实世界的阻塞操作......
  • 《asyncio 系列》2. 详解 asyncio 的协程、任务、future,以及事件循环
    楔子上一篇文章我们深入讨论了并发性,探讨了如何同时使用进程和线程实现并发,还探索了如何利用非阻塞IO和事件循环来实现只使用一个线程的并发性。本篇文章将介绍在asyncio中使用单线程并发模型编写程序的基础知识,使用本文中的技术,你将能执行长时间运行的操作,如Web请求、数据......
  • Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫
    Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬虫   测试人员的最佳11种开源自动化Selenium1)RobotFrameworkRobotFramework是一个开源自动化系统,它使用关键字驱动的方法进行验收测试驱动开发(ATDD)和验收测试。该工具组织了各种测试自动化要求......
  • 论并行,并发,同步,异步之间的联系与区别
    前言前段时间和一些网游大佬讨论异步,并发之类专业名字的区别,具体的实现,收获颇多,于是决定写下这篇博客作记录。下面我们将其两两分类进行讨论。并行/并发(Parallelism/Concurrency)这里借用GPT搜索的回答并行:并行是指在同一时刻执行多个操作。并行通常需要多个线程或进程来实......
  • 爬虫为什么需要ip
    爬虫需要使用爬虫ip主要是为了解决以下问题:1、反爬虫机制:许多网站会设置反爬虫机制来防止爬虫程序的访问,例如限制IP地址的访问频率、检测访问来源等。使用爬虫ip可以绕过这些限制,使得爬虫程序更难被检测到。2、访问限制:有些网站可能会对某些地区的IP地址进行限制,如果你的爬虫程......
  • 【0基础学爬虫】爬虫基础之自动化工具 Playwright 的使用
    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化工具playwright的使用。概述......
  • vue2源码-十六、异步组件
    异步组件Vue中异步组件的写法有很多,主要用作大的组件异步加载的markdown组件editor组件。就是先渲染一个注释标签,等组件加载完毕,最后再重新渲染forceUpdate(图片懒加载)使用异步组件会配合webpack原理:异步组件默认不会调用Vue.extend()方法所有Ctor上没有cid属性,没有cid属......
  • playwright网络爬虫实战案例分享
    今日鸡汤不寝听金钥,因风想玉珂。大家好,我是Python进阶者。一、前言前几天在Python白银交流群【HugoLB】分享了一个playwright网络爬虫利器,如下图所示。感觉挺有意思,上手难度也不算太大,这里整理一份小教程分享给大家,后面遇到常规爬不动的网站,不妨试试看这个利器,兴许会事半功倍哦!二......
  • c语言和python语言写爬虫哪个更好 ?
    c语言和python语言写脚本那个更好?这取决于具体的应用场景和需求。C语言是一种高效、灵活的编程语言,适合于底层系统开发、操作系统、嵌入式开发等领域。C语言可以直接操作内存,因此可以更好地控制程序的性能和资源利用。Python语言则是一种高级编程语言,具有简洁、易读、易写等特点......
  • 应用scrapy爬虫框架
    Scrapy是一个基于Python的开源网络爬虫框架,它可以帮助我们快速、高效地抓取网页数据,并支持数据的自动化处理、存储和导出。Scrapy提供了丰富的扩展机制,可以轻松地实现各种自定义需求。Scrapy的基本使用流程:1、安装Scrapy框架2、创建一个Scrapy爬虫项目3、编写爬虫代码,定义要抓......