selenium+python爬取簡(jiǎn)書(shū)文章

頁(yè)面加載邏輯

當(dāng)你興致勃勃地從網(wǎng)上學(xué)習(xí)了基本的爬蟲(chóng)知識(shí)后就像找個(gè)目標(biāo)實(shí)踐下糊探,擁有大量文章的簡(jiǎn)書(shū)包含了大量的有價(jià)值信息,所以自然成為了你的選擇目標(biāo),如果你嘗試之后會(huì)發(fā)現(xiàn)并沒(méi)有想象的那么簡(jiǎn)單暇务,因?yàn)槔锩姘撕芏鄇s相關(guān)的數(shù)據(jù)傳輸。 讓我先使用傳統(tǒng)的爬蟲(chóng)演示一下吧: >

打開(kāi)簡(jiǎn)書(shū)首頁(yè)怔软,似乎沒(méi)有什么特別的

jianshu首頁(yè)

打開(kāi)chrome的開(kāi)發(fā)者模式垦细,發(fā)現(xiàn)文章的標(biāo)題,href都在a標(biāo)簽里挡逼,似乎也沒(méi)有什么不一樣的

a.png

接下來(lái)就是尋找頁(yè)面上所有的a標(biāo)簽括改,但是且慢如果你仔細(xì)觀察就會(huì)發(fā)現(xiàn)滑輪滾到一半的時(shí)候頁(yè)面就會(huì)加載更多,這樣的步驟會(huì)重復(fù)三次知道底部出現(xiàn)閱讀更多的按鈕

滑輪

不僅如此底部的閱讀更多的href并沒(méi)有告訴我們加載剩下的頁(yè)面信息家坎,唯一的辦法是不斷點(diǎn)擊閱讀更多這個(gè)按鈕

load_more.png

什么嘱能,將滑輪重復(fù)三次滑倒頁(yè)面的中央并且不斷點(diǎn)擊按鈕這種操作http請(qǐng)求可做不到,這更像是js操作虱疏?沒(méi)錯(cuò)惹骂,簡(jiǎn)書(shū)的文章并不是常規(guī)的http請(qǐng)求,我們不能根據(jù)不同url不斷重定向做瞪,而是頁(yè)面的一些動(dòng)作來(lái)加載頁(yè)面信息析苫。

selenium介紹

selenium是一個(gè)web自動(dòng)化測(cè)試工具,支持很多種語(yǔ)言,我們?cè)谶@里可以使用python的selenium做爬蟲(chóng)使用衩侥,爬取簡(jiǎn)書(shū)的過(guò)程中国旷,它的工作原理是不斷注入js代碼,讓頁(yè)面源源不斷的加載茫死,最后再提取所有的a標(biāo)簽跪但。首先你得在python中下載selenium包

>>> pip3 install selenium

chromedriver

selenium必須搭載瀏覽器使用,這里我使用的是chromedriver峦萎,Chrome的開(kāi)源測(cè)試版屡久,它可以使用headless模式不需要顯示前段來(lái)訪問(wèn)網(wǎng)頁(yè),算是最大特性了爱榔。

python中操作

在寫(xiě)代碼之前一定要把chromedriver同一文件夾內(nèi)被环,因?yàn)槲覀冃枰肞ATH,這樣方便點(diǎn)详幽。首先我們的第一個(gè)任務(wù)是刷出加載更多的按鈕筛欢,需要做3次將滑輪重復(fù)三次滑倒頁(yè)面的中央,這里方便起見(jiàn)我滑到了底部

