python使用aiohttp通過(guò)設(shè)置代理爬取基金數(shù)據(jù)簡(jiǎn)單示例
python爬蟲
說(shuō)到python爬蟲,我們就會(huì)想到它那強(qiáng)大的庫(kù),很多新手小白在選擇框架的時(shí)候都會(huì)想到使用Scrapy,但是僅僅停留在會(huì)使用的階段。在實(shí)際爬蟲過(guò)程中遇到反爬機(jī)制是再常見不過(guò)的,今天為了增加對(duì)爬蟲機(jī)制的理解,我們就通過(guò)手動(dòng)實(shí)現(xiàn)多線程的爬蟲過(guò)程,同時(shí)引入IP代理池進(jìn)行基本的反爬操作。
這里我們就以天天基金數(shù)據(jù)為實(shí)際項(xiàng)目,該網(wǎng)站具有反爬機(jī)制,同時(shí)數(shù)量足夠大,多線程效果較為明顯。所以這里需要使用的到的技術(shù)路線有
- IP代理池
- 多線程
- 爬蟲與反爬
通過(guò)基礎(chǔ)的分析天天基金網(wǎng)的一些數(shù)據(jù)。經(jīng)過(guò)抓包分析,可知:./fundcode_search.js包含所有基金的數(shù)據(jù),同時(shí),該地址具有反爬機(jī)制,多次訪問(wèn)將會(huì)失敗甚至封IP的情況。分析完天天基金網(wǎng)的數(shù)據(jù)后,我們選擇使用搭建IP代理池,用于反爬作用。代理池直接通過(guò)代理廠家提供就可以,有太多的代理很多同學(xué)不知道怎么選擇,經(jīng)過(guò)多年爬蟲經(jīng)驗(yàn)和使用代理的經(jīng)驗(yàn)這里推薦億牛云代理,長(zhǎng)期使用不管是代理質(zhì)量還是售后服務(wù)都是優(yōu)于其他代理長(zhǎng)家的。
搭建完IP代理池后,我們開始著手多線程爬取數(shù)據(jù)的工作。一旦使用多線程,就需要考慮到一些爬取中會(huì)出現(xiàn)的問(wèn)題。
python使用aiohttp通過(guò)設(shè)置代理IP獲取數(shù)據(jù)過(guò)程
import asyncio import aiohttp from aiohttp_socks import ProxyConnector from bs4 import BeautifulSoup # 定義目標(biāo)網(wǎng)站和代理服務(wù)器的參數(shù) url = "http://fund.eastmoney.com/fund.html#os_0;isall_0;ft_;pt_1" proxy = "socks5://16yun:16ip@www.16yun.cn:11111" # 定義異步函數(shù)來(lái)發(fā)送GET請(qǐng)求,并使用代理服務(wù)器來(lái)連接目標(biāo)網(wǎng)站 async def fetch(session, url): try: async with session.get(url) as response: # 檢查響應(yīng)狀態(tài)碼是否為200,否則拋出異常 if response.status != 200: raise Exception(f"Bad status code: {response.status}") # 返回響應(yīng)內(nèi)容的文本格式 return await response.text() except Exception as e: # 打印異常信息,并返回None print(e) return None # 定義異步函數(shù)來(lái)處理響應(yīng)結(jié)果,并解析HTML內(nèi)容 async def parse(html): # 如果響應(yīng)結(jié)果不為空,則進(jìn)行解析操作 if html is not None: # 使用bs4庫(kù)來(lái)創(chuàng)建BeautifulSoup對(duì)象,并指定解析器為html.parser soup = BeautifulSoup(html, "html.parser") # 提取網(wǎng)頁(yè)中的標(biāo)題標(biāo)簽,并打印其文本內(nèi)容 title = soup.find("title") print(title.text) else: # 否則打印None表示無(wú)效結(jié)果 print(None) # 定義異步函數(shù)來(lái)統(tǒng)計(jì)成功次數(shù),并打印結(jié)果 async def count(results): # 初始化成功次數(shù)為0 success = 0 # 遍歷所有的結(jié)果,如果不為空,則增加成功次數(shù),否則跳過(guò) for result in results: if result is not None: success += 1 # 打印總共的請(qǐng)求數(shù)和成功次數(shù) print(f"Total requests: {len(results)}") print(f"Success requests: {success}") # 定義異步主函數(shù)來(lái)創(chuàng)建并運(yùn)行多個(gè)協(xié)程任務(wù),并控制并發(fā)數(shù)量和超時(shí)時(shí)間等參數(shù) async def main(): # 創(chuàng)建一個(gè)aiohttp_socks.ProxyConnector對(duì)象,用來(lái)設(shè)置代理服務(wù)器的參數(shù) connector = ProxyConnector.from_url(proxy) # 創(chuàng)建一個(gè)aiohttp.ClientSession對(duì)象,用來(lái)發(fā)送HTTP請(qǐng)求,并傳入connector參數(shù) async with aiohttp.ClientSession(connector=connector) as session: # 創(chuàng)建一個(gè)空列表,用來(lái)存儲(chǔ)所有的協(xié)程任務(wù) tasks = [] # 循環(huán)10000次,每次創(chuàng)建一個(gè)fetch函數(shù)的協(xié)程任務(wù),并添加到列表中 for i in range(10000): task = asyncio.create_task(fetch(session, url)) tasks.append(task) # 使用asyncio.gather函數(shù)來(lái)收集并執(zhí)行所有的協(xié)程任務(wù),并返回一個(gè)包含所有結(jié)果的列表 results = await asyncio.gather(*tasks) # 創(chuàng)建一個(gè)空列表,用來(lái)存儲(chǔ)所有的解析任務(wù) parse_tasks = [] for result in results: parse_task = asyncio.create_task(parse(result)) parse_tasks.append(parse_task) await asyncio.gather(*parse_tasks) await count(results) # 在程序入口處調(diào)用異步主函數(shù),并啟動(dòng)事件循環(huán) if __name__ == "__main__": asyncio.run(main())
以上就是python使用aiohttp通過(guò)設(shè)置代理爬取基金數(shù)據(jù)簡(jiǎn)單示例的詳細(xì)內(nèi)容,更多關(guān)于python aiohttp爬取基金數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python程序中設(shè)置HTTP代理
- 批量獲取及驗(yàn)證HTTP代理的Python腳本
- Python3.4實(shí)現(xiàn)從HTTP代理網(wǎng)站批量獲取代理并篩選的方法示例
- Python request設(shè)置HTTPS代理代碼解析
- 對(duì)python使用http、https代理的實(shí)例講解
- Python代碼實(shí)現(xiàn)http/https代理服務(wù)器的腳本
- python爬蟲http代理使用方法
- Python異步爬蟲requests和aiohttp中代理IP的使用
- 解決python異步框架aiohttp無(wú)法使用本地代理問(wèn)題
- python做http代理請(qǐng)求的項(xiàng)目實(shí)踐
相關(guān)文章
python實(shí)現(xiàn)電腦操控安卓手機(jī)
網(wǎng)上雖然有很多教程,但是隨著版本的更新總有各種各樣的坑,本文以親身踏坑經(jīng)歷介紹了電腦使用python操控安卓手機(jī),從安裝到使用方法,感興趣的可以了解一下2021-05-05Python?PaddleNLP開源實(shí)現(xiàn)快遞單信息抽取
這篇文章主要為大家介紹了Python?PaddleNLP開源項(xiàng)目實(shí)現(xiàn)對(duì)快遞單信息抽取,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06python利用faker庫(kù)批量生成測(cè)試數(shù)據(jù)
小編經(jīng)常需要批量測(cè)試一些數(shù)據(jù),有時(shí)候測(cè)試環(huán)境又暫時(shí)沒數(shù)據(jù),特意找了一下,發(fā)現(xiàn)有一個(gè)可批量生成數(shù)據(jù)的python庫(kù)—-faker,現(xiàn)在就介紹一下它的使用方法,如果你不想一行一行輸入代碼,小編提供了完整測(cè)試代碼,見文末代碼章節(jié)。2020-10-10解決使用PyCharm時(shí)無(wú)法啟動(dòng)控制臺(tái)的問(wèn)題
今天小編就為大家分享一篇解決使用PyCharm時(shí)無(wú)法啟動(dòng)控制臺(tái)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01PYTHON發(fā)送郵件YAGMAIL的簡(jiǎn)單實(shí)現(xiàn)解析
這篇文章主要介紹了PYTHON發(fā)送郵件YAGMAIL的簡(jiǎn)單實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10