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

歡迎訪問 生活随笔!

生活随笔

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

python

python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息

發(fā)布時間:2023/12/4 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Selenium 簡介

該系列專欄上一篇爬蟲文章點擊這里。

網(wǎng)站復雜度增加,爬蟲編寫的方式也會隨著增加。使用Selenium 可以通過簡單的方式抓取復雜的網(wǎng)站頁面,得到想要的信息。

Selenium 是操作瀏覽器進行自動化,例如自動化訪問網(wǎng)站,點擊按鈕,進行信息采集,對比直接使用bs4 抓取信息,Selenium的抓取速度是有很大缺陷,但是如果抓取頁面不多,頁面復雜時,使用Selenium是個不錯的選擇。
本文將會使用Selenium 進行一些簡單的抓取,想要深入學習Selenium 可以查看我之前寫過的 《selenium3 底層剖析》 上 下 兩篇。

Selenium 使用注意

在使用 Selenium前需要安裝 Selenium,使用pip命令,安裝如下:

pip install selenium

安裝完成 Selenium 還需要下載一個驅(qū)動。

  • 谷歌瀏覽器驅(qū)動:驅(qū)動版本需要對應瀏覽器版本,不同的瀏覽器使用對應不同版本的驅(qū)動,點擊下載
  • 如果是使用火狐瀏覽器,查看火狐瀏覽器版本,點擊
    GitHub火狐驅(qū)動下載地址
    下載(英文不好的同學右鍵一鍵翻譯即可,每個版本都有對應瀏覽器版本的使用說明,看清楚下載即可)

作者的環(huán)境說明如下:

  • 操作系統(tǒng):Windows7 SP1 64
  • python 版本:3.7.7
  • 瀏覽器:谷歌瀏覽器
  • 瀏覽器版本: 80.0.3987 (64 位)

下載好驅(qū)動后,必須把驅(qū)動給配置到系統(tǒng)環(huán)境,或者丟到你python的根目錄下。

正式開始

首先在代碼中引入 selenium

from selenium import webdriver

可能有些讀者沒有把驅(qū)動配置到環(huán)境中,接下來我們可以指定驅(qū)動的位置:

driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe')

以上代碼調(diào)用Chrome 方法并且配置驅(qū)動地址(這里使用 executable_path 指定驅(qū)動地址)為“F:\python\dr\chromedriver_win32\chromedriver.exe”,這時就可以指定了驅(qū)動位置,也可以不用配置到環(huán)境了。
這時運行一下代碼,查看是否會打開一個瀏覽器。

這時將會成功打開谷歌瀏覽器。
這時 driver 變量為瀏覽器對象,通過 driver 操作瀏覽器,使用get方法可以訪問一個網(wǎng)址。這時我們可以訪問 百度。代碼如下:

from selenium import webdriver driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe') driver.get("http://baidu.com")

成功打開百度搜索界面:

例如我們想搜索爬蟲,使用selenium實現(xiàn)自動搜索。首先需要了解的一個函數(shù)為 find_element_by_id,該函數(shù)可以通過id 找到界面元素。在html中,大部分有特殊作用的元素會賦予一個id,搜索時需要填寫的是百度搜索關鍵字的文本框,將鼠標移動到文本框,對準文本框點擊鼠標右鍵,點擊檢查可以查看元素。

點擊檢查后將會出現(xiàn)一個源碼窗口:

其中input為文本框元素,id的值是 kw。
這時得知了文本框的id 值為kw,可以使用 find_element_by_id 函數(shù)給予id值,找到元素對象,并且可以操作元素對象進行增刪操作。由于 find_element_by_id 是瀏覽器對象的方法,使用瀏覽器對象調(diào)用,代碼如下:

input = driver.find_element_by_id('kw')

這時還差向該對象輸入要搜索的值。使用 send_keys 方法可以自動鍵入值,編寫如下:

input.send_keys("爬蟲")

其中input是剛剛獲取的元素對象。這時運行代碼查看效果:

這時自動鍵入了要搜索的關鍵幀“爬蟲”。接下來根據(jù)之前的步驟,應該找到 百度一下 按鈕的id,隨后點擊即可。通過相同的流程,得到百度一下 按鈕的html代碼:

<input type="submit" id="su" value="百度一下" class="bg s_btn">

得到id為su,使用 find_element_by_id 得到元素對象:

enter = driver.find_element_by_id('su')

該元素調(diào)用click方法即可進行點擊:

enter.click()

最終代碼如下:

from selenium import webdriver driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe') driver.get("https://www.baidu.com/") input = driver.find_element_by_id('kw') input.send_keys("爬蟲") enter = driver.find_element_by_id('su') enter.click()

運行結(jié)果如下:

信息獲取

能夠進行自動打開了,下一步接下來需要做的就是獲取搜索的信息。
在這里需要介紹一個知識點 xpath,我們可以理解xpath就像 x,y坐標一樣的東西,用于html或者說xml語言中的定位,表示一個位置。簡單的使用并不需要去學習它如何編寫,因為從瀏覽器中我們可以直接得到。

如下圖,我們右鍵搜索出來了信息第一個標題,點擊檢查后會出現(xiàn)源代碼。在源代碼中右鍵,選擇Copy之后點擊Copy XPath,這時我們就把當前這個元素的XPath獲取了。

獲取到了XPath后,復制到文本框,查看是如下形式:

//*[@id="3001"]/div[1]/h3/a

在這里注意,理論上每一個頁面的第一行結(jié)果都將會是該XPath,并不需要每一頁都去獲取,但也有情況不一致的時候,具體情況得具體分析。
我們簡單實用XPath不需要了解過多,接下來可以使用 find_element_by_xpath 獲取到當前元素對象。

