Python-Selenium自動化爬蟲

簡單介紹:

Selenium是一個Web的自動化測試工具,最初是為網站自動化測試而開發的,Selenium 可以直接運行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS這些無界面的瀏覽器(2018年開發者說暫停開發,chromedriver也可以實現同樣的功能)),可以接收指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏。

1.安裝

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

2.下載瀏覽器驅動

這裡用的谷歌瀏覽器

http://npm.taobao.org/mirrors/chromedriver/

查看自己的瀏覽器版本下載對應的驅動。

在這裡插入圖片描述

把解壓後的驅動放在自己的python.exe 目錄下。

3.實例

3.1下載對應版本的瀏覽器驅動

http://npm.taobao.org/mirrors/chromedriver/

在這裡插入圖片描述

在這裡插入圖片描述

把解壓後的驅動放在自己的python.exe 目錄下

在這裡插入圖片描述

3.2測試code,打開一個網頁,並獲取網頁的標題

from selenium.webdriver import Chrome


if __name__ == '__main__':
    web = Chrome()
    web.get("https://baidu.com")
    print(web.title)

在這裡插入圖片描述

在這裡插入圖片描述

3.3一個小樣例

from selenium.webdriver import Chrome


if __name__ == '__main__':
    web = Chrome()
    url = 'https://ac.nowcoder.com/acm/home'
    web.get(url)
    # 獲取要點擊的a標簽
    el = web.find_element_by_xpath('/html/body/div/div[3]/div[1]/div[1]/div[1]/div/a')
    # 點擊
    el.click()                          # "/html/body/div/div[3]/div[1]/div[2]/div[2]/div[2]/div[1]/h4/a"
    # 爬取想要的內容
    lists = web.find_elements_by_xpath("/html/body/div/div[3]/div[1]/div[2]/div[@class='platform-item js-item ']/div["
                                       "2]/div[1]/h4/a")
    print(len(lists))
    for i in lists:
        print(i.text)

3.4自動輸入並跳轉

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time

if __name__ == '__main__':
    web = Chrome()
    url = 'https://ac.nowcoder.com/acm/home'
    web.get(url)

    el = web.find_element_by_xpath('/html/body/div/div[3]/div[1]/div[1]/div[1]/div/a')

    el.click()
    time.sleep(1)
    input_el = web.find_element_by_xpath('/html/body/div/div[3]/div[1]/div[1]/div[1]/form/input[1]')
    input_el.send_keys('牛客', Keys.ENTER)
    #  do something

4.開啟無頭模式

是否開啟無頭模式(即是否需要界面)

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

option = Options()  # 實例化option對象
option.add_argument("--headless")  # 給option對象添加無頭參數

if __name__ == '__main__':
    web = Chrome(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option) # 指定驅動位置,否則從python解釋器目錄下查找.
    web.get("https://baidu.com")
    print(web.title)

5.保存頁面截圖

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

option = Options()  # 實例化option對象
option.add_argument("--headless")  # 給option對象添加無頭參數

if __name__ == '__main__':
    web = Chrome()
    web.maximize_window()  # 瀏覽器窗口最大化
    web.get("https://baidu.com")
    print(web.title)
    web.save_screenshot('baidu.png')  # 保存當前網頁的截圖  保存到當前文件夾下
    web.close()  # 關閉當前網頁

6.模擬輸入和點擊

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

option = Options()  # 實例化option對象
option.add_argument("--headless")  # 給option對象添加無頭參數

if __name__ == '__main__':
    web = Chrome()
    web.maximize_window()  # 瀏覽器窗口最大化
    web.get("https://baidu.com")
    el = web.find_element_by_id('kw')
    el.send_keys('Harris-H')
    btn = web.find_element_by_id('su')
    btn.click()
    # web.close()  # 關閉當前網頁

貌似現在百度可以識別出selenium,還需要圖片驗證。

6.1根據文本值查找節點

# 找到文本值為百度一下的節點
driver.find_element_by_link_text("百度一下") 
# 根據鏈接包含的文本獲取元素列表,模糊匹配
driver.find_elements_by_partial_link_text("度一下") 

6.2獲取當前節點的文本

ele.text # 獲取當前節點的文本
ele.get_attribute("data-click")  # 獲取到屬性對應的value

6.3打印當前網頁的一些信息

print(driver.page_source)  # 打印網頁的源碼
print(driver.get_cookies())  # 打印出網頁的cookie
print(driver.current_url)  # 打印出當前網頁的url

