python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息
Selenium 簡介
該系列專欄上一篇爬蟲文章點(diǎn)擊這里。
網(wǎng)站復(fù)雜度增加,爬蟲編寫的方式也會隨著增加。使用Selenium 可以通過簡單的方式抓取復(fù)雜的網(wǎng)站頁面,得到想要的信息。
Selenium 是操作瀏覽器進(jìn)行自動化,例如自動化訪問網(wǎng)站,點(diǎn)擊按鈕,進(jìn)行信息采集,對比直接使用bs4 抓取信息,Selenium的抓取速度是有很大缺陷,但是如果抓取頁面不多,頁面復(fù)雜時(shí),使用Selenium是個(gè)不錯(cuò)的選擇。
本文將會使用Selenium 進(jìn)行一些簡單的抓取,想要深入學(xué)習(xí)Selenium 可以查看我之前寫過的 《selenium3 底層剖析》 上 下 兩篇。
Selenium 使用注意
在使用 Selenium前需要安裝 Selenium,使用pip命令,安裝如下:
pip install selenium安裝完成 Selenium 還需要下載一個(gè)驅(qū)動。
- 谷歌瀏覽器驅(qū)動:驅(qū)動版本需要對應(yīng)瀏覽器版本,不同的瀏覽器使用對應(yīng)不同版本的驅(qū)動,點(diǎn)擊下載
- 如果是使用火狐瀏覽器,查看火狐瀏覽器版本,點(diǎn)擊
GitHub火狐驅(qū)動下載地址
下載(英文不好的同學(xué)右鍵一鍵翻譯即可,每個(gè)版本都有對應(yīng)瀏覽器版本的使用說明,看清楚下載即可)
作者的環(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”,這時(shí)就可以指定了驅(qū)動位置,也可以不用配置到環(huán)境了。
這時(shí)運(yùn)行一下代碼,查看是否會打開一個(gè)瀏覽器。
這時(shí)將會成功打開谷歌瀏覽器。
這時(shí) driver 變量為瀏覽器對象,通過 driver 操作瀏覽器,使用get方法可以訪問一個(gè)網(wǎng)址。這時(shí)我們可以訪問 百度。代碼如下:
成功打開百度搜索界面:
例如我們想搜索爬蟲,使用selenium實(shí)現(xiàn)自動搜索。首先需要了解的一個(gè)函數(shù)為 find_element_by_id,該函數(shù)可以通過id 找到界面元素。在html中,大部分有特殊作用的元素會賦予一個(gè)id,搜索時(shí)需要填寫的是百度搜索關(guān)鍵字的文本框,將鼠標(biāo)移動到文本框,對準(zhǔn)文本框點(diǎn)擊鼠標(biāo)右鍵,點(diǎn)擊檢查可以查看元素。
點(diǎn)擊檢查后將會出現(xiàn)一個(gè)源碼窗口:
其中input為文本框元素,id的值是 kw。
這時(shí)得知了文本框的id 值為kw,可以使用 find_element_by_id 函數(shù)給予id值,找到元素對象,并且可以操作元素對象進(jìn)行增刪操作。由于 find_element_by_id 是瀏覽器對象的方法,使用瀏覽器對象調(diào)用,代碼如下:
這時(shí)還差向該對象輸入要搜索的值。使用 send_keys 方法可以自動鍵入值,編寫如下:
input.send_keys("爬蟲")其中input是剛剛獲取的元素對象。這時(shí)運(yùn)行代碼查看效果:
這時(shí)自動鍵入了要搜索的關(guān)鍵幀“爬蟲”。接下來根據(jù)之前的步驟,應(yīng)該找到 百度一下 按鈕的id,隨后點(diǎn)擊即可。通過相同的流程,得到百度一下 按鈕的html代碼:
得到id為su,使用 find_element_by_id 得到元素對象:
enter = driver.find_element_by_id('su')該元素調(diào)用click方法即可進(jìn)行點(diǎn)擊:
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()運(yùn)行結(jié)果如下:
信息獲取
能夠進(jìn)行自動打開了,下一步接下來需要做的就是獲取搜索的信息。
在這里需要介紹一個(gè)知識點(diǎn) xpath,我們可以理解xpath就像 x,y坐標(biāo)一樣的東西,用于html或者說xml語言中的定位,表示一個(gè)位置。簡單的使用并不需要去學(xué)習(xí)它如何編寫,因?yàn)閺臑g覽器中我們可以直接得到。
如下圖,我們右鍵搜索出來了信息第一個(gè)標(biāo)題,點(diǎn)擊檢查后會出現(xiàn)源代碼。在源代碼中右鍵,選擇Copy之后點(diǎn)擊Copy XPath,這時(shí)我們就把當(dāng)前這個(gè)元素的XPath獲取了。
獲取到了XPath后,復(fù)制到文本框,查看是如下形式:
在這里注意,理論上每一個(gè)頁面的第一行結(jié)果都將會是該XPath,并不需要每一頁都去獲取,但也有情況不一致的時(shí)候,具體情況得具體分析。
我們簡單實(shí)用XPath不需要了解過多,接下來可以使用 find_element_by_xpath 獲取到當(dāng)前元素對象。
獲取到元素對象后,可以調(diào)用該元素對象的text屬性獲取到當(dāng)前文本值:
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) 是為了等待點(diǎn)擊搜索后頁面加載數(shù)據(jù),不然會獲取不到對象。
結(jié)果如下:
以上省略了瀏覽器自動打開并搜索內(nèi)容的過程,直接查看了結(jié)果。
那么我們每一頁都獲取第一個(gè)結(jié)果,這時(shí)只需要自動點(diǎn)擊下一頁后獲取即可。
首先得到下一頁按鈕的元素對象:
復(fù)制XPath值為:
則獲取下一頁對象并且點(diǎn)擊跳轉(zhuǎn)的代碼為:
nextbtn_element=driver.find_element_by_xpath('//*[@id="page"]/div/a[10]') nextbtn_element.click()運(yùn)行后發(fā)現(xiàn)成功跳轉(zhuǎn)到第二頁,接下來可以繼續(xù)獲取搜索欄的第一個(gè)對象,可以使用循環(huán)實(shí)現(xiàn)這個(gè)過程,我們設(shè)定去搜索前10頁的所有第一個(gè)結(jié)果值,這時(shí)所有代碼可以寫為:
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秒是為了點(diǎn)擊下一頁后數(shù)據(jù)進(jìn)行加載的等待時(shí)間。
運(yùn)行后,結(jié)果發(fā)現(xiàn)報(bào)錯(cuò):
我們的12行為:
那么在這里應(yīng)該是 //*[@id="3001"]/div[1]/h3/a 定位錯(cuò)誤,沒有找到該定位的元素。我們查看第一頁、第二頁、第三頁的第一條結(jié)果進(jìn)行對比:
第一頁://*[@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ā)生了改變,變成了:
完整代碼如下:
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) #獲取第一個(gè)結(jié)果并且點(diǎn)擊下一頁 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)#設(shè)置一個(gè)變量start start=1 #循環(huán)點(diǎ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) #獲取第一個(gè)結(jié)果并且點(diǎn)擊下一頁 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)為遍歷下一頁以及獲取第一個(gè)結(jié)果:
#設(shè)置一個(gè)變量start start=1 #循環(huán)點(diǎ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)首先設(shè)置一個(gè)start,因?yàn)榈诙撌?XPath 中變化的值為11-21-31…,設(shè)置一個(gè)變量為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。其它代碼均和之前的相似。最終運(yùn)行結(jié)果如下:
由于有一些其它信息所以打碼了,這就是一個(gè)簡單的selenium爬蟲編寫方式,之后將會持續(xù)更新爬蟲系列。
總結(jié)
以上是生活随笔為你收集整理的python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3 最简单的实现 模版设计模
- 下一篇: Qt 第二步 熟悉文件结构组成(二)