selenium+python如何爬取簡書網站

來源:互聯網
上載者:User

這篇文章介紹的內容是selenium+python如何爬取簡書網站 ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下


頁面載入邏輯

當你興緻勃勃地從網上學習了基本的爬蟲知識後就像找個目標實踐下,擁有大量文章的簡書包含了大量的有價值資訊,所以自然成為了你的選擇目標,如果你嘗試之後會發現並沒有想象的那麼簡單,因為裡麵包含了很多js相關的資料轉送。 讓我先使用傳統的爬蟲示範一下吧: >

開啟簡書首頁,似乎沒有什麼特別的

jianshu首頁

開啟chrome的開發人員模式,發現文章的標題,href都在a標籤裡,似乎也沒有什麼不一樣的

a.png

接下來就是尋找頁面上所有的a標籤,但是且慢如果你仔細觀察就會發現滑輪滾到一半的時候頁面就會載入更多,這樣的步驟會重複三次知道底部出現閱讀更多的按鈕

滑輪

不僅如此底部的閱讀更多的href並沒有告訴我們載入剩下的頁面資訊,唯一的辦法是不斷點擊閱讀更多這個按鈕

load_more.png

什麼,將滑輪重複三次滑倒頁面的中央並且不斷點擊按鈕這種操作http請求可做不到,這更像是js操作?沒錯,簡書的文章並不是常規的http請求,我們不能根據不同url不斷重新導向,而是頁面的一些動作來載入頁面資訊。

selenium介紹

selenium是一個web自動化測試載入器,支援很多種語言,我們在這裡可以使用python的selenium做爬蟲使用,爬取簡書的過程中,它的工作原理是不斷注入js代碼,讓頁面源源不斷的載入,最後再提取所有的a標籤。首先你得在python中下載selenium包

>>> pip3 install selenium

chromedriver

selenium必須搭載瀏覽器使用,這裡我使用的是chromedriver,Chrome的開源測試版,它可以使用headless模式不需要顯示前段來訪問網頁,算是最大特性了。

python中操作

在寫代碼之前一定要把chromedriver同一檔案夾內,因為我們需要引用PATH,這樣方便點。首先我們的第一個任務是刷出載入更多的按鈕,需要做3次將滑輪重複三次滑倒頁面的中央,這裡方便起見我滑到了底部

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

看看效果

刷出了按鈕

接下來就是不斷點擊按鈕載入頁面,繼續加入剛才的py檔案之中

for j in range(10):  //這裡我類比10次點擊        try:         button = browser.execute_script("var a = document.getElementsByClassName('load-more'); a[0].click();")        time.sleep(2)    except:        pass''' 上面的js代碼說明一下 var a = document.getElementsByClassName('load-more');選擇load-more這個元素 a[0].click(); 因為a是一個集合,索引0然後執行click()函數'''

這個我就不貼圖了,成功之後就是不斷地載入頁面 ,知道迴圈完了為止,接下來的工作就簡單很多了,就是尋找a標籤,get其中的texthref屬性,這裡我直接把它們寫在了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

最終結果

簡書文章

headless模式

不斷載入頁面肯定也很煩人,所以我們測試成功之後並不想把瀏覽器顯示出來,這需要加上headless模式

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

總結

當我們沒辦法使用正常的http請求爬取時,可以使用selenium操縱瀏覽器來抓取我們想要的內容,這樣有利有弊,比如

  • 優點

  1. 可以暴力爬蟲

  2. 簡書並不需要cookie才能查看文章,不需要費勁心思找代理,或者說我們可以無限抓取並且不會被ban

  3. 首頁應該為ajax傳輸,不需要額外的http請求

缺點

  1. 爬取速度太滿,想象我們的程式,點擊一次需要等待2秒那麼點擊600次需要1200秒, 20分鐘...

附加

這是所有完整的代碼

from selenium import webdriverimport timeoptions = webdriver.ChromeOptions()options.add_argument('headless')browser = webdriver.Chrome("./chromedriver", chrome_options=options)browser.get("https://www.jianshu.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


相關推薦:

[python爬蟲] Selenium爬取新浪微博內容及使用者資訊

[Python爬蟲]利用Selenium等待Ajax載入及類比自動翻頁,爬取東方財富網公司公告

Python爬蟲:Selenium+ BeautifulSoup 爬取JS渲染的動態內容(雪球網新聞)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.