一、selenium引入概述
我們在抓取⼀些普通⽹⻚的時候requests基本上是可以滿⾜的,但是,如果遇到⼀些特殊的⽹站,它的資料是經過加密的,但是浏覽器卻能夠正常顯示出來。那我們通過requests抓取到的内容可能就不是我們想要的結果了。 例如,電影票房資料,在浏覽器上看的時候是正常的。那麼按照之前的邏輯,我們隻需要看看資料是通過哪個請求拿到的就可以進⾏模拟請求了。
但是!

簡單介紹⼀下selenium, 它本身是⼀個⾃動化測試的⼯具. 可以啟動⼀個全新的浏覽器.并從浏覽器中提取到你想要的内容. 随着各種⽹站的反爬機制的出現. selenium越來越受到各位爬sir的喜愛.
selenium最⼤的缺點其實就⼀個, 慢! 你想啊. 他要啟動⼀個第三⽅的軟體(浏覽器), 并且還要等待浏覽器把資料渲染完畢. 這個過程必然是很耗時的. 是以它慢.
接下來, 我們來聊聊selenium如何安裝和使⽤.
就像其他第三⽅庫⼀樣, selenium直接⽤pip就可以安裝了
pip install selenium
但是呢, 它與其他庫不同的地⽅是他要啟動你電腦上的浏覽器, 這就需要⼀個驅動程式來輔助.
chrome驅動位址:https://npm.taobao.org/mirrors/chromedriver
這⾥推薦⽤chrome浏覽器. 其他浏覽器的驅動請⾃⾏百度.
我這裡是windows系統就選擇win32
然後關鍵的來了. 把你下載下傳的浏覽器驅動放在程式所在的⽂件夾. 或者放到python解釋器所在的⽂件夾. 兩種⼆選其⼀.
python解釋器的檔案夾在Console上便能看到
OK~ 前期準備⼯作完畢. 上代碼看看, selenium是個什麼⻤
# 讓selenium啟動谷歌浏覽器
from selenium.webdriver import Chrome
# 1.建立浏覽器對象
web = Chrome()
# 2.打開一個網址
web.get("http://www.baidu.com")
print(web.title)
運⾏⼀下你會發現神奇的事情發⽣了. 浏覽器⾃動打開了. 并且輸⼊了⽹址. 也能拿到⽹⻚上的title标題.
二、selenium各種神奇操作
selenium不但可以打開浏覽器. 還可以對浏覽器各種操作. ⽐如, 點 擊, 查找. 都可以.
我們直接上案例. 抓取拉鈎⽹招聘python⼯程師的招聘資訊
1、準備⼯作
2、點選-全國按鈕
想要點選這個按鈕. 我們需要先定位到這個按鈕. 然後再點選selenium想要定位某個元素. 太簡單了.
web = Chrome()
web.get("http://lagou.com")
# 找到某個元素. 點選它
el = web.find_element_by_xpath('//*[@id="changeCityBox"]/ul/li[1]/a')
el.click() # 點選事件
3、搜尋python
⼈的過程: 找到⽂本框輸⼊"python", 點選"搜尋"按鈕.
機器的過程: 找到⽂本框輸⼊"python", 點選"搜尋"按鈕.
發現沒, ⽤selenium最爽的地⽅就是這⾥. ⼈是怎麼操作的. 機器就怎麼操作.
web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python")
web.find_element_by_xpath('//*[@id="search_button"]').click()
send_keys() 這⾥要說⼀下. 如果我們給出的是⼀個字元串. 就是輸⼊⽂本. 但是, 如果給出的是⼀個鍵盤指令, 那就按下鍵盤. ⽐ 如, 我想要按回⻋按鈕. 就是這樣的
# 找到輸入框. 輸入python => 輸入回車/點選搜尋按鈕
web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)
4、提取招聘資訊
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys # 鍵盤指令
import time
web = Chrome()
web.get("http://lagou.com")
# 找到某個元素. 點選它
el = web.find_element_by_xpath('//*[@id="changeCityBox"]/ul/li[1]/a')
el.click() # 點選事件
time.sleep(1) # 讓浏覽器緩一會兒 等ajax資料加載
# 找到輸入框. 輸入python => 輸入回車/點選搜尋按鈕
web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)
time.sleep(1)
# 查找存放資料的位置. 進行資料提取
# 找到頁面中存放資料的所有的li
li_list = web.find_elements_by_xpath('//*[@id="s_position_list"]/ul/li')
for li in li_list:
job_name = li.find_element_by_tag_name("h3").text
job_price = li.find_element_by_xpath("./div[1]/div[1]/div[2]/div/span").text
company_name = li.find_element_by_xpath('./div[1]/div[2]/div/a').text
print(company_name, job_name, job_price)
# 自動屏蔽掉了一些js加密解密問題,輕松多了
5、多視窗排程
上面說到我們已經可以通過selenium拿到拉鈎⽹的招聘資訊了. 但是, 資訊不夠全⾯. 我們希望得到的不僅僅是⼀個崗位名稱和公司名稱, 我更想知道更加詳細的職位描述以及崗位要求
此時問題就來了. 我們可以在搜尋⻚⾯點選進⼊到這個詳情⻚. 然後就可以看到想要的職位描述了. 但是, 這時就涉及到如何從⼀個窗⼝轉向另⼀個窗⼝了(切換頁籤).
⾸先, 我們先通過selenium定位到搜尋⻚上的職位超連結
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time
web = Chrome()
web.get("http://lagou.com")
web.find_element_by_xpath('//*[@id="cboxClose"]').click()
time.sleep(1)
web.find_element_by_xpath('//*[@id="search_input"]').send_keys("python", Keys.ENTER)
time.sleep(1)
web.find_element_by_xpath('//*[@id="s_position_list"]/ul/li[1]/div[1]/div[1]/div[1]/a/h3').click()
注意! 我們看到的是新窗⼝的内容, 但是在selenium的視⻆⾥, 窗⼝依然停留在剛才那個窗⼝. 此時, 必須要将窗⼝調整到最新的窗⼝上才可以
# 如何進入到進視窗中進行提取
# 注意, 在selenium的眼中. 新視窗預設是不切換過來的. -1最後一個視窗
web.switch_to.window(web.window_handles[-1])
# 在新視窗中提取内容
job_detail = web.find_element_by_xpath('//*[@id="job_detail"]/dd[2]/div').text
print(job_detail)
6 、無頭浏覽器
我們已經基本了解了selenium的基本使⽤了. 但是呢, 不知各位有沒有發現, 每次打開浏覽器的時間都⽐較⻓. 這就⽐較耗時了. 我們寫的是爬⾍程式. ⽬的是資料. 并不是想看⽹⻚. 那能不能讓浏覽器在背景跑呢? 答案是可以的,隻需要配置好參數即可。
# 準備好參數配置
opt = Options()
# 無頭
opt.add_argument("--headless")
# 不顯示 讓程式在背景運作
opt.add_argument("--disbale-gpu")
web = Chrome(options=opt) # 把參數配置設定到浏覽器中
直接上案例吧. 拿出最開始我們看到的那個⽹⻚. 抓取電影票房.
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.select import Select
import time
# 準備好參數配置
opt = Options()
# 無頭
opt.add_argument("--headless")
# 不顯示 讓程式在背景運作
opt.add_argument("--disbale-gpu")
web = Chrome(options=opt) # 把參數配置設定到浏覽器中
web.get("https://www.endata.com.cn/BoxOffice/BO/Year/index.html")
time.sleep(2)
# 定位到下拉清單
sel_el = web.find_element_by_xpath('//*[@id="OptionDate"]')
# 對元素進行包裝, 包裝成下拉菜單
sel = Select(sel_el)
# 讓浏覽器進行調整選項
for i in range(len(sel.options)): # i就是每一個下拉框選項的索引位置
sel.select_by_index(i) # 按照索引進行切換
time.sleep(2)
table = web.find_element_by_xpath('//*[@id="TableList"]/table')
print(table.text) # 列印所有文本資訊
print("===================================")
print("運作完畢. ")
web.close()
# 如何拿到頁面代碼Elements(經過資料加載以及js執行之後的結果的html内容)
print(web.page_source)
三、超級鷹解決驗證碼
作者:王陸