掌握excel线性回归技巧助力数据分析与决策优化
677
2022-05-29
Asyncpy使用文档
1 创建项目
2 发送get和post请求
2.1 使用start_urls发送GET请求
2.2 使用start_requests发送POST请求
3 自定义请求头
3.1 settings中设置请求头
3.2 在middlewares中添加请求头
3.3 添加代理IP
4 修改并发延时重试等配置
4.1 修改settings中的配置
4.2 修改指定爬虫文件的配置
5 生成日志文件
5.1 修改settings配置
5.2 多个爬虫指定日志文件
6 解析response提取数据
6.1 response.text
6.2 response.xpath('')
6.3 response.css()、response.re()
7 使用pipelines保存数据
8 启动多个爬虫
1 创建项目
安装需要的环境 python版本需要 >=3.6
安装命令:
pip install asyncpy
1
安装完成之后,可以开始创建一个爬虫项目。
创建项目命令:
asyncpy genspider demo
1
创建一个名为demo的项目。
创建成功之后, 打开项目文件,项目结构如下图所示:
2 发送get和post请求
2.1 使用start_urls发送GET请求
在start_url 列表中添加一个链接。
在parse中,打印出响应状态码和内容。
# -*- coding: utf-8 -*- from asyncpy.spider import Spider import settings class DemoSpider(Spider): name = 'demo' settings_attr = settings start_urls = ['http://httpbin.org/get'] async def parse(self, response): print(response.status) print(response.text) DemoSpider.start()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
右键点击运行即可完成请求抓取。
2.2 使用start_requests发送POST请求
导入Asyncpy的Request模块,清空start_urls ,然后重写 start_requests方法完成Post请求。
from asyncpy.spider import Spider import settings from asyncpy.spider import Request class DemoSpider(Spider): name = 'demo' settings_attr = settings start_urls = [] async def start_requests(self): url = 'http://httpbin.org/post' yield Request(callback=self.parse,url=url,method="POST",data={"Say":"Hello Asyncpy"}) async def parse(self, response): print(response.status) print(response.text) DemoSpider.start()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
响应结果:
可以看到我们Post提交的参数。
3 自定义请求头
这里以修改请求头中的User-Agent为例子,从上面的图中可以看出当前的User-Agent是aiohttp默认的用户代理。
3.1 settings中设置请求头
打开settings文件,找到最下面的 USER_AGENT 参数,解开注释后,添加一个浏览器的UA。
3.2 在middlewares中添加请求头
打开middlewares文件,找到UserAgentMiddleware方法(默认有),也可以自定义一个方法。
# -*- coding: utf-8 -*- from asyncpy.middleware import Middleware from asyncpy.request import Request from asyncpy.spider import Spider middleware = Middleware() @middleware.request async def UserAgentMiddleware(spider:Spider, request: Request): ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36" request.headers.update({"User-Agent": ua})
1
2
3
4
5
6
7
8
9
10
11
然后到spider爬虫文件中(demo.py),引入middlerwares文件中的 middleware 。 在start启动方法中传入middleware 。
# -*- coding: utf-8 -*- from asyncpy.spider import Spider import settings from asyncpy.spider import Request from middlewares import middleware class DemoSpider(Spider): name = 'demo' settings_attr = settings start_urls = [] async def start_requests(self): url = 'http://httpbin.org/post' yield Request(callback=self.parse,url=url,method="POST",data={"Say":"Hello Asyncpy"}) async def parse(self, response): print(response.text) DemoSpider.start(middleware=middleware)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行demo.py,可以看到当前的 “User-Agent” 已经更改为我们自定义的UA。
3.3 添加代理IP
和3.1.1类似,打开middlewares文件,在方法下添加代理。(可以重新定义一个方法)
注意是在aiohttp_kwargs中添加proxy。记得在start方法中传入middleware。
@middleware.request async def UserAgentMiddleware(spider:Spider, request: Request): ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36" request.headers.update({"User-Agent": ua}) request.aiohttp_kwargs.update({"proxy": "http://49.85.98.209:4253"})
1
2
3
4
5
运行demo.py,可以看到当前的 IP 已经更改为我们自定义的proxy。(该代理ip已过期)
4 修改并发延时重试等配置
4.1 修改settings中的配置
settings文件中有以下可支持的配置,可以自己具体修改。
""" CREATE YOUR DEFAULT_CONFIG ! Some configuration: CONCURRENT_REQUESTS 并发数量 RETRIES 重试次数 DOWNLOAD_DELAY 下载延时 RETRY_DELAY 重试延时 DOWNLOAD_TIMEOUT 超时限制 USER_AGENT 用户代理 LOG_FILE 日志路径 LOG_LEVEL 日志等级 """
1
2
3
4
5
6
7
8
9
10
11
12
13
4.2 修改指定爬虫文件的配置
如果需要对不同爬虫文件进行不同的配置,可以使用 custom_settings 在爬虫文件中自定义配置。
并且需要在yield中,传入custom_settings。才能使自定义配置生效。
# -*- coding: utf-8 -*- from asyncpy.spider import Spider import settings from asyncpy.spider import Request from middlewares import middleware class DemoSpider(Spider): name = 'demo' settings_attr = settings custom_settings = { "DOWNLOAD_TIMEOUT":60, "RETRIES":3 } start_urls = [] async def start_requests(self): url = 'http://httpbin.org/post' yield Request(callback=self.parse,url=url, method="POST", data={"Say":"Hello Asyncpy"}, custom_settings=self.custom_settings ) async def parse(self, response): print(response.text) DemoSpider.start(middleware=middleware)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
5 生成日志文件
5.1 修改settings配置
# '''生成日志文件''' # LOG_FILE = '../asyncpy.log' # LOG_LEVEL = 'DEBUG'
1
2
3
全局日志可以在settings文件中配置生成。
5.2 多个爬虫指定日志文件
custom_settings = { "LOG_FILE" : "../asyncpy.log" }
1
2
3
这里跟上面相同,针对指定爬虫文件的日志,需要删除settings的日志配置,然后再通过custom_settings进行配置,如果不指定LOG_LEVEL 的话,日志等级默认为INFO
6 解析response提取数据
我引入了scrapy中的parsel解析模块,所以这里默认的解析方法和scrapy相同。
也可以自己选择其他方法。
async def parse(self, response): print(response.text) print(response.xpath('//text()')) print(response.css(''))
1
2
3
4
6.1 response.text
返回页面文本内容,可以导入正则模块进行匹配
6.2 response.xpath(’’)
getall() : 返回的是一个list,里面包含了多个string
get() : 返回的是string,list里面第一个string
extract() 等于 getall()
extract_first() 等于 get()
6.3 response.css()、response.re()
parsel.css选择器和parsel.re,可自行查找使用方法。
7 使用pipelines保存数据
使用回调方法,判断yield的是否是dict类型的item,是则使用pipelines进行数据的保存处理。
首先定义一个item,然后使用yield回调item。
项目的pipelines文件中默认有SpiderPipeline类。导入SpiderPipeline,传入start()启动管道。
# -*- coding: utf-8 -*- # 爬虫文件 from asyncpy.spider import Spider import settings from asyncpy.spider import Request from middlewares import middleware from pipelines import SpiderPipeline class DemoSpider(Spider): name = 'demo' settings_attr = settings start_urls = [] async def start_requests(self): url = 'http://httpbin.org/post' yield Request(callback=self.parse,url=url, method="POST", data={"Say":"Hello Asyncpy"}, custom_settings=self.custom_settings ) async def parse(self, response): item = {} item['text'] = response.text yield item DemoSpider.start(middleware=middleware,pipelines=SpiderPipeline)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# -*- coding: utf-8 -*- # pipelines文件 class SpiderPipeline(): def __init__(self): pass def process_item(self, item, spider_name): print(item)
1
2
3
4
5
6
7
8
8 启动多个爬虫
目前可以使用多进程的方式启动多个爬虫文件。
创建一个test文件,导入两个爬虫文件的Spider,使用multiprocessing进行启动。
from Demo.demo import DemoSpider from Demo.demo2 import DemoSpider2 import multiprocessing def open_DemoSpider2(): DemoSpider2.start() def open_DemoSpider(): DemoSpider.start() if __name__ == "__main__": p1 = multiprocessing.Process(target = open_DemoSpider) p2 = multiprocessing.Process(target = open_DemoSpider2) p1.start() p2.start()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
感兴趣的朋友或者留言吧,也可以去github点个star支持一下!
链接 : https://github.com/lixi5338619/asyncpy
Python
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。