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