天天看點

python爬蟲跳過付費資料_資料技術|爬蟲一下,百度付費文檔輕松得,不用花錢,不用花錢,不用花錢!!!...

一.問題介紹

大家都應該有過從百度文庫下載下傳東西的經曆,對于下載下傳需要下載下傳券的文章,我們可以辦理文庫VIP(土豪的選擇):

有的人也會在某寶購買一定的下載下傳券,然後進行下載下傳。而另一些勤勤懇懇的人,則會選擇上傳文章,慢慢攢下載下傳券。任勞任怨的人,則會自己一點一點的複制粘貼,複制到word裡文字太大,那就複制到txt檔案裡。而既不想花錢又不想攢下載下傳券,也不想一點一點複制粘貼的人,會選擇“冰點文庫”這樣的下載下傳軟體,不過貌似現在“冰點文庫”已經不能使用了。但這些都太麻煩了,用爬蟲就可以輕松搞定付費文檔的文字部分内容。

之前我們已經給大家介紹了基礎爬蟲的寫法,這次我們給大家講一些更高端的使用方法。如果你之前接觸過爬蟲可能覺得裡面涉及内容太多,實在是不想學,但是接下來我給大家講的方法一點都不複雜,而且保證沒有基礎的人也能使用哦。

PS:本次推文涉及的文案、代碼以及教學視訊的下載下傳連結可以在留言區擷取哦!

請大家強烈注意,視訊由大一萌妹子花了很多很多時間精心錄制。

部分内容涉及上一篇爬蟲推文,點選一下!歡迎閱讀!

Ladies and gentlemen,it's show time!

我們以下載下傳這篇文章為例:

URL(網址):

我想,看到這樣的一個文章,如果爬取目前頁面的内容還是很好爬的吧。感覺so easy!至少我當時是這麼想的,但是當把文章翻到最下方的時候,我看到了如下内容:

呃….需要點選“繼續閱讀”才能顯示後續的内容,我單爬這一頁内容,是爬不到後續的内容的。第一個想到的方法是,抓包分析下,然後我又一次蒙逼了:

RequestURL這麼長!!最後的expire時間資訊好解決,其他的資訊呢?不想做無謂的掙紮,是以,我果斷地放棄這個方法。

問題:擷取目前頁的内容好辦,怎麼擷取接下來頁面的内容?

帶着這個思考,Selenium神器走入了我的視線。

二、預備知識

Selenium介紹

Selenium是什麼?一句話,自動化測試工具。它支援各種浏覽器,包括Chrome,Safari,Firefox等主流界面式浏覽器,如果你在這些浏覽器裡面安裝一個Selenium的插件,那麼可以友善地實作Web界面的測試。換句話說,Selenium支援多種語言的開發,比如Java,C,Ruby等等,面對我們的Python....當然也是支援的!

安裝方式:pip install selenium(下載下傳的是3.x版本的)

在cmd視窗中輸入pip指令進行下載下傳!詳細内容可以看看我們的上一篇爬蟲哦!

詳細内容可檢視官網文檔:

我們舉個小栗子:

運作這段代碼,會自動打開浏覽器,然後通路百度。

如果程式執行錯誤,浏覽器沒有打開,應該是沒有安裝并導入驅動檔案。

Windows下,下載下傳好軟體直接解壓,然後複制geckodriver.exe(或chromedriver.exe)到任何已添加到環境變量的檔案夾比如下圖的:C:\Python36等檔案夾。

當然,你不設定環境變量也是可以的,程式可以這樣寫:

上面的path\to\your\chromedriver.exe是你的chrome驅動檔案位置,可以使用絕對路徑。我們通過驅動的位置傳遞參數,也可以調用驅動,結果如下圖所示:

這樣就可以實作浏覽器的自動浏覽了,那麼這又和爬蟲有什麼關系呢?

接下來我們寫一個小程式,大家應該就能知道為什麼selenium可以應用到爬蟲技術裡面!

下面的代碼實作了模拟送出搜尋的功能,首先等頁面加載完成,然後輸入到搜尋框文本,點選送出,然後使用page_source列印送出後的頁面的源代碼。

全自動的哦,程式操控!是不是很酷炫?

