python爬蟲14--Selenium動態渲染頁面抓取


1.聲明瀏覽器對象

from selenium import webdriver

browser = webdriver.Chrome()
# browser = webdriver.Firefox()
# browser = webdriver.Edge()

 

2.訪問頁面

from selenium import webdriver

browser = webdriver.Chrome()
url = 'http://www.baidu.com'
browser.get(url)
print(browser.page_source)
browser.close()  #使用完要關閉瀏覽器

 

3.節點查找

3.1 單個節點

從淘寶首頁提取搜索框

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
url = 'http://www.taobao.com'
browser.get(url)
input_first = browser.find_element_by_id('q')                  #根據id獲取
input_second = browser.find_elements_by_css_selector('#q')     #根據css選擇器獲取
input_third = browser.find_element_by_xpath('//*[@id="q"]')  #根據xpath獲取
input_forth = browser.find_element(By.ID,'q')                  #find_element()
print(input_first,input_second,input_third,input_forth)
browser.close()

運行結果為WebElement類型,<selenium.webdriver.remote.webelement.WebElement (session="47f594f34cc9868f68ab3653e1d542a6">

find_element()方法只查詢到第一個節點

3.2 多個節點

查詢左側導航欄

from selenium import webdriver
from selenium.webdriver.common.by import By

url = 'http://www.taobao.com'
browser = webdriver.Chrome()
browser.get(url)
lis1 = browser.find_elements_by_css_selector('.service-bd li')  #class屬性為service-bd的ul下的所有li標簽,返回結果為列表
lis2 = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
print(len(lis1),lis1)
print(len(lis2),lis2)
browser.close()

3.3 節點交互

Selenium可以驅動瀏覽器來執行一些操作,常用方法有:

  • send_keys():輸入文字
  • clear():清空文字
  • click():點擊按鈕

在輸入框中輸入要查找的內容進行搜索

from selenium import webdriver
import time

url = 'http://www.taobao.com'
browser = webdriver.Chrome()
browser.get(url)
input = browser.find_element_by_id('q')
input.send_keys('電腦')
time.sleep(3)
input.clear()
input.send_keys('筆記本電腦')
button = browser.find_elements_by_css_selector('.btn-search tb-bg')
button.click()
browser.close()

3.4 執行JavaScript

對於某些操作selenium API沒有提供,如下拉進度條,可以直接模擬運行javascript,使用execute_script()方法。

 

from selenium import webdriver
import time

url = 'http://www.taobao.com'
browser = webdriver.Chrome()
browser.get(url)
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(5)
browser.execute_script('alert("To Buttom")')

 

 

4.獲取節點信息

page_source屬性可以獲取網頁源代碼,然后可以使用解析庫獲取信息。

selenium選擇節點,返回的WebElement類型,也有對應的屬性和方法來獲取節點信息。

4.1 獲取屬性

get_attribute()方法獲取屬性。

input = browser.find_element_by_id('q')
print(input.get_attribute('name'))

4.2 獲取文本值

text屬性可獲取文本值。

 

 

lis = browser.find_elements_by_css_selector('.service-bd li')
for li in lis:
    print(li.text)

 

4.3 獲取id、位置、標簽名和大小

id屬性獲取節點id;location屬性獲取該節點在頁面中的相對位置;tag_name屬性獲取標簽名;size屬性獲取節點寬高。

 

5.切換Frame

 

iframe即子Frame,相當於頁面的子頁面,結構和外部網頁的結構完全一致,selenium打開頁面后,默認在父級的Frame里,不能獲取到在子Frame里的節點,需要使用switch_to.frame()方法來切換Frame。

 

from selenium import webdriver
from selenium.common.exceptions import  NoSuchElementException
browser = webdriver.Chrome()
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')        #切換到子Frame
try:
    logo1 = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print('no logo')
browser.switch_to.parent_frame()     #切換到父級Frame
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)
browser.close()

 

 

6.延時等待

 

selenium中get()方法會在網頁框架加載結束后結束執行,此時如果獲取page_source,可能不是瀏覽器完全加載的頁面,所以需要延時等待一段時間,確保節點全部加載。

6.1 隱式等待

使用隱式等待,如果selenium在DOM中沒有找到節點,會繼續等待,超出設定時間后,會拋出找不到節點的異常,規定了一個固定時間,默認時間為0。用implicitly_wait()實現隱式等待。

 

from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('http://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
browser.close()

 

6.2顯示等待

顯示等待指定一個最長等待時間,如果在規定時間內沒有加載出來,會拋出超時異常。

 

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome()
url = 'http://www.taobao.com'
browser.get(url)
wait = WebDriverWait(browser,10)      #引入WebDriverWait對象,指定最長等待時間
input = wait.until(EC.presence_of_element_located((By.ID,'q')))     #調用until()方法,傳入等待條件expected_conditions
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
print(input,button)
browser.close()

 

 

7.前進和后退

back()后退;forward()前進。

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.get('http://taobao.com')
browser.get('https://www.cnblogs.com/')
browser.back()
time.sleep(3)
browser.forward()
time.sleep(3)
browser.back()
time.sleep(3)
browser.close()

 

8.選項卡操作

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.execute_script('window.open()')             #新開啟一個選項卡,即第二個
print(browser.window_handles)                          #獲取當前開啟的所有選項卡,以列表的形式返回,此處兩個
browser.switch_to.window(browser.window_handles[1])    #切換到第二個選項卡
browser.get('http://taobao.com')                    #在第二個選項卡打開淘寶頁面
time.sleep(3)
browser.switch_to.window(browser.window_handles[0])     #切換到第一個選項卡
browser.get('https://www.cnblogs.com/')             #在第一個選項卡打開博客頁面

 

更多資料見參考文檔:https://selenium-python.readthedocs.io/api.html

 

9.案例--使用selenium抓取淘寶商品

目標:

利用selenium抓取淘寶商品並用pyquery解析得到商品的圖片、名稱、價格、購買人數、店鋪名稱和店鋪所在地信息,並保存到MongoDB中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM