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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法

發(fā)布時(shí)間:2024/7/5 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、selenium的介紹

知識(shí)點(diǎn):
  • 了解 selenium的工作原理
  • 了解 selenium以及chromedriver的安裝
  • 掌握 標(biāo)簽對(duì)象click點(diǎn)擊以及send_keys輸入

1. selenium運(yùn)行效果展示

Selenium是一個(gè)Web的自動(dòng)化測(cè)試工具,最初是為網(wǎng)站自動(dòng)化測(cè)試而開(kāi)發(fā)的,Selenium 可以直接調(diào)用瀏覽器,它支持所有主流的瀏覽器(包括PhantomJS這些無(wú)界面的瀏覽器),可以接收指令,讓瀏覽器自動(dòng)加載頁(yè)面,獲取需要的數(shù)據(jù),甚至頁(yè)面截屏等。我們可以使用selenium很容易完成之前編寫的爬蟲,接下來(lái)我們就來(lái)看一下selenium的運(yùn)行效果

1.1 chrome瀏覽器的運(yùn)行效果

在下載好chromedriver以及安裝好selenium模塊后,執(zhí)行下列代碼并觀察運(yùn)行的過(guò)程

from selenium import webdriver # 如果driver沒(méi)有添加到了環(huán)境變量,則需要將driver的絕對(duì)路徑賦值給executable_path參數(shù) # driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')# 如果driver添加了環(huán)境變量則不需要設(shè)置executable_path driver = webdriver.Chrome()# 向一個(gè)url發(fā)起請(qǐng)求 driver.get("http://www.itcast.cn/")# 把網(wǎng)頁(yè)保存為圖片,69版本以上的谷歌瀏覽器將無(wú)法使用截圖功能 # driver.save_screenshot("itcast.png")print(driver.title) # 打印頁(yè)面的標(biāo)題# 退出模擬瀏覽器 driver.quit() # 一定要退出!不退出會(huì)有殘留進(jìn)程!

1.2 phantomjs無(wú)界面瀏覽器的運(yùn)行效果

PhantomJS 是一個(gè)基于Webkit的“無(wú)界面”(headless)瀏覽器,它會(huì)把網(wǎng)站加載到內(nèi)存并執(zhí)行頁(yè)面上的 JavaScript。下載地址:http://phantomjs.org/download.html

from selenium import webdriver # 指定driver的絕對(duì)路徑 driver = webdriver.PhantomJS(executable_path='/home/worker/Desktop/driver/phantomjs') # driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')# 向一個(gè)url發(fā)起請(qǐng)求 driver.get("http://www.itcast.cn/")# 把網(wǎng)頁(yè)保存為圖片 driver.save_screenshot("itcast.png")# 退出模擬瀏覽器 driver.quit() # 一定要退出!不退出會(huì)有殘留進(jìn)程!

1.3 觀察運(yùn)行效果

  • python代碼能夠自動(dòng)的調(diào)用谷歌瀏覽或phantomjs無(wú)界面瀏覽器,控制其自動(dòng)訪問(wèn)網(wǎng)站

1.4 無(wú)頭瀏覽器與有頭瀏覽器的使用場(chǎng)景

  • 通常在開(kāi)發(fā)過(guò)程中我們需要查看運(yùn)行過(guò)程中的各種情況所以通常使用有頭瀏覽器
  • 在項(xiàng)目完成進(jìn)行部署的時(shí)候,通常平臺(tái)采用的系統(tǒng)都是服務(wù)器版的操作系統(tǒng),服務(wù)器版的操作系統(tǒng)必須使用無(wú)頭瀏覽器才能正常運(yùn)行

2. selenium的作用和工作原理

