日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Python爬虫用Selenium抓取js生成的文件(一)

發布時間:2024/7/19 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬虫用Selenium抓取js生成的文件(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

    • 簡介
    • 任務簡述
    • 實現過程

簡介

我最近在看關于計算機的一些書籍,發現了這個電子書清單:計算機開放電子書匯總, 和大家分享一下. 我在下載其中的書籍時被導向了這個很好的計算機電子書網站KanCloud看云,里面有非常多的實用的編程方面的電子書,很多是該網站自己用html生成的,格式多樣,包括pdf,epub,mobi. 在此表示感謝,強烈推薦.

于是,我準備用之前的靜態網頁爬蟲來批量下載,發現書籍的鏈接是javascript生成的,而且難以解析(我還會寫一篇抓取可以解析js的網站的博客). 這時我們可以用selenium來模擬瀏覽器的動作,例如下拉或者點擊button之類的. 然后在看云網站里模擬下載.

要得到一個可以穩健運行的爬蟲, 需要考慮一些細節問題, 因此分兩篇來說,本篇先給出一個示例,了解工作的過程.

任務簡述

進入網站后,看云網站界面如下圖所示:

要下載全部電子書,我們需要抓取70個page, 每個page有12本書,每本書有一個單獨的頁面,而且有的書籍不提供下載,有的可以下載多種格式.

因此, 我們的任務如下:
1. 解析首頁,得到最大頁碼
2. 解析單個頁面,得到該頁書籍鏈接列表
3. 進入書籍頁面
* 判斷是否可以下載
* 可以下載則下載所有格式的書籍

其次, 為了獲得爬蟲的魯棒性, 我們要保證每次網頁都加載成功,文件下載都完成了,在下面的內容里我會一步步介紹.

實現過程

Selenium可以模擬打開瀏覽器,在這之前我們要下載瀏覽器的驅動器.在本文里,我們使用chrome瀏覽器,Firefox也是常用的瀏覽器,使用步驟差不多,不再贅述.

Selenium的安裝:
sudo pip install selenium
然后下載chrome的webdriver, 直接保存在本地,例如/usr/bin, 然后設置selenium的基本設置

import re#正則表達式 import random#隨機選擇 import subprocess# 執行bash命令 from multiprocessing import Pool#建立線程池,并行爬取加快速度 from selenium import webdriver# set chromedriver path and download path chromeOptions = webdriver.ChromeOptions()dl_path="~/Downloads/KanCloud"#設置下載路徑 chromedriver="/usr/bin/chromedriver"#修改為你的chromedriver路徑prefs = {"download.default_directory" : dl_path} chromeOptions.add_experimental_option("prefs",prefs)#可以為webdriver設置代理,自動獲得代理IP地址下面會解釋,這里注釋掉 #PROXY='1.82.216.134:80' #chromeOptions.add_argument('--proxy-server=%s' % PROXY)# url_start='http://www.kancloud.cn/explore/top'#建立一個webdriver對象 driver = webdriver.Chrome(chrome_options=chromeOptions) driver.get('http://www.kancloud.cn/digest/ios-mac-study')#用chrome打開這個網頁

運行上面的代碼就可以打開一個chrome標簽頁了, 如下圖所示:

點擊下載按鈕,我們看到有三個可以下載的選項PDF, epub, mobi. 要模擬click action, 我們需要得到該element的位置. 這時我們可以借助chrome的inspect功能, 快捷鍵是Ctrl+shift+I, 或者把鼠標懸浮在下載上,點擊右鍵選擇inspect,效果如下圖:

選中右邊高亮的代碼,右鍵->copy->copy xpath,即可得到該element的xpath

//*[@id="manualDownload"]/span/b

再利用webdriver本身的xpath搜索功能得到該element,并模擬click操作

driver.find_element_by_xpath('//*[@id="manualDownload"]/span/b').click()

運行上面這句話,我們看到網站的確響應了,出現了支持下載的3種電子書格式. 這一步的點擊下載按鈕是必須的,否則直接click epub會報element not visible的錯誤. 接下來我們示范下載epub, 將鼠標懸浮在epub上,右鍵查看,即可得到下載epub的xpath,同上操作

driver.find_element_by_xpath('//*[@id="manualDownload"]/div/div/ul/li[2]/a').click()

這樣我們就可以把這個epub電子書下載到我們指定的路徑了.

Selenium的基本應用就是這樣了. 它還有一些其它的定位element的方法和模擬操作的功能, 例如常用的把網頁往下拖, 因為有的網站會根據用戶下拉的情況來渲染網頁,越往下拉顯示的內容越多. 具體請看selenium的官方文檔.

我們將以上過程針對每一個page每一本書執行,即可爬取全站的書籍了,前提是你的網速足夠快,運氣足夠好. 這是因為在連續爬取時,會出現一些異常,例如
1. webdriver打開網頁會失敗
2. 下載還沒完成就打開下一個網頁,造成webdriver負擔過大從而加載網頁失敗
3. 網站可能會根據IP地址反爬蟲

在下一篇中我們會解決以上問題,并用多進程加快速度(webdriver打開網頁實在太慢).

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Python爬虫用Selenium抓取js生成的文件(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。