Python爬虫用Selenium抓取js生成的文件(一)
- 簡介
- 任務(wù)簡述
- 實(shí)現(xiàn)過程
簡介
我最近在看關(guān)于計(jì)算機(jī)的一些書籍,發(fā)現(xiàn)了這個電子書清單:計(jì)算機(jī)開放電子書匯總, 和大家分享一下. 我在下載其中的書籍時被導(dǎo)向了這個很好的計(jì)算機(jī)電子書網(wǎng)站KanCloud看云,里面有非常多的實(shí)用的編程方面的電子書,很多是該網(wǎng)站自己用html生成的,格式多樣,包括pdf,epub,mobi. 在此表示感謝,強(qiáng)烈推薦.
于是,我準(zhǔn)備用之前的靜態(tài)網(wǎng)頁爬蟲來批量下載,發(fā)現(xiàn)書籍的鏈接是javascript生成的,而且難以解析(我還會寫一篇抓取可以解析js的網(wǎng)站的博客). 這時我們可以用selenium來模擬瀏覽器的動作,例如下拉或者點(diǎn)擊button之類的. 然后在看云網(wǎng)站里模擬下載.
要得到一個可以穩(wěn)健運(yùn)行的爬蟲, 需要考慮一些細(xì)節(jié)問題, 因此分兩篇來說,本篇先給出一個示例,了解工作的過程.
任務(wù)簡述
進(jìn)入網(wǎng)站后,看云網(wǎng)站界面如下圖所示:
要下載全部電子書,我們需要抓取70個page, 每個page有12本書,每本書有一個單獨(dú)的頁面,而且有的書籍不提供下載,有的可以下載多種格式.
因此, 我們的任務(wù)如下:
1. 解析首頁,得到最大頁碼
2. 解析單個頁面,得到該頁書籍鏈接列表
3. 進(jìn)入書籍頁面
* 判斷是否可以下載
* 可以下載則下載所有格式的書籍
其次, 為了獲得爬蟲的魯棒性, 我們要保證每次網(wǎng)頁都加載成功,文件下載都完成了,在下面的內(nèi)容里我會一步步介紹.
實(shí)現(xiàn)過程
Selenium可以模擬打開瀏覽器,在這之前我們要下載瀏覽器的驅(qū)動器.在本文里,我們使用chrome瀏覽器,Firefox也是常用的瀏覽器,使用步驟差不多,不再贅述.
Selenium的安裝:
sudo pip install selenium
然后下載chrome的webdriver, 直接保存在本地,例如/usr/bin, 然后設(shè)置selenium的基本設(shè)置
運(yùn)行上面的代碼就可以打開一個chrome標(biāo)簽頁了, 如下圖所示:
點(diǎn)擊下載按鈕,我們看到有三個可以下載的選項(xiàng)PDF, epub, mobi. 要模擬click action, 我們需要得到該element的位置. 這時我們可以借助chrome的inspect功能, 快捷鍵是Ctrl+shift+I, 或者把鼠標(biāo)懸浮在下載上,點(diǎn)擊右鍵選擇inspect,效果如下圖:
選中右邊高亮的代碼,右鍵->copy->copy xpath,即可得到該element的xpath
//*[@id="manualDownload"]/span/b再利用webdriver本身的xpath搜索功能得到該element,并模擬click操作
driver.find_element_by_xpath('//*[@id="manualDownload"]/span/b').click()運(yùn)行上面這句話,我們看到網(wǎng)站的確響應(yīng)了,出現(xiàn)了支持下載的3種電子書格式. 這一步的點(diǎn)擊下載按鈕是必須的,否則直接click epub會報element not visible的錯誤. 接下來我們示范下載epub, 將鼠標(biāo)懸浮在epub上,右鍵查看,即可得到下載epub的xpath,同上操作
driver.find_element_by_xpath('//*[@id="manualDownload"]/div/div/ul/li[2]/a').click()這樣我們就可以把這個epub電子書下載到我們指定的路徑了.
Selenium的基本應(yīng)用就是這樣了. 它還有一些其它的定位element的方法和模擬操作的功能, 例如常用的把網(wǎng)頁往下拖, 因?yàn)橛械木W(wǎng)站會根據(jù)用戶下拉的情況來渲染網(wǎng)頁,越往下拉顯示的內(nèi)容越多. 具體請看selenium的官方文檔.
我們將以上過程針對每一個page每一本書執(zhí)行,即可爬取全站的書籍了,前提是你的網(wǎng)速足夠快,運(yùn)氣足夠好. 這是因?yàn)樵谶B續(xù)爬取時,會出現(xiàn)一些異常,例如
1. webdriver打開網(wǎng)頁會失敗
2. 下載還沒完成就打開下一個網(wǎng)頁,造成webdriver負(fù)擔(dān)過大從而加載網(wǎng)頁失敗
3. 網(wǎng)站可能會根據(jù)IP地址反爬蟲
在下一篇中我們會解決以上問題,并用多進(jìn)程加快速度(webdriver打開網(wǎng)頁實(shí)在太慢).
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Python爬虫用Selenium抓取js生成的文件(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 25-if嵌套语句
- 下一篇: c语言求100以内整除13的最大,VB程