from selenium import webdriver
import time
browser = webdriver.Chrome("./chromedriver")
browser.get("http://www.reibang.com/")
for i in range(3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") // execute_script是插入js代碼的
    time.sleep(2) //加載需要時(shí)間唇聘,2秒比較合理

看看效果

刷出了按鈕

接下來(lái)就是不斷點(diǎn)擊按鈕加載頁(yè)面版姑,繼續(xù)加入剛才的py文件之中

for j in range(10):  //這里我模擬10次點(diǎn)擊    
    try: 
        button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")
        time.sleep(2)
    except:
        pass
'''
 上面的js代碼說(shuō)明一下
 var a = document.getElementsByClassName('load-more');選擇load-more這個(gè)元素
 a[0].click(); 因?yàn)閍是一個(gè)集合,索引0然后執(zhí)行click()函數(shù)
'''

這個(gè)我就不貼圖了迟郎,成功之后就是不斷地加載頁(yè)面 剥险,知道循環(huán)完了為止,接下來(lái)的工作就簡(jiǎn)單很多了宪肖,就是尋找a標(biāo)簽表制,get其中的texthref屬性,這里我直接把它們寫(xiě)在了txt文件之中.

titles = browser.find_elements_by_class_name("title")
with open("article_jianshu.txt", "w", encoding="utf-8") as f:
    for t in titles:
        try:
            f.write(t.text + " " + t.get_attribute("href"))
            f.write("\n")
        except TypeError:
            pass

最終結(jié)果

簡(jiǎn)書(shū)文章

headless模式

不斷加載頁(yè)面肯定也很煩人,所以我們測(cè)試成功之后并不想把瀏覽器顯示出來(lái)控乾,這需要加上headless模式

options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome("./chromedriver", chrome_options=options) //把上面的browser加入chrome_options參數(shù)

總結(jié)

當(dāng)我們沒(méi)辦法使用正常的http請(qǐng)求爬取時(shí)么介,可以使用selenium操縱瀏覽器來(lái)抓取我們想要的內(nèi)容,這樣有利有弊阱持,比如

  • 優(yōu)點(diǎn)
    1. 可以暴力爬蟲(chóng)
    2. 簡(jiǎn)書(shū)并不需要cookie才能查看文章,不需要費(fèi)勁心思找代理魔熏,或者說(shuō)我們可以無(wú)限抓取并且不會(huì)被ban
    3. 首頁(yè)應(yīng)該為ajax傳輸衷咽,不需要額外的http請(qǐng)求
  • 缺點(diǎn)
    1. 爬取速度太滿,想象我們的程序蒜绽,點(diǎn)擊一次需要等待2秒那么點(diǎn)擊600次需要1200秒, 20分鐘...

附加

這是所有完整的代碼

from selenium import webdriver
import time

options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome("./chromedriver", chrome_options=options)

browser.get("http://www.reibang.com/")

for i in range(3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)

# print(browser)
for j in range(10):
    try:
        button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")
        time.sleep(2)
    except:
        pass
#
titles = browser.find_elements_by_class_name("title")
with open("article_jianshu.txt", "w", encoding="utf-8") as f:
    for t in titles:
        try:
            f.write(t.text + " " + t.get_attribute("href"))
            f.write("\n")
        except TypeError:
            pass

如果你喜歡本篇文章的話镶骗, 快點(diǎn)擊關(guān)注,喜歡躲雅,打賞我吧 ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鼎姊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌相寇,老刑警劉巖慰于,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唤衫,居然都是意外死亡婆赠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)佳励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)休里,“玉大人,你說(shuō)我怎么就攤上這事赃承∶钍颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵瞧剖,是天一觀的道長(zhǎng)拭嫁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)筒繁,這世上最難降的妖魔是什么噩凹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮毡咏,結(jié)果婚禮上驮宴,老公的妹妹穿的比我還像新娘。我一直安慰自己呕缭,他們只是感情好堵泽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著恢总,像睡著了一般迎罗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上片仿,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天纹安,我揣著相機(jī)與錄音,去河邊找鬼砂豌。 笑死厢岂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阳距。 我是一名探鬼主播塔粒,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筐摘!你這毒婦竟也來(lái)了卒茬?” 一聲冷哼從身側(cè)響起船老,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圃酵,沒(méi)想到半個(gè)月后柳畔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辜昵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年荸镊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堪置。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躬存,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舀锨,到底是詐尸還是另有隱情岭洲,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布坎匿,位于F島的核電站盾剩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏替蔬。R本人自食惡果不足惜告私,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望承桥。 院中可真熱鬧驻粟,春花似錦、人聲如沸凶异。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剩彬。三九已至酷麦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喉恋,已是汗流浹背沃饶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轻黑,地道東北人糊肤。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像苔悦,于是被迫代替她去往敵國(guó)和親轩褐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椎咧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容