目錄
一、Selenium
(一)引入
?(二)啟動(dòng)瀏覽器
二、操作
(一)點(diǎn)擊
(二)輸入
三、數(shù)據(jù)獲取
四、特點(diǎn)
五、抓取拉鉤實(shí)例
六、其他操作
(一)窗口切換
代碼
(二)操作下拉列表/無頭瀏覽器
代碼
一、Selenium
(一)引入
????????一個(gè)電影票房的網(wǎng)站里,響應(yīng)數(shù)據(jù)是一串完全看不懂的字符串,這些字串解開之后就是左邊的頁(yè)面。因?yàn)榻饷苓^程有可能很痛苦,那換個(gè)角度,能否不用 requests,而讓瀏覽器本身完成對(duì)這些數(shù)據(jù)的解密和執(zhí)行,直接顯示頁(yè)面呢
? ? ? ? 于是有思路:讓程序連接瀏覽器,讓瀏覽器完成復(fù)雜操作,此時(shí)我們只接收最終結(jié)果
????????Selenium 可以實(shí)現(xiàn),它本身是一款自動(dòng)化測(cè)試工具,可以打開瀏覽器,像人一樣操作瀏覽器,人們可以從 Selenium 中直接提取到網(wǎng)頁(yè)上的各種信息,因?yàn)榫W(wǎng)頁(yè)信息對(duì)于 Selenium 來說是透明的,其本質(zhì)就是運(yùn)行一個(gè)瀏覽器
安裝說明:
????????Selenium 的環(huán)境搭建需要安裝包、下載對(duì)應(yīng)的瀏覽器驅(qū)動(dòng)
? ? ? ? 對(duì)應(yīng)的瀏覽器驅(qū)動(dòng)放在 Python 解釋器所在的文件夾下并將名稱改為 chromedriver(Pycharm執(zhí)行結(jié)果前面的那個(gè)路徑)
?(二)啟動(dòng)瀏覽器
# 導(dǎo)入并啟動(dòng)
from selenium.webdriver import Chrome
# 1.創(chuàng)建瀏覽器對(duì)象
web=Chrome()
# 2.打開瀏覽器打開網(wǎng)址
web.get("http://www.baidu.com")
????????啟動(dòng)成功,顯示正在受自動(dòng)測(cè)試軟件控制,使用最新版的谷歌瀏覽器和驅(qū)動(dòng)啟動(dòng)后會(huì)自動(dòng)關(guān)閉瀏覽器,暫時(shí)不確定對(duì)于獲取數(shù)據(jù)會(huì)不會(huì)有影響
? ? ? ? 這樣就建立了程序和瀏覽器的關(guān)系,可以用程序使得瀏覽器跑起來(對(duì)于動(dòng)態(tài)加載的數(shù)據(jù)會(huì)很有效)?
二、操作
(一)點(diǎn)擊
? ? ? ? 打開網(wǎng)頁(yè),比如我想在這個(gè)網(wǎng)頁(yè)點(diǎn)擊“全國(guó)”這個(gè)按鈕,可以將 Xpath 復(fù)制過來
? ? ? ? ?使用 find_element(有些版本是 find_element_by_xpath)
from selenium.webdriver import Chrome
# 1.創(chuàng)建瀏覽器對(duì)象
web=Chrome()
# 2.打開瀏覽器打開網(wǎng)址
web.get("http://lagou.com")
# 找到某個(gè)元素點(diǎn)擊
el=web.find_element('xpath','//*[@id="changeCityBox"]/p[1]/a')
# 這樣子找到按鈕,可以by許多東西,有s的會(huì)知道所有element
el.click() # 點(diǎn)擊
(二)輸入
? ? ? ? 想要輸入,需要先找到輸入框,輸入后使用回車鍵,或者點(diǎn)擊搜索按鈕(與上面一直)
1.找到輸入框
2.在輸入框輸入"Python"
? ? ? ? 找到輸入框,find_element() 后使用 send_keys() 輸入
? ? ? ? 如果想按鍵盤的回車鍵,需要導(dǎo)包,使用Keys.xxx
from selenium.webdriver.common.keys import Keys
time.sleep(1)
web.find_element('xpath','//*[@id="search_input"]').send_keys('python',Keys.ENTER)
? ? ? ? ?Keys 可以操作很多鍵盤的按鍵
????????輸入前注意:上面選擇“全國(guó)”選項(xiàng)之后,若網(wǎng)站是動(dòng)態(tài)加載的,可能加載的比程序運(yùn)行的滯后,所以可能沒加載出來要找的內(nèi)容而導(dǎo)致程序報(bào)錯(cuò),所以 sleep 一秒鐘
三、數(shù)據(jù)獲取
????????現(xiàn)在其實(shí)已經(jīng)獲取了想要的內(nèi)容,找某個(gè)元素提取內(nèi)容即可,觀察網(wǎng)頁(yè)結(jié)構(gòu)每個(gè)崗位信息都在這個(gè) list 里面,循環(huán)遍歷<div class="item__10RTO">
? ? ? ? ?剛開始通過 tag name 查找,發(fā)現(xiàn)有很多個(gè) a 標(biāo)簽,就混亂了,于是根據(jù)復(fù)制的 xpath 結(jié)果來查找,也是用類似的方式繼續(xù)查找其他信息,這里我找到了薪資、公司名和崗位一些崗位信息
# for a in div_list:
# job_name=a.find_elements('tag name','a') # a標(biāo)簽
# for n in range(len(job_name)):
# print(job_name[n].text)
? ? ? ? 這里主要是通過屬性、標(biāo)簽名、xpath 的相對(duì)路徑完成對(duì)數(shù)據(jù)元素的定位
time.sleep(1)
div_list=web.find_elements('xpath','//*[@id="jobList"]/div[1]/div')
for a in div_list:
job_name=a.find_element('id','openWinPostion').text
price=a.find_element('class name','money__3Lkgq').text
company_name=a.find_element('xpath','./div[1]/div[2]/div/a').text
print(job_name,price,company_name)
# .表示從當(dāng)前節(jié)點(diǎn)開始,//表示某個(gè)父節(jié)點(diǎn)的所有后代,*為任意節(jié)點(diǎn)的id屬性為 "openWinPostion" 的文本
? ? ? ? 這里的一點(diǎn) xpath 基礎(chǔ):. 表示從當(dāng)前節(jié)點(diǎn)開始,// 表示某個(gè)父節(jié)點(diǎn)的所有后代,* 為任意節(jié)點(diǎn)的id屬性為為"openWinPostion" 的文本
????????成功
四、特點(diǎn)
? ? ? ? selenium使用便捷,易于編寫,可以屏蔽許多js加密、解密問題,但是其運(yùn)行速度較慢,且一些網(wǎng)站會(huì)針對(duì)通過 selenium 方法進(jìn)行的訪問做反爬,所以使用的時(shí)候并不是萬能的
五、抓取拉鉤實(shí)例
# 啟動(dòng)
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time
# 1.創(chuàng)建瀏覽器對(duì)象
web=Chrome()
# 2.打開瀏覽器打開網(wǎng)址
web.get("http://lagou.com")
# 找到某個(gè)元素點(diǎn)擊
el=web.find_element('xpath','//*[@id="changeCityBox"]/p[1]/a') # 這樣子找到按鈕,可以by許多東西,有s的會(huì)知道所有element
el.click() # 點(diǎn)擊
time.sleep(1)
# 找到輸入框,用 send_keys 輸入 Python
# 想要輸入鍵盤按鈕指令需要導(dǎo)包
web.find_element('xpath','//*[@id="search_input"]').send_keys('python',Keys.ENTER)
time.sleep(1)
div_list=web.find_elements('xpath','//*[@id="jobList"]/div[1]/div')
for a in div_list:
job_name=a.find_element('id','openWinPostion').text
price=a.find_element('class name','money__3Lkgq').text
company_name=a.find_element('xpath','./div[1]/div[2]/div/a').text
print(job_name,price,company_name)
# .表示從當(dāng)前節(jié)點(diǎn)開始,//表示某個(gè)父節(jié)點(diǎn)的所有后代,*為任意節(jié)點(diǎn)的id屬性為 "openWinPostion" 的文本
-------------------------------------------------------分割線---------------------------------------------------------------?
六、其他操作
? ? ? ? 以下為 selenium 的一些補(bǔ)充操作
(一)窗口切換
? ? ? ? 假設(shè)在搜索 "Python" 關(guān)鍵詞后到了新頁(yè)面后,想點(diǎn)擊進(jìn)入新窗口查看崗位描述,此時(shí)會(huì)開啟一個(gè)新窗口
? ? ? ? 注意:不同于人類視角,對(duì)于 selenium 而言,打開窗口之后其視角仍然是上一個(gè)窗口,并沒有新頁(yè)面的內(nèi)容
????????那如何對(duì)新窗口的內(nèi)容進(jìn)行提取呢,要做的就是窗口切換
web.switch_to.window(web.window_handles[-1]) # 轉(zhuǎn)移到選項(xiàng)卡為-1窗口
? ? ? ? 上面這句代碼是核心,若沒有進(jìn)行切換程序?qū)⒅苯訄?bào)錯(cuò),因?yàn)槌绦蜻B接的是原來的窗口?
? ? ? ? 這樣 selenium 就會(huì)調(diào)整到新窗口上,此時(shí)可以直接提取新窗口內(nèi)容了
job_detail=web.find_element('xpath','//*[@id="job_detail"]/dd[2]/div').text
print(job_detail)
? ? ? ? 成功
? ? ? ? 處理完后可以將新窗口關(guān)閉,記得將?selenium 視角變更回來(也可使用 switch_to_default_content() 換到最開始切換前的窗口),此時(shí)可以嘗試打印原窗口的內(nèi)容,說明視角已經(jīng)切換回來了
web.close()
web.switch_to.window(web.window_handles[0])
? ? ? ? 如果在頁(yè)面中遇到了 iframe ,想要提取里面的內(nèi)容必須先拿到 iframe 然后切換視角到 iframe ,然后再拿到數(shù)據(jù),用下面這個(gè)函數(shù)即可
? ? ? ? 切換到 iframe 后進(jìn)行 find 就是以 iframe 里面為準(zhǔn)了
代碼
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time
# 創(chuàng)建瀏覽器對(duì)象
web = Chrome()
# 打開瀏覽器打開網(wǎng)址
web.get("http://lagou.com")
# 找到某個(gè)元素點(diǎn)擊
el = web.find_element('xpath', '//*[@id="changeCityBox"]/p[1]/a')
el.click() # 點(diǎn)擊
time.sleep(1)
web.find_element('xpath', '//*[@id="search_input"]').send_keys('python', Keys.ENTER)
time.sleep(1)
web.find_element('xpath', '//*[@id="openWinPostion"]').click()
time.sleep(1)
web.switch_to.window(web.window_handles[-1]) # 轉(zhuǎn)移到選項(xiàng)卡為-1窗口
job_detail = web.find_element('xpath', '//*[@id="job_detail"]/dd[2]/div').text
print(job_detail)
web.close()
web.switch_to.window(web.window_handles[0])
print(web.find_element('xpath', '//*[@id="openWinPostion"]'))
(二)操作下拉列表/無頭瀏覽器
? ? ? ? 回到原來的那個(gè)票房網(wǎng)頁(yè)
from selenium.webdriver import Chrome
web = Chrome()
web.get("https://www.endata.com.cn/BoxOffice/BO/Year/index.html")
????????打開瀏覽器,這里可以選擇年份(需要點(diǎn)擊),這是通過網(wǎng)頁(yè)的 select 標(biāo)簽存放的
? ? ? ? 這個(gè)列表這個(gè)是通過 css 動(dòng)態(tài)加載的,不需要鼠標(biāo)點(diǎn)擊就能出現(xiàn)
????????如何處理下拉框?qū)δ攴葸M(jìn)行篩選:先定位到下拉框,使用 selenium 拿到該節(jié)點(diǎn)
? ? ? ? 在拿到該節(jié)點(diǎn)之后由于是一個(gè)下拉列表,需要對(duì)元素包裝一下,包裝成一個(gè)下拉菜單,這樣就可以調(diào)整 select 的位置了。
sel=Select(sel_el) # 把元素放進(jìn)去包裝成 Select 類型的東西
print(sel,type(sel),id(sel))
<selenium.webdriver.support.select.Select object at 0x00000269EFA82910> <class 'selenium.webdriver.support.select.Select'> 2654015596816
# 是一個(gè)select類型的對(duì)象
? ? ? ? 如圖不同年份之間的選項(xiàng)是以不同的 option 存儲(chǔ)的,我想隨意切換所有選項(xiàng)如何做?幾乎固定的操作:
# 讓瀏覽器調(diào)整選項(xiàng)讓瀏覽器調(diào)整選項(xiàng)
for i in range(len(sel.options)): # 下拉框的所有選項(xiàng)的長(zhǎng)度,i是下拉框每個(gè)選項(xiàng)索引位置
sel.select_by_index(i) # 按照索引進(jìn)行切換
# time.sleep(3)
movie_table=web.find_element('xpath','//*[@id="TableList"]/table')
print(movie_table.text)
? ? ? ? 代碼解釋:根據(jù)下拉框選項(xiàng)的長(zhǎng)度循環(huán),按索引進(jìn)行選擇,找到數(shù)據(jù),打印
? ? ? ? 除了剛剛的索引,可以根據(jù)以下三種方法進(jìn)行下拉框選擇,區(qū)分三個(gè) by:
文章來源:http://www.zghlxwxcb.cn/news/detail-723068.html
????????無頭瀏覽器就是讓瀏覽器在后臺(tái)默默運(yùn)行,如果不想看到瀏覽器運(yùn)行界面,可以對(duì)生成的web對(duì)象做配置文章來源地址http://www.zghlxwxcb.cn/news/detail-723068.html
from selenium.webdriver.chrome.options import Options
# 設(shè)置參數(shù)
opt=Options()
opt.add_argument("--headless") # 無頭
opt.add_argument("--disable-gpu") #不用顯卡
web = Chrome(options=opt) # 參數(shù)配置到瀏覽器中
代碼
from selenium.webdriver import Chrome
from selenium.webdriver.support.select import Select
import time
from selenium.webdriver.chrome.options import Options
# 設(shè)置參數(shù)
opt=Options()
opt.add_argument("--headless") # 無頭
opt.add_argument("--disable-gpu") #不用顯卡
web = Chrome(options=opt)
web.get("https://www.endata.com.cn/BoxOffice/BO/Year/index.html")
# 定位到下拉列表,拿到節(jié)點(diǎn)
sel_el=web.find_element('xpath','//*[@id="OptionDate"]')
time.sleep(1)
sel=Select(sel_el) # 把元素放進(jìn)去包裝成 Select 類型的東西
# 讓瀏覽器調(diào)整選項(xiàng)讓瀏覽器調(diào)整選項(xiàng)
for i in range(len(sel.options)): # 下拉框的所有選項(xiàng)的長(zhǎng)度,i是下拉框每個(gè)選項(xiàng)索引位置
sel.select_by_index(i) # 按照索引進(jìn)行切換
# time.sleep(3)
movie_table=web.find_element('xpath','//*[@id="TableList"]/table')
print(movie_table.text)
到了這里,關(guān)于Python爬蟲——Selenium在獲取網(wǎng)頁(yè)數(shù)據(jù)方面的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!