日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

    • 簡介
    • 任務簡述
    • 實現(xiàn)過程

簡介

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

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

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

任務簡述

進入網(wǎng)站后,看云網(wǎng)站界面如下圖所示:

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

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

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

實現(xiàn)過程

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

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

import re#正則表達式 import random#隨機選擇 import subprocess# 執(zhí)行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打開這個網(wǎng)頁

運行上面的代碼就可以打開一個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()

運行上面這句話,我們看到網(wǎng)站的確響應了,出現(xiàn)了支持下載的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的方法和模擬操作的功能, 例如常用的把網(wǎng)頁往下拖, 因為有的網(wǎng)站會根據(jù)用戶下拉的情況來渲染網(wǎng)頁,越往下拉顯示的內(nèi)容越多. 具體請看selenium的官方文檔.

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

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。