res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')

獲取到元素對象后,可以調(diào)用該元素對象的text屬性獲取到當前文本值:

print(res_element.text)

完整代碼如下:

from selenium import webdriver import time driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe') driver.get("https://www.baidu.com/") input = driver.find_element_by_id('kw') input.send_keys("爬蟲") enter = driver.find_element_by_id('su') enter.click() time.sleep(2)res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a') print(res_element.text)

以上代碼中 time.sleep(2) 是為了等待點擊搜索后頁面加載數(shù)據(jù),不然會獲取不到對象。
結(jié)果如下:

以上省略了瀏覽器自動打開并搜索內(nèi)容的過程,直接查看了結(jié)果。
那么我們每一頁都獲取第一個結(jié)果,這時只需要自動點擊下一頁后獲取即可。
首先得到下一頁按鈕的元素對象:

復制XPath值為:

//*[@id="page"]/div/a[10]

則獲取下一頁對象并且點擊跳轉(zhuǎn)的代碼為:

nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]') nextbtn_element.click()

運行后發(fā)現(xiàn)成功跳轉(zhuǎn)到第二頁,接下來可以繼續(xù)獲取搜索欄的第一個對象,可以使用循環(huán)實現(xiàn)這個過程,我們設定去搜索前10頁的所有第一個結(jié)果值,這時所有代碼可以寫為:

from selenium import webdriver import time driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe') driver.get("https://www.baidu.com/") input = driver.find_element_by_id('kw') input.send_keys("爬蟲") enter = driver.find_element_by_id('su') enter.click() time.sleep(2)for _ in range(10):res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')print(res_element.text)nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]')nextbtn_element.click()time.sleep(2)

for 循環(huán)最下面的停止2秒是為了點擊下一頁后數(shù)據(jù)進行加載的等待時間。
運行后,結(jié)果發(fā)現(xiàn)報錯:

我們的12行為:

res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a')

那么在這里應該是 //*[@id="3001"]/div[1]/h3/a 定位錯誤,沒有找到該定位的元素。我們查看第一頁、第二頁、第三頁的第一條結(jié)果進行對比:

第一頁://*[@id="3001"]/div[1]/h3/a 第二頁://*[@id="11"]/h3/a 第三頁://*[@id="21"]/h3/a 第四頁://*[@id="31"]/h3/a 第五頁://*[@id="41"]/h3/a

從以上數(shù)據(jù)得知,只有第一頁的XPath 不同,其它的XPath都遵循從11-21-31-41 每一頁加10的規(guī)律。
并且發(fā)現(xiàn)下一頁按鈕的 XPath也發(fā)生了改變,變成了:

//*[@id="page"]/div/a[11]

完整代碼如下:

from selenium import webdriver import time #請求網(wǎng)頁 driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe') driver.get("https://www.baidu.com/") #輸入并且搜索 input = driver.find_element_by_id('kw') input.send_keys("爬蟲") enter = driver.find_element_by_id('su') enter.click() #等待2秒加載 time.sleep(2) #獲取第一個結(jié)果并且點擊下一頁 res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a') print(res_element.text) nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]') nextbtn_element.click() time.sleep(2)#設置一個變量start start=1 #循環(huán)點擊下一頁 并且獲取第一條數(shù)據(jù) for _ in range(10):start+=10xpath_val=r'//*[@id="'+str(start)+r'"]/h3/a' #//*[@id="11"]/h3/ares_element=driver.find_element_by_xpath(xpath_val)print(res_element.text)nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[11]')#//*[@id="page"]/div/a[11] //*[@id="page"]/div/a[11]nextbtn_element.click()time.sleep(2)

以上代碼中:

from selenium import webdriver import time #請求網(wǎng)頁 driver = webdriver.Chrome(executable_path=r'F:\python\dr\chromedriver_win32\chromedriver.exe') driver.get("https://www.baidu.com/") #輸入并且搜索 input = driver.find_element_by_id('kw') input.send_keys("爬蟲") enter = driver.find_element_by_id('su') enter.click() #等待2秒加載 time.sleep(2) #獲取第一個結(jié)果并且點擊下一頁 res_element=driver.find_element_by_xpath('//*[@id="3001"]/div[1]/h3/a') print(res_element.text) nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]') nextbtn_element.click() time.sleep(2)

為之前的代碼,新增循環(huán)為遍歷下一頁以及獲取第一個結(jié)果:

#設置一個變量start start=1 #循環(huán)點擊下一頁 并且獲取第一條數(shù)據(jù) for _ in range(10):start+=10xpath_val=r'//*[@id="'+str(start)+r'"]/h3/a' #//*[@id="11"]/h3/ares_element=driver.find_element_by_xpath(xpath_val)print(res_element.text)nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[11]')#//*[@id="page"]/div/a[11] //*[@id="page"]/div/a[11]nextbtn_element.click()time.sleep(2)

首先設置一個start,因為第二頁是 XPath 中變化的值為11-21-31…,設置一個變量為1,每次加10即可,所以在循環(huán)中,第一句為:

start+=10

由于XPath的值其它字符串沒變化,所以整一條XPath語句可以寫為:

xpath_val=r'//*[@id="'+str(start)+r'"]/h3/a'

之后傳入xpath函數(shù)獲取元素即可:

res_element=driver.find_element_by_xpath(xpath_val)

接下來的語句都沒有太大變化,只有按鈕的XPath有變化,所以更改了XPath。其它代碼均和之前的相似。最終運行結(jié)果如下:

由于有一些其它信息所以打碼了,這就是一個簡單的selenium爬蟲編寫方式,之后將會持續(xù)更新爬蟲系列。

總結(jié)

以上是生活随笔為你收集整理的python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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