其中driver.get方法會打開請求的URL(網址,WebDriver會等待頁面完全加載完成之後才會傳回,即程式會等待頁面的所有内容加載完成,JS渲染完畢之後才繼續往下執行。注意:如果這裡用到了特别多的Ajax的話,程式可能不知道是否已經完全加載完畢。

WebDriver 提供了許多尋找網頁元素的方法,譬如find_element_by_*的方法。例如一個輸入框可以通過find_element_by_name方法尋找name屬性來确定。

然後我們輸入文本再模拟點選了回車,就像我們敲擊鍵盤一樣。我們可以利用Keys這個類來模拟鍵盤輸入。

最後也最重要的一點是可以擷取網頁渲染後的源代碼。通過輸出page_source屬性即可。這樣,我們就可以做到網頁的動态爬取了!

最後我們再簡單介紹一下selenium的功能,以下功能每個會其中一個就足以寫爬蟲程式啦。不過有時候可能一種方法不管用,那麼我們就可以嘗試一下其他方法。

❶ 元素選取

element= driver.find_element_by_id("passwd-id")

//根據id屬性查找元素

element= driver.find_element_by_name("passwd")

//根據name屬性查找元素

element= driver.find_elements_by_tag_name("input")

//根據标簽的name屬性查找元素

element= driver.find_element_by_xpath("//input[@id='passwd-id']")

//根據xpath查找元素

XPath即為XML路徑語言,它是一種用來确定XML(标準通用标記語言)的子集,文檔中某部分位置的語言。

具體的索引方式大家可以直接檢視xpath參考手冊,百度xpath即可搜到。不過我之前說過不需要任何基礎就能實作爬蟲的過程,大家繼續看下去就知道怎麼回事了。

❷ 界面互動

通過元素選取,我們能夠找到元素的位置,我們可以根據這個元素的位置進行相應的事件操作,例如輸入文本框内容、滑鼠單擊、填充表單、元素拖拽等等。具體我就不細講了,想學的可以檢視官方文檔進行學習。

❸ 添加到User-Agent

使用webdriver,是可以更改User-Agent的,代碼如下:

fromselenium import webdriver

options= webdriver.ChromeOptions()

options.add_argument('user-agent="Mozilla/5.0(Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19(KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')

driver=webdriver.Chrome(chrome_options=options)driver.get

使用Android的User-Agent打開浏覽器,效果是這樣的:

Selenium就先介紹這麼多,對于本次實戰内容,已經足夠~~

三、百度文庫爬蟲

之前我賣了個關子,接下來我可以告訴大家哪怕你不懂xpath的知識,也能很輕松地在python爬蟲中用xpath找到你需要地資訊。

我們先看一下我們要爬取的這個百度文庫的網站,以火狐浏覽器為例。

我們可以右鍵單擊繼續閱讀的部分,左鍵點選檢視元素。

我們可以看到這是一個在spanclass = “moreBtn goBtn”裡的代碼,那我們用selenium裡模拟點選的方法就可以解決後續内容的爬取了。

不過我還是太小看百度文庫的前端工程師了,這個繼續閱讀的按鈕并不能通過selenium通路,因為它調用了js代碼裡的功能,而js代碼我們很難找到是哪一個。

不過解決這個問題也不難,反正是模拟真實的浏覽器登入嘛。那我們繼續模拟調用js通路(簡單來說,就是模拟點選了繼續閱讀的按鈕),代碼如下:

js= 'document.getElementsByClassName("moreBtn goBtn")[0].click();'

driver.execute_script(js)

這樣就搞定了,如果大家寫其他爬蟲時不能直接模拟一些操作,那麼就可以考慮是不是要調用js,這個方法還是屢試不爽的。

好了,接下來我們就要用xpath索引到網頁源代碼裡的文字部分。

還是和之前一樣找到内容部分,然後檢視這部分的代碼(左鍵單擊檢視元素)。

我們直接右鍵點選該源代碼,然後按照下圖進行選擇,這樣就可以直接得到這部分的xpath了,而不需要自己根據xml的規則去推xpath的寫法,不需要任何基礎,滑鼠點一點就能搞定了,這就很nice!

結果會生成這樣一個txt文檔:

格式,就需要我們自己調整一下了。

然而并沒有結束,因為雖然我們看着浏覽器自動控制很帥,但是一次兩次還好,次數一多未免太慢了。我們的時間要獻給人類的發展,怎麼能浪費在這裡呢!!再給大家介紹一個好東西——phantomjs。

我們要做的就是python+selenium+phantomjs,一個高效穩定的爬蟲就搞定了!

用法其實隻需要改一下,代碼中已經注釋起來了:

driver = webdriver.PhantomJS()

當然,千萬别忘了下載下傳phantomjs,驅動檔案的導入和之前的一樣。

以後遇到百度文庫的文字文檔要下載下傳的話,我們就可以和下載下傳券說拜拜啦,美滋滋~~~