Asyncpy使用文檔 Demo
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小時內刪除侵權內容。