Python爬蟲練習(xí)(三)多線程爬取NCBI genome搜索結(jié)果并存儲基因組詳情頁物種名+基因組信息統(tǒng)計(requests+selenium+xpath+線程池)

由于ncbi的genome搜索結(jié)果的頁面對應(yīng)的翻頁操作發(fā)送的請求是個post請求鲁冯,并且其參數(shù)眾多不太好用requests模塊直接請求到頁面梢为,因此直接用selenium模擬翻頁操作獲得每頁源碼數(shù)據(jù)即可祝辣,由于結(jié)果比較多颗品,因此考慮使用多線程/異步/多進程等等苍碟,這里用的是線程池的操作啥供,我在這里調(diào)用8個線程,針對是哺乳類基因組頁面的搜索結(jié)果窥淆,還是比較快的卖宠,一共22頁,每個步驟/參數(shù)/函數(shù)的作用都標注出來了忧饭。

from lxml import etree
from selenium import webdriver
from multiprocessing.dummy import Pool
from functools import partial 
import os
import requests
# 實現(xiàn)無可視化界面
from selenium.webdriver.chrome.options import Options
# 實現(xiàn)規(guī)避檢測
from selenium.webdriver import ChromeOptions


def setoption():
    """
    谷歌瀏覽器常規(guī)反反爬的參數(shù)設(shè)置
    """
    # 實現(xiàn)無可視化界面的操作
    chrome_options = Options()
    chrome_options.add_experimental_option(
        'excludeSwitches', ['enable-logging'])
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")
    # 實現(xiàn)規(guī)避檢測
    option = ChromeOptions()
    option.add_experimental_option("excludeSwitches",
                                   ["enable-automation"])
    return chrome_options, option


def getonepage(pagetext, filepath):
    """
    得到一頁所有物種對應(yīng)詳情頁的物種名+基因組信息統(tǒng)計扛伍,
    并且寫入到文件當中。
    """
    tree = etree.HTML(pagetext)
    initurl = "https://www.ncbi.nlm.nih.gov"
    div_list = tree.xpath(
        '//*[@id="maincontent"]/div/div[5]/div[@class="rprt"]')
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
            (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
    }
    for div in div_list:
        detail_url = initurl + div.xpath('.//p/a/@href')[0]
        response = requests.get(detail_url, headers=headers)
        response = response.content.decode()
        detail_html = bytes(bytearray(response, encoding='utf-8'))
        detail_tree = etree.HTML(detail_html)
        name = detail_tree.xpath(
            '//*[@id="maincontent"]/div/div[5]/div/div[2]/table[1]//tr//span[1]/text()')[0]
        summary = "".join(detail_tree.xpath(
            '//*[@id="mmtest1"]/div/div/div/table//tr//text()'))
        print(name, summary, sep="\n")
        with open(filepath, "a", encoding="utf-8") as fp:
            fp.write(name+"\n"+summary+"\n")


def mainprocess(chrome_options, option, executable_path, filepath, thread=4):
    """
    開啟selenium無頭瀏覽器词裤,先得到每一頁的源碼數(shù)據(jù)存儲刺洒,
    然后用每頁源碼數(shù)據(jù)作為參數(shù),進行多線程搭建吼砂。
    """
    # 讓selenium規(guī)避被檢測到的風(fēng)險
    bro = webdriver.Chrome(executable_path=executable_path,
                           chrome_options=chrome_options,
                           options=option)
    bro.get("https://www.ncbi.nlm.nih.gov/genome/?term=txid40674%5BOrganism%3Aexp%5D")
    # 生成用于多線程使用的參數(shù)列表
    pagetext_list = []
    # 獲取當前頁源碼數(shù)據(jù)
    pagetext = bro.page_source
    print("Append page1 to the queue.")
    pagetext_list.append(pagetext)
    # 獲取全部頁碼總數(shù)
    allpagetree = etree.HTML(pagetext)
    allpage = int(allpagetree.xpath('//*[@id="pageno2"]/@last')[0])
    # 將每頁的源碼數(shù)據(jù)加入多線程參數(shù)列表
    for pagenum in range(2, allpage+1):
        next_btn = bro.find_element_by_xpath(
            "/html/body/div[1]/div[1]/form/div[1]/div[4]/div/div[7]/div/a[1]")
        next_btn.click()
        pagetext = bro.page_source
        print(f"Append page{pagenum} to the queue.")
        pagetext_list.append(pagetext)
    # 檢測是否存在之前的文件
    if os.path.isfile(filepath):
        os.remove(filepath)
    # 多線程使用
    pool = Pool(thread)
    # param = {pagetext: pagetext_list, filepath: filepath}
    pool.map(partial(getonepage, filepath=filepath), pagetext_list)
    pool.close()
    pool.join()
    bro.quit()


if __name__ == "__main__":
    chrome_options, option = setoption()
    mainprocess(chrome_options, option,
                r"chromedriver.exe", "genomeinfo.txt", 8)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逆航,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渔肩,更是在濱河造成了極大的恐慌因俐,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周偎,死亡現(xiàn)場離奇詭異抹剩,居然都是意外死亡,警方通過查閱死者的電腦和手機蓉坎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門澳眷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛉艾,你說我怎么就攤上這事钳踊≈缘校” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵拓瞪,是天一觀的道長缴罗。 經(jīng)常有香客問我,道長祭埂,這世上最難降的妖魔是什么瞒爬? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮沟堡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矢空。我一直安慰自己航罗,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布屁药。 她就那樣靜靜地躺著粥血,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酿箭。 梳的紋絲不亂的頭發(fā)上复亏,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音缭嫡,去河邊找鬼缔御。 笑死,一個胖子當著我的面吹牛妇蛀,可吹牛的內(nèi)容都是我干的耕突。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼评架,長吁一口氣:“原來是場噩夢啊……” “哼眷茁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纵诞,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤上祈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浙芙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體登刺,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年茁裙,在試婚紗的時候發(fā)現(xiàn)自己被綠了塘砸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晤锥,死狀恐怖掉蔬,靈堂內(nèi)的尸體忽然破棺而出廊宪,到底是詐尸還是另有隱情,我是刑警寧澤女轿,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布箭启,位于F島的核電站,受9級特大地震影響蛉迹,放射性物質(zhì)發(fā)生泄漏傅寡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一北救、第九天 我趴在偏房一處隱蔽的房頂上張望荐操。 院中可真熱鬧,春花似錦珍策、人聲如沸托启。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屯耸。三九已至,卻和暖如春蹭劈,著一層夾襖步出監(jiān)牢的瞬間疗绣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工铺韧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留多矮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓哈打,卻偏偏與公主長得像工窍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子前酿,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353