在處理大量基因數據時,使用同步爬蟲效率會很低,因此今天我將使用 aiohttp
來執行非同步爬蟲,這樣可以加速數據抓取過程。非同步爬蟲允許同時發送多個請求,而不必等待每個請求完成後再發送下一個請求,從而大幅提高抓取速度。
aiohttp
是一個非同步 HTTP 端,專為大規模並行請求設計,因此藉由 asyncio
庫,可以高效綠的爬取基因的詳細頁面。
首先我定義了一個函數,用於抓取每個基因的詳細頁面。這個函數將會發送 HTTP 請求,並返回頁面內容:
import aiohttp
import asyncio
async def fetch_gene_page(session, url):
async with session.get(url) as response:
return await response.text()
上面這段 code 中,我定義了一個名為 fetch_gene_page
的非同步函數,它使用 aiohttp
的 session.get()
方法來發送 HTTP 請球;請求完成後,使用 await
來等待並返回頁面內容。接下來,定義另一個函數來批量抓取所有基因的詳細頁面。這個函數將會創建多個抓取任務,並使用 asyncio.gather()
並行執行它們:
async def fetch_all_gene_pages(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch_gene_page(session, url) for url in urls]
pages = await asyncio.gather(*tasks)
return pages
這個函數接收一個 URL 列表,並使用 aiohttp.ClientSession()
創建一個 HTTP 客戶端,然後為每個 URL 創建一個抓取任務,並使用 asyncio.gather()
同時執行所有任務。最後,我們將 URL 列表傳入,並啟動抓取任務:
urls = df['URL'].tolist() # 生成所有基因的 URL 列表
gene_pages = asyncio.run(fetch_all_gene_pages(urls)) # 執行非同步爬蟲
這樣就能夠高效地抓取所有基因的詳細頁面,並將其存儲到變量 gene_pages
中;這一步為後續的數據解析奠定了基礎,我將在接下來的步驟中對這些抓取到的頁面進行解析,提取基因的位置訊息。