当前位置: 首页 > 后端技术 > Python

Asyncpy使用文档

时间:2023-03-25 22:38:14 Python

1创建项目安装所需环境python版本需要>=3.6安装命令:pipinstallasyncpy安装完成后,就可以开始创建爬虫项目了。创建项目命令:asyncpygenspiderdemo创建一个名为demo的项目。创建成功后,打开项目文件,项目结构如下图所示:2发送get和post请求2.1使用start_urls发送GET请求在start_url列表中添加一个链接。在parse中,打印出响应状态码和内容。#-*-编码:utf-8-*-fromasyncpy.spiderimportSpiderimportsettingsclassDemoSpider(Spider):name='demo'settings_attr=settingsstart_urls=['http://httpbin.org/get']asyncdefparse(self,response):print(response.status)print(response.text)DemoSpider.start()右键运行,完成请求爬取。2.2使用start_requests发送POST请求导入Asyncpy的Request模块,清除start_urls,然后重写start_requests方法完成Post请求。fromasyncpy.spiderimportSpiderimportsettingsfromasyncpy.spiderimportRequestclassDemoSpider(Spider):name='demo'settings_attr=settingsstart_urls=[]asyncdefstart_requests(self):url='http://httpbin.org/post'yieldRequest(callback=self.parse,url=url,method="POST",data={"Say":"HelloAsyncpy"})asyncdefparse(self,response):print(response.status)打印(response.text)DemoSpider.start()响应结果:可以看到我们Post提交的参数。3自定义请求头这里以修改请求头中的User-Agent为例。从上图可以看出当前的User-Agent是aiohttp默认的用户代理。3.1在settings中设置请求头打开settings文件,找到最下面的USER_AGENT参数,取消勾选注释,添加一个浏览器UA。3.2给中间件添加请求头打开middlewares文件,找到UserAgentMiddleware方法(默认有),也可以自定义一个方法。#-*-编码:utf-8-*-fromasyncpy.middlewareimportMiddlewarefromasyncpy.requestimportRequestfromasyncpy.spiderimportSpidermiddleware=Middleware()@middleware.requestasyncdefUserAgentMiddleware(spider:Spider,request:Request):ua="Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3100.0Safari/537.36"request.headers.update({"User-Agent":ua})然后到蜘蛛在爬虫文件(demo.py)中,在middlewares文件中引入中间件。在start方法中传入中间件。#-*-编码:utf-8-*-fromasyncpy.spiderimportSpiderimportsettingsfromasyncpy.spiderimportRequestfrommiddlewaresimportmiddlewareclassDemoSpider(Spider):name='demo'settings_attr=settingsstart_urls=[]asyncdefstart_lfrequests(se:url='http://httpbin.org/post'yieldRequest(callback=self.parse,url=url,method="POST",data={"Say":"HelloAsyncpy"})asyncdefparse(self,response):print(response.text)DemoSpider.start(middleware=middleware)运行demo.py,可以看到当前的“User-Agent”已经改成了我们自定义的UA3.3添加代理IP与3.1类似。1、打开middlewares文件,在method下添加proxy。(可以重新定义一个method)注意在aiohttp_kwargs中添加了proxy,记得在start方法中传入middleware。@middleware.requestasyncdefUserAgentMiddleware(spider:Spider,request:Request):ua="Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3100.0Safari/537.36"请求.headers.update({"User-Agent":ua})request.aiohttp_kwargs.update({"proxy":"http://49.85.98.209:4253"})运行demo.py,可以看到当前IP已更改为我们的自定义代理。(代理ip已过期)4修改并发延迟重试等配置4.1修改settings中的配置settings文件中有以下支持的配置,可以自行修改。"""CREATEYOURDEFAULT_CONFIG!部分配置:CONCURRENT_REQUESTS并发数RETRIES重试次数DOWNLOAD_DELAY下载延迟RETRY_DELAY重试延迟DOWNLOAD_TIMEOUT超时限制USER_AGENT用户代理LOG_FILE日志路径LOG_LEVEL日志级别"""4.2如果需要修改指定爬虫的配置file要配置不同的爬虫文件,可以使用custom_settings自定义爬虫文件中的配置。并且需要在yield中传入custom_settings。为了使自定义配置生效。#-*-编码:utf-8-*-fromasyncpy.spiderimportSpiderimportsettingsfromasyncpy.spiderimportRequestfrommiddlewaresimportmiddlewareclassDemoSpider(Spider):name='demo'settings_attr=settingscustom_settings={"DOWNLOAD_TIMEOUT":60RETRIES":3}start_urls=[]asyncdefstart_requests(self):url='http://httpbin.org/post'yieldRequest(callback=self.parse,url=url,method="POST",data={"Say":"HelloAsyncpy"},custom_settings=self.custom_settings)asyncdefparse(self,response):print(response.text)DemoSpider.start(middleware=middleware)5生成日志文件5.1修改设置配置#'''生成日志文件'''#LOG_FILE='../asyncpy.log'#LOG_LEVEL='DEBUG'全局日志可以在设置文件中配置生成。5.2多个爬虫指定日志文件custom_settings={"LOG_FILE":"../asyncpy.log"}这个同上,对于指定爬虫文件的日志,需要删除settings的日志配置,然后通过custom_settings配置,如果不指定LOG_LEVEL,则日志级别默认为INFO6解析响应提取数据我在scrapy中引入了parser解析模块,所以这里默认的解析方式和scrapy一样。您也可以自己选择其他方法。asyncdefparse(self,response):print(response.text)print(response.xpath('//text()'))print(response.css(''))6.1response.text返回的文本内容页面,可以导入正则模块进行匹配6.2response.xpath('')getall():返回一个列表,其中包含多个stringget():返回字符串,列表中第一个stringextract()等于getall()extract_first()等于get()6.3response.css()、response.re()parsel.css选择器和parsel.re,使用方法自行查找。7使用管道保存数据使用回调方法判断yield是否为dict类型项,使用管道保存数据。先定义一个item,然后用yield回调item。项目的pipelines文件中默认有一个SpiderPipeline类。导入SpiderPipeline并传入start()以启动管道。#-*-编码:utf-8-*-#从asyncpy.spider导入爬虫文件]asyncdefstart_requests(self):url='http://httpbin.org/post'yieldRequest(callback=self.parse,url=url,method="POST",data={"Say":"HelloAsyncpy"},custom_settings=self.custom_settings)asyncdefparse(self,response):item={}item['text']=response.textyielditemDemoSpider.start(middleware=middleware,pipelines=SpiderPipeline)#-*-编码:utf-8-*-#pipelinesfileclassSpiderPipeline():def__init__(self):passdefprocess_item(self,item,spider_name):print(item)8启动多个爬虫目前可以使用多进程启动多个爬虫文件。创建一个测试文件,导入两个爬虫文件的Spider,使用multiprocessing启动。从Demo.demo导入DemoSpider从Demo.demo2导入DemoSpider2importmultiprocessingdefopen_DemoSpider2():DemoSpider2.start()defopen_DemoSpider():DemoSpider.start()if__name__=="__main__":p1=multiprocessing.Process(target=p2moSpider)=multiprocessing.Process(target=open_DemoSpider2)p1.start()p2.start()感兴趣的朋友请点赞或者留言,或者去github点个star支持一下!链接:https://github.com/lixi5338619/asyncpy