iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0

在處理大量基因數據時,使用同步爬蟲效率會很低,因此今天我將使用 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 的非同步函數,它使用 aiohttpsession.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 中;這一步為後續的數據解析奠定了基礎,我將在接下來的步驟中對這些抓取到的頁面進行解析,提取基因的位置訊息。


上一篇
Day8:基於 Ensembl Gene ID 構建基因詳細頁面的 URL
下一篇
Day10:爬取網頁的基因訊息
系列文
從零基礎到實戰:利用網頁爬蟲結合 RPKM 算法計算 COVID-19 感染者肺部基因表達量25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言