利用瀏覽器原生的API,封裝成一套更加面向?qū)ο蟮腟elenium WebDriver API,直接操作瀏覽器頁(yè)面里的元素,甚至操作瀏覽器本身(截屏,窗口大小,啟動(dòng),關(guān)閉,安裝插件,配置證書之類的)

  • webdriver本質(zhì)是一個(gè)web-server,對(duì)外提供webapi,其中封裝了瀏覽器的各種功能
  • 不同的瀏覽器使用各自不同的webdriver

知識(shí)點(diǎn):了解 selenium的工作原理

3. selenium的安裝以及簡(jiǎn)單使用

我們以谷歌瀏覽器的chromedriver為例

3.1 在python虛擬環(huán)境中安裝selenium模塊

pip/pip3 install selenium

3.2 下載版本符合的webdriver

以chrome谷歌瀏覽器為例

  • 查看谷歌瀏覽器的版本

  • 訪問(wèn)https://npm.taobao.org/mirrors/chromedriver,點(diǎn)擊進(jìn)入不同版本的chromedriver下載頁(yè)面

  • 點(diǎn)擊notes.txt進(jìn)入版本說(shuō)明頁(yè)面

  • 查看chrome和chromedriver匹配的版本

  • 根據(jù)操作系統(tǒng)下載正確版本的chromedriver

  • 解壓壓縮包后獲取python代碼可以調(diào)用的谷歌瀏覽器的webdriver可執(zhí)行文件

    • windows為chromedriver.exe

    • linux和macos為chromedriver

  • chromedriver環(huán)境的配置

    • windows環(huán)境下需要將 chromedriver.exe 所在的目錄設(shè)置為path環(huán)境變量中的路徑
    • linux/mac環(huán)境下,將 chromedriver 所在的目錄設(shè)置到系統(tǒng)的PATH環(huán)境值中

  • 知識(shí)點(diǎn):了解 selenium以及chromedriver的安裝

    4. selenium的簡(jiǎn)單使用

    接下來(lái)我們就通過(guò)代碼來(lái)模擬百度搜索

    import time from selenium import webdriver# 通過(guò)指定chromedriver的路徑來(lái)實(shí)例化driver對(duì)象,chromedriver放在當(dāng)前目錄。 # driver = webdriver.Chrome(executable_path='./chromedriver') # chromedriver已經(jīng)添加環(huán)境變量 driver = webdriver.Chrome()# 控制瀏覽器訪問(wèn)url地址 driver.get("https://www.baidu.com/")# 在百度搜索框中搜索'python' driver.find_element_by_id('kw').send_keys('python') # 點(diǎn)擊'百度搜索' driver.find_element_by_id('su').click()time.sleep(6) # 退出瀏覽器 driver.quit()
    • webdriver.Chrome(executable_path='./chromedriver')中executable參數(shù)指定的是下載好的chromedriver文件的路徑
    • driver.find_element_by_id('kw').send_keys('python')定位id屬性值是’kw’的標(biāo)簽,并向其中輸入字符串’python’
    • driver.find_element_by_id('su').click()定位id屬性值是su的標(biāo)簽,并點(diǎn)擊
      • click函數(shù)作用是:觸發(fā)標(biāo)簽的js的click事件

    知識(shí)點(diǎn):掌握 標(biāo)簽對(duì)象click點(diǎn)擊以及send_keys輸入

    值是’kw’的標(biāo)簽,并向其中輸入字符串’python’

    • driver.find_element_by_id('su').click()定位id屬性值是su的標(biāo)簽,并點(diǎn)擊
      • click函數(shù)作用是:觸發(fā)標(biāo)簽的js的click事件

    知識(shí)點(diǎn):掌握 標(biāo)簽對(duì)象click點(diǎn)擊以及send_keys輸入

    二、selenium提取數(shù)據(jù)

    知識(shí)點(diǎn):
    • 了解 driver對(duì)象的常用屬性和方法
    • 掌握 driver對(duì)象定位標(biāo)簽元素獲取標(biāo)簽對(duì)象的方法
    • 掌握 標(biāo)簽對(duì)象提取文本和屬性值的方法

    1. driver對(duì)象的常用屬性和方法

    在使用selenium過(guò)程中,實(shí)例化driver對(duì)象后,driver對(duì)象有一些常用的屬性和方法

  • driver.page_source 當(dāng)前標(biāo)簽頁(yè)瀏覽器渲染之后的網(wǎng)頁(yè)源代碼
  • driver.current_url 當(dāng)前標(biāo)簽頁(yè)的url
  • driver.close() 關(guān)閉當(dāng)前標(biāo)簽頁(yè),如果只有一個(gè)標(biāo)簽頁(yè)則關(guān)閉整個(gè)瀏覽器
  • driver.quit() 關(guān)閉瀏覽器
  • driver.forward() 頁(yè)面前進(jìn)
  • driver.back() 頁(yè)面后退
  • driver.screen_shot(img_name) 頁(yè)面截圖

  • 知識(shí)點(diǎn):了解 driver對(duì)象的常用屬性和方法

    2. driver對(duì)象定位標(biāo)簽元素獲取標(biāo)簽對(duì)象的方法

    在selenium中可以通過(guò)多種方式來(lái)定位標(biāo)簽,返回標(biāo)簽元素對(duì)象

    find_element_by_id (返回一個(gè)元素) find_element(s)_by_class_name (根據(jù)類名獲取元素列表) find_element(s)_by_name (根據(jù)標(biāo)簽的name屬性值返回包含標(biāo)簽對(duì)象元素的列表) find_element(s)_by_xpath (返回一個(gè)包含元素的列表) find_element(s)_by_link_text (根據(jù)連接文本獲取元素列表) find_element(s)_by_partial_link_text (根據(jù)鏈接包含的文本獲取元素列表) find_element(s)_by_tag_name (根據(jù)標(biāo)簽名獲取元素列表) find_element(s)_by_css_selector (根據(jù)css選擇器來(lái)獲取元素列表)
    • 注意:
      • find_element和find_elements的區(qū)別:
        • 多了個(gè)s就返回列表,沒(méi)有s就返回匹配到的第一個(gè)標(biāo)簽對(duì)象
        • find_element匹配不到就拋出異常,find_elements匹配不到就返回空列表
      • by_link_text和by_partial_link_tex的區(qū)別:全部文本和包含某個(gè)文本
      • 以上函數(shù)的使用方法
        • driver.find_element_by_id('id_str')

    代碼演示:

    from selenium import webdriverurl = "http://www.baidu.com"driver = webdriver.Chrome()driver.get(url)# 通過(guò)xpath進(jìn)行元素定位 # driver.find_element_by_xpath('//*[@id="kw"]').send_keys('python3')# 通過(guò)css選擇器進(jìn)行元素定位 # driver.find_element_by_css_selector('#kw').send_keys('python3')# 通過(guò)name屬性值進(jìn)行元素定位 # driver.find_element_by_name('wd').send_keys('python3')# 通過(guò)class屬性值進(jìn)行元素定位 # driver.find_element_by_class_name('s_ipt').send_keys('python3')# 通過(guò)鏈接文本進(jìn)行元素定位 # driver.find_element_by_link_text('貼吧').click() # driver.find_element_by_partial_link_text('貼').click()# 目標(biāo)元素在當(dāng)前HTML中是唯一標(biāo)簽的時(shí)候或者是眾多定位出來(lái)的標(biāo)簽中的第一個(gè)的時(shí)候才能使用 print(driver.find_element_by_tag_name('title'))# driver.find_element_by_id('su').click()
    知識(shí)點(diǎn):掌握 driver對(duì)象定位標(biāo)簽元素獲取標(biāo)簽對(duì)象的方法

    3. 標(biāo)簽對(duì)象提取文本內(nèi)容和屬性值

    find_element僅僅能夠獲取元素,不能夠直接獲取其中的數(shù)據(jù),如果需要獲取數(shù)據(jù)需要使用以下方法

    • 對(duì)元素執(zhí)行點(diǎn)擊操作element.click()

      • 對(duì)定位到的標(biāo)簽對(duì)象進(jìn)行點(diǎn)擊操作
    • 向輸入框輸入數(shù)據(jù)element.send_keys(data)

      • 對(duì)定位到的標(biāo)簽對(duì)象輸入數(shù)據(jù)
    • 獲取文本element.text

      • 通過(guò)定位獲取的標(biāo)簽對(duì)象的text屬性,獲取文本內(nèi)容
    • 獲取屬性值element.get_attribute("屬性名")

      • 通過(guò)定位獲取的標(biāo)簽對(duì)象的get_attribute函數(shù),傳入屬性名,來(lái)獲取屬性的值

    ?

    • 代碼實(shí)現(xiàn),如下:

      from selenium import webdriverdriver = webdriver.Chrome()driver.get('http://www.itcast.cn/')ret = driver.find_elements_by_tag_name('h2') print(ret[0].text) # ret = driver.find_elements_by_link_text('黑馬程序員') print(ret[0].get_attribute('href'))driver.quit()

    知識(shí)點(diǎn):掌握 元素對(duì)象的操作方法

    三、selenium的其它使用方法

    知識(shí)點(diǎn):
    • 掌握 selenium控制標(biāo)簽頁(yè)的切換
    • 掌握 selenium控制iframe的切換
    • 掌握 利用selenium獲取cookie的方法
    • 掌握 手動(dòng)實(shí)現(xiàn)頁(yè)面等待
    • 掌握 selenium控制瀏覽器執(zhí)行js代碼的方法
    • 掌握 selenium開(kāi)啟無(wú)界面模式
    • 了解 selenium使用代理ip
    • 了解 selenium替換user-agent

    1. selenium標(biāo)簽頁(yè)的切換

    當(dāng)selenium控制瀏覽器打開(kāi)多個(gè)標(biāo)簽頁(yè)時(shí),如何控制瀏覽器在不同的標(biāo)簽頁(yè)中進(jìn)行切換呢?需要我們做以下兩步:

    • 獲取所有標(biāo)簽頁(yè)的窗口句柄

    • 利用窗口句柄字切換到句柄指向的標(biāo)簽頁(yè)

      • 這里的窗口句柄是指:指向標(biāo)簽頁(yè)對(duì)象的標(biāo)識(shí)
      • 關(guān)于句柄請(qǐng)課后了解更多,本小節(jié)不做展開(kāi)
    • 具體的方法

      # 1. 獲取當(dāng)前所有的標(biāo)簽頁(yè)的句柄構(gòu)成的列表 current_windows = driver.window_handles# 2. 根據(jù)標(biāo)簽頁(yè)句柄列表索引下標(biāo)進(jìn)行切換 driver.switch_to.window(current_windows[0])
    • myCode
      代碼演示:

    from selenium import webdriverurl = "https://sz.58.com/"driver = webdriver.Chrome()driver.get(url)print(driver.current_url) print(driver.window_handles)# 定位并且點(diǎn)擊租房按鈕 el = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')el.click() print("_________________________") print(driver.current_url) print(driver.window_handles)# 將控制權(quán)轉(zhuǎn)移到新打開(kāi)的標(biāo)簽頁(yè)中 driver.switch_to.window(driver.window_handles[-1])el_list = driver.find_elements_by_xpath('/html/body/div[7]/div[2]/ul/li/div[2]/h2/a')print(len(el_list)) for el in el_list:print(el.text,el.get_attribute('href'))

    • 參考代碼示例:

      import time from selenium import webdriverdriver = webdriver.Chrome() driver.get("https://www.baidu.com/")time.sleep(1) driver.find_element_by_id('kw').send_keys('python') time.sleep(1) driver.find_element_by_id('su').click() time.sleep(1)# 通過(guò)執(zhí)行js來(lái)新開(kāi)一個(gè)標(biāo)簽頁(yè) js = 'window.open("https://www.sogou.com");' driver.execute_script(js) time.sleep(1)# 1. 獲取當(dāng)前所有的窗口 windows = driver.window_handlestime.sleep(2) # 2. 根據(jù)窗口索引進(jìn)行切換 driver.switch_to.window(windows[0]) time.sleep(2) driver.switch_to.window(windows[1])time.sleep(6) driver.quit()

    知識(shí)點(diǎn):掌握 selenium控制標(biāo)簽頁(yè)的切換

    2. switch_to切換frame標(biāo)簽

    iframe是html中常用的一種技術(shù),即一個(gè)頁(yè)面中嵌套了另一個(gè)網(wǎng)頁(yè),selenium默認(rèn)是訪問(wèn)不了frame中的內(nèi)容的,對(duì)應(yīng)的解決思路是driver.switch_to.frame(frame_element)。接下來(lái)我們通過(guò)qq郵箱模擬登陸來(lái)學(xué)習(xí)這個(gè)知識(shí)點(diǎn)
    • 參考代碼:

      import time from selenium import webdriverdriver = webdriver.Chrome()url = 'https://mail.qq.com/cgi-bin/loginpage' driver.get(url) time.sleep(2)login_frame = driver.find_element_by_id('login_frame') # 根據(jù)id定位 frame元素 driver.switch_to.frame(login_frame) # 轉(zhuǎn)向到該frame中driver.find_element_by_xpath('//*[@id="u"]').send_keys('1596930226@qq.com') time.sleep(2)driver.find_element_by_xpath('//*[@id="p"]').send_keys('hahamimashicuode') time.sleep(2)driver.find_element_by_xpath('//*[@id="login_button"]').click() time.sleep(2)"""操作frame外邊的元素需要切換出去""" windows = driver.window_handles driver.switch_to.window(windows[0])content = driver.find_element_by_class_name('login_pictures_title').text print(content)driver.quit()
    • myCode

    from selenium import webdriverurl = 'https://qzone.qq.com/'driver = webdriver.Chrome()driver.get(url)el_frame = driver.find_element_by_xpath('//*[@id="login_frame"]') # driver.switch_to.frame('login_frame') driver.switch_to.frame(el_frame) driver.find_element_by_id('switcher_plogin').click()driver.find_element_by_id('u').send_keys('你的賬號(hào)') driver.find_element_by_id('p').send_keys('你的密碼') driver.find_element_by_id('login_button').click()
    • 總結(jié):

      • 切換到定位的frame標(biāo)簽嵌套的頁(yè)面中

        • driver.switch_to.frame(通過(guò)find_element_by函數(shù)定位的frame、iframe標(biāo)簽對(duì)象)
      • 利用切換標(biāo)簽頁(yè)的方式切出frame標(biāo)簽

        • windows = driver.window_handles driver.switch_to.window(windows[0])

    知識(shí)點(diǎn):掌握 selenium控制frame標(biāo)簽的切換

    3. selenium對(duì)cookie的處理

    selenium能夠幫助我們處理頁(yè)面中的cookie,比如獲取、刪除,接下來(lái)我們就學(xué)習(xí)這部分知識(shí)

    3.1 獲取cookie

    driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,還有domain等cookie其他維度的信息。所以如果想要把獲取的cookie信息和requests模塊配合使用的話,需要轉(zhuǎn)換為name、value作為鍵值對(duì)的cookie字典

    # 獲取當(dāng)前標(biāo)簽頁(yè)的全部cookie信息 print(driver.get_cookies()) # 把cookie轉(zhuǎn)化為字典 cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}

    3.2 刪除cookie

    #刪除一條cookie driver.delete_cookie("CookieName")# 刪除所有的cookie driver.delete_all_cookies()
    from selenium import webdriverurl = "http://www.baidu.com"driver = webdriver.Chrome()driver.get(url)print(driver.get_cookies()) print("——————————————————————————————————————") # cookies = {} # for data in driver.get_cookies(): # cookies[data['name']] = data['value']cookies = {data['name']:data['value']for data in driver.get_cookies()}print(cookies)
    知識(shí)點(diǎn):掌握 利用selenium獲取cookie的方法

    4. selenium控制瀏覽器執(zhí)行js代碼

    selenium可以讓瀏覽器執(zhí)行我們規(guī)定的js代碼,運(yùn)行下列代碼查看運(yùn)行效果

    import time from selenium import webdriverdriver = webdriver.Chrome() driver.get("http://www.itcast.cn/") time.sleep(1)js = 'window.scrollTo(0,document.body.scrollHeight)' # js語(yǔ)句 driver.execute_script(js) # 執(zhí)行js的方法time.sleep(5) driver.quit()
    • 執(zhí)行js的方法:driver.execute_script(js)

    知識(shí)點(diǎn):掌握 selenium控制瀏覽器執(zhí)行js代碼的方法

    5. 頁(yè)面等待

    頁(yè)面在加載的過(guò)程中需要花費(fèi)時(shí)間等待網(wǎng)站服務(wù)器的響應(yīng),在這個(gè)過(guò)程中標(biāo)簽元素有可能還沒(méi)有加載出來(lái),是不可見(jiàn)的,如何處理這種情況呢?

  • 頁(yè)面等待分類
  • 強(qiáng)制等待介紹
  • 顯式等待介紹
  • 隱式等待介紹
  • 手動(dòng)實(shí)現(xiàn)頁(yè)面等待
  • 5.1 頁(yè)面等待的分類

    首先我們就來(lái)了解以下selenium頁(yè)面等待的分類

  • 強(qiáng)制等待
  • 隱式等待
  • 顯式等待
  • 5.2 強(qiáng)制等待(了解)

    • 其實(shí)就是time.sleep()
    • 缺點(diǎn)時(shí)不智能,設(shè)置的時(shí)間太短,元素還沒(méi)有加載出來(lái);設(shè)置的時(shí)間太長(zhǎng),則會(huì)浪費(fèi)時(shí)間

    5.3 隱式等待

    • 隱式等待針對(duì)的是元素定位,隱式等待設(shè)置了一個(gè)時(shí)間,在一段時(shí)間內(nèi)判斷元素是否定位成功,如果完成了,就進(jìn)行下一步

    • 在設(shè)置的時(shí)間內(nèi)沒(méi)有定位成功,則會(huì)報(bào)超時(shí)加載

    • 示例代碼

      from selenium import webdriverdriver = webdriver.Chrome() driver.implicitly_wait(10) # 隱式等待,最長(zhǎng)等20秒 driver.get('https://www.baidu.com')driver.find_element_by_xpath()

    5.4 顯式等待(了解)

    • 每經(jīng)過(guò)多少秒就查看一次等待條件是否達(dá)成,如果達(dá)成就停止等待,繼續(xù)執(zhí)行后續(xù)代碼

    • 如果沒(méi)有達(dá)成就繼續(xù)等待直到超過(guò)規(guī)定的時(shí)間后,報(bào)超時(shí)異常

    • 示例代碼

      from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome()driver.get('https://www.baidu.com')# 顯式等待 WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located((By.LINK_TEXT, '好123'))) # 參數(shù)20表示最長(zhǎng)等待20秒 # 參數(shù)0.5表示0.5秒檢查一次規(guī)定的標(biāo)簽是否存在 # EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通過(guò)鏈接文本內(nèi)容定位標(biāo)簽 # 每0.5秒一次檢查,通過(guò)鏈接文本內(nèi)容定位標(biāo)簽是否存在,如果存在就向下繼續(xù)執(zhí)行;如果不存在,直到20秒上限就拋出異常print(driver.find_element_by_link_text('好123').get_attribute('href')) driver.quit()

    5.5 手動(dòng)實(shí)現(xiàn)頁(yè)面等待

    在了解了隱式等待和顯式等待以及強(qiáng)制等待后,我們發(fā)現(xiàn)并沒(méi)有一種通用的方法來(lái)解決頁(yè)面等待的問(wèn)題,比如“頁(yè)面需要滑動(dòng)才能觸發(fā)ajax異步加載”的場(chǎng)景,那么接下來(lái)我們就以淘寶網(wǎng)首頁(yè)為例,手動(dòng)實(shí)現(xiàn)頁(yè)面等待

    • 原理:
      • 利用強(qiáng)制等待和顯式等待的思路來(lái)手動(dòng)實(shí)現(xiàn)
      • 不停的判斷或有次數(shù)限制的判斷某一個(gè)標(biāo)簽對(duì)象是否加載完畢(是否存在)
    • 實(shí)現(xiàn)代碼如下:
    import time from selenium import webdriver driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')driver.get('https://www.taobao.com/') time.sleep(1)# i = 0 # while True: for i in range(10):i += 1try:time.sleep(3)element = driver.find_element_by_xpath('//div[@class="shop-inner"]/h3[1]/a')print(element.get_attribute('href'))breakexcept:js = 'window.scrollTo(0, {})'.format(i*500) # js語(yǔ)句driver.execute_script(js) # 執(zhí)行js的方法 driver.quit()
    知識(shí)點(diǎn):掌握 手動(dòng)實(shí)現(xiàn)頁(yè)面等待

    6. selenium開(kāi)啟無(wú)界面模式

    絕大多數(shù)服務(wù)器是沒(méi)有界面的,selenium控制谷歌瀏覽器也是存在無(wú)界面模式的,這一小節(jié)我們就來(lái)學(xué)習(xí)如何開(kāi)啟無(wú)界面模式(又稱之為無(wú)頭模式)

    • 開(kāi)啟無(wú)界面模式的方法
      • 實(shí)例化配置對(duì)象
        • options = webdriver.ChromeOptions()
      • 配置對(duì)象添加開(kāi)啟無(wú)界面模式的命令
        • options.add_argument("--headless")
      • 配置對(duì)象添加禁用gpu的命令
        • options.add_argument("--disable-gpu")
      • 實(shí)例化帶有配置對(duì)象的driver對(duì)象
        • driver = webdriver.Chrome(chrome_options=options)
    • 注意:macos中chrome瀏覽器59+版本,Linux中57+版本才能使用無(wú)界面模式!
    • 參考代碼如下:
    from selenium import webdriveroptions = webdriver.ChromeOptions() # 創(chuàng)建一個(gè)配置對(duì)象 options.add_argument("--headless") # 開(kāi)啟無(wú)界面模式 options.add_argument("--disable-gpu") # 禁用gpu# options.set_headles() # 無(wú)界面模式的另外一種開(kāi)啟方式 driver = webdriver.Chrome(chrome_options=options) # 實(shí)例化帶有配置的driver對(duì)象driver.get('http://www.itcast.cn') print(driver.title) driver.quit()
    知識(shí)點(diǎn):掌握 selenium開(kāi)啟無(wú)界面模式

    7. selenium使用代理ip

    selenium控制瀏覽器也是可以使用代理ip的!

    • 使用代理ip的方法

      • 實(shí)例化配置對(duì)象
        • options = webdriver.ChromeOptions()
      • 配置對(duì)象添加使用代理ip的命令
        • options.add_argument('--proxy-server=http://202.20.16.82:9527')
      • 實(shí)例化帶有配置對(duì)象的driver對(duì)象
        • driver = webdriver.Chrome('./chromedriver', chrome_options=options)
    • 參考代碼如下:

      from selenium import webdriveroptions = webdriver.ChromeOptions() # 創(chuàng)建一個(gè)配置對(duì)象 options.add_argument('--proxy-server=http://202.20.16.82:9527') # 使用代理ipdriver = webdriver.Chrome(chrome_options=options) # 實(shí)例化帶有配置的driver對(duì)象driver.get('http://www.itcast.cn') print(driver.title) driver.quit()

    知識(shí)點(diǎn):了解 selenium使用代理ip

    8. selenium替換user-agent

    selenium控制谷歌瀏覽器時(shí),User-Agent默認(rèn)是谷歌瀏覽器的,這一小節(jié)我們就來(lái)學(xué)習(xí)使用不同的User-Agent

    • 替換user-agent的方法

      • 實(shí)例化配置對(duì)象
        • options = webdriver.ChromeOptions()
      • 配置對(duì)象添加替換UA的命令
        • options.add_argument('--user-agent=Mozilla/5.0 HAHA')
      • 實(shí)例化帶有配置對(duì)象的driver對(duì)象
        • driver = webdriver.Chrome('./chromedriver', chrome_options=options)
    • 參考代碼如下:

      from selenium import webdriveroptions = webdriver.ChromeOptions() # 創(chuàng)建一個(gè)配置對(duì)象 options.add_argument('--user-agent=Mozilla/5.0 HAHA') # 替換User-Agentdriver = webdriver.Chrome('./chromedriver', chrome_options=options)driver.get('http://www.itcast.cn') print(driver.title) driver.quit()

    知識(shí)點(diǎn):了解 selenium替換user-agent

    from selenium import webdriverurl = "http://www.baidu.com"# 創(chuàng)建配置對(duì)象 opt = webdriver.ChromeOptions()# 添加配置參數(shù) # 設(shè)置瀏覽器為無(wú)頭模式 # opt.add_argument('--headless') # opt.add_argument('--disable-gpu') # 更換IP代理必須重新啟動(dòng)瀏覽器 opt.add_argument('--proxy-server=http://163.125.16.198:8888')# 更換User-agent opt.add_argument('--User-agent=Mozilla/5.0 python37')# 創(chuàng)建瀏覽器對(duì)象的時(shí)候添加配置對(duì)象 driver = webdriver.Chrome(options=opt)driver.get(url)# driver.save_screenshot('baidu_d.png')

    綜合案例:爬取斗魚直播間數(shù)據(jù)

    from selenium import webdriver import timeclass Douyu(object):def __init__(self):self.url = 'https://www.douyu.com/directory/all'self.driver = webdriver.Chrome()def parse_data(self):time.sleep(5)room_list = self.driver.find_elements_by_xpath('//*[@id="listAll"]/section[2]/div[2]/ul/li/div')print(len(room_list))data_list = []# 遍歷房間列表,從每一個(gè)房間節(jié)點(diǎn)中獲取數(shù)據(jù)for room in room_list:temp={}temp['title'] = room.find_element_by_xpath('./a[1]/div[2]/div[1]/h3').texttemp['type'] = room.find_element_by_xpath('./a[1]/div[2]/div[1]/span').texttemp['owner'] = room.find_element_by_xpath('./a[1]/div[2]/div[2]/h2').texttemp['num'] = room.find_element_by_xpath('./a[1]/div[2]/div[2]/span').texttemp['pic'] = room.find_element_by_xpath('./a[1]/div[1]/div[1]/img').get_attribute('src')# print(temp)data_list.append(temp)return data_listdef save_data(self,data_list):for data in data_list:print(data)def run(self):# url# driver# getself.driver.get(self.url)while True:# parsedata_list = self.parse_data()# saveself.save_data(data_list)# nexttry:el_next = self.driver.find_element_by_xpath("//*[contains(text(),'下一頁(yè)')]")self.driver.execute_script('scrollTo(0,10000)')el_next.click()except:breakif __name__ == '__main__':douyu = Douyu()douyu.run()

    總結(jié)

    以上是生活随笔為你收集整理的python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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