6.4關閉瀏覽器driver.close()  # 關閉當前網頁

driver.close()  # 關閉當前網頁
driver.quit()  # 直接關閉瀏覽器

6.5模擬鼠標滾動

from selenium.webdriver import Chrome
import time

if __name__ == '__main__':

    driver = Chrome()

    driver.get(
        "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=78000241_12_hao_pg&wd=selenium%20js%E6%BB%91%E5%8A%A8&fenlei=256&rsv_pq=8215ec3a00127601&rsv_t=a763fm%2F7SHtPeSVYKeWnxKwKBisdp%2FBe8pVsIapxTsrlUnas7%2F7Hoo6FnDp6WsslfyiRc3iKxP2s&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=31&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=9266&rsv_sug4=9770")
    #  1.滾動到網頁底部
    js = "document.documentElement.scrollTop=1000"
    # 執行js
    driver.execute_script(js)
    time.sleep(2)
    # 滾動到頂部
    js = "document.documentElement.scrollTop=0"
    driver.execute_script(js)  # 執行js

    time.sleep(2)
    driver.close()

7.ChromeOptions

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://110.52.235.176:9999") # 添加代理
options.add_argument("--headless") # 無頭模式
options.add_argument("--lang=en-US") # 網頁顯示英語
prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2} # 禁止渲染
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options)
 
driver.get("http://httpbin.org/ip")
 

8.驗證滑塊移動

目標:滑動驗證碼

  • 1.定位按鈕
  • 2.按住滑塊
  • 3.滑動按鈕

 

import time
from selenium import webdriver

if __name__ == '__main__':
    chrome_obj = webdriver.Chrome()
    chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/')

    # 1.定位滑動按鈕
    click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]')

    # 2.按住
    # 創建一個動作鏈對象,參數就是瀏覽器對象
    action_obj = webdriver.ActionChains(chrome_obj)

    # 點擊並且按住,參數就是定位的按鈕
    action_obj.click_and_hold(click_obj)

    # 得到它的寬高
    size_ = click_obj.size
    width_ = 298 - size_['width']  # 滑框的寬度 減去 滑塊的 寬度 就是 向x軸移動的距離(向右)
    print(width_)
    # 3.定位滑動坐標
    action_obj.move_by_offset(298-width_, 0).perform()

    # 4.松開滑動
    action_obj.release()

    time.sleep(6)
    chrome_obj.quit()

9.打開多窗口和頁面切換

有時候窗口中有很多子tab頁面。這時候肯定是需要進行切換的。selenium提供瞭一個叫做switch_to_window來進行切換,具體切換到哪個頁面,可以從driver.window_handles中找到

from selenium import webdriver

if __name__ == '__main__':
    driver = webdriver.Chrome()

    driver.get("https://www.baidu.com/")
    driver.implicitly_wait(2)
    driver.execute_script("window.open('https://www.douban.com/')")
    driver.switch_to.window(driver.window_handles[1])

    print(driver.page_source)
 

10.Cookie操作

# 1.獲取所有的cookie:
for cookie in driver.get_cookies():
    print(cookie)
# 2.根據cookie的key獲取value:
value = driver.get_cookie(key)
# 3.刪除所有的cookie:
driver.delete_all_cookies()
# 4.刪除某個cookie:
driver.delete_cookie(key)
# 添加cookie:
driver.add_cookie({"name":"password","value":"111111"})
 

11.模擬登錄

這裡模擬登錄我們學校教務處:

from selenium.webdriver import Chrome

if __name__ == '__main__':
    web = Chrome()
    web.get('http://bkjx.wust.edu.cn/')
    username = web.find_element_by_id('userAccount')
    username.send_keys('xxxxxxx') # 這裡填自己的學號
    password = web.find_element_by_id('userPassword')
    password.send_keys('xxxxxxx') # 這裡填自己的密碼
    btn = web.find_element_by_xpath('//*[@id="ul1"]/li[4]/button')
    btn.click()
    # do something

 

因為沒有滑塊啥的驗證,所以就很簡單qwq。然後後面進行自己的操作即可。

12.優缺點

selenium能夠執行頁面上的js,對於js渲染的數據和模擬登陸處理起來非常容易。
selenium由於在獲取頁面的過程中會發送很多請求,所以效率非常低,所以在很多時候需要酌情使用。

到此這篇關於Python-Selenium自動化爬蟲的文章就介紹到這瞭,更多相關 Selenium自動化爬蟲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: