程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python之Selenium自動化爬蟲

編輯:Python

文章目錄

  • Python之Selenium自動化爬蟲
    • 0.介紹
    • 1.安裝
    • 2.下載浏覽器驅動
    • 3.實例
    • 4.開啟無頭模式
    • 5.保存頁面截圖
    • 6.模擬輸入和點擊
      • a.根據文本值查找節點
      • b.獲取當前節點的文本
      • c.打印當前網頁的一些信息
      • d.關閉浏覽器
      • e.模擬鼠標滾動
    • 7.ChromeOptions
    • 8.驗證滑塊移動
    • 9.打開多窗口和頁面切換
    • 10.Cookie操作
    • 11.模擬登錄
    • 12.使用代理
    • 14.更換UA
    • 15.鼠標懸停
    • 16.優缺點

Python之Selenium自動化爬蟲

0.介紹

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個實例

https://harris.blog.csdn.net/article/details/116406200

4.開啟無頭模式

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

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
option = Options() # 實例化option對象
option.add_argument("--headless") # 給option對象添加無頭參數
option.headless = True #這種方式也可以
if __name__ == '__main__':
web = Chrome(executable_path='D:PyProjectspiderenvScriptschromedriver.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('')
btn = web.find_element_by_id('su')
btn.click()
# web.close() # 關閉當前網頁

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

a.根據文本值查找節點

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

b.獲取當前節點的文本

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

c.打印當前網頁的一些信息

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

d.關閉浏覽器

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

e.模擬鼠標滾動

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:ProgramAppchromedriverchromedriver73.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)

第二個實例

if __name__ == '__main__':
from selenium import webdriver
import time
driver = webdriver.Chrome()
start_url = 'https://www.baidu.com'
start_url_1 = 'https://www.csdn.net'
driver.get(start_url)
time.sleep(5)
"""通過執行js代碼,打開浏覽器窗口,訪問地址"""
js = 'window.open("{}")'.format(start_url_1)
driver.execute_script(js)
time.sleep(5)
"""獲取浏覽器所有窗口:注意點:窗口的切換是通過下標控制的"""
win = driver.window_handles
# 執行切換
driver.switch_to.window(win[0])
time.sleep(2)
driver.switch_to.window(win[1])
time.sleep(2)
driver.switch_to.window(win[0])
time.sleep(2)
driver.switch_to.window(win[1])
# 浏覽器窗口的關閉
driver.close()
# 退出浏覽器
driver.quit()

有時候網頁會內嵌另一個html。一般稱為iframe

from selenium import webdriver
driver = webdriver.Chrome()
start_url = 'https://mail.163.com/'
driver.get(start_url)
"""定位不成功,在有的情況是因為有頁面的嵌套導致的
在一個html源碼中有多個html頁面,示例:一個html嵌套一個html
以上:又稱之為iframe的嵌套
"""
# 定位嵌套位置iframe
el_iframe = driver.find_elements_by_tag_name('iframe')
# 執行iframe的切換
driver.switch_to.frame(el_iframe[0])
# 標簽定位
driver.find_element_by_name('email').send_keys('郵箱賬號')
driver.find_element_by_name('password').send_keys('你的郵箱密碼')
driver.find_element_by_id('dologin').click()

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.使用代理

from selenium import webdriver
import time
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://ip地址') # 代理IP:端口號
# ${chromedriver_path}: chromedriver驅動存放路徑
driver = webdriver.Chrome(options=options)
driver.get("https://dev.kdlapi.com/testproxy")
# 獲取頁面內容
print(driver.page_source)
# 延遲3秒後關閉當前窗口,如果是最後一個窗口則退出
time.sleep(3)
driver.close()

14.更換UA

from selenium import webdriver
import time
agent = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'
options = webdriver.ChromeOptions()
options.add_argument('--user-agent=' + agent)
# ${chromedriver_path}: chromedriver驅動存放路徑
driver = webdriver.Chrome(options=options)
driver.get("https://www.baidu.com")
# 獲取頁面內容
print(driver.page_source)
# 延遲3秒後關閉當前窗口,如果是最後一個窗口則退出
time.sleep(3)

15.鼠標懸停

if __name__ == '__main__':
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
import time
start_url = 'https://lceda.cn/'
driver.get(start_url)
# 定位到需要懸停的標簽
move = driver.find_element_by_xpath('//*[@id="headerNav"]/li[1]/a/span')
# //*[@id="headerNav"]/li[1]/a/span
# 懸停之後需要點擊的標簽
a = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[1]/div[3]/div[1]/a[2]')
# //*[@id="headerNav"]/li[1]/div/a[2]
# /html/body/div[1]/div[2]/div[1]/div[1]/div[1]/div/div/div[1]/ul/li[1]/div/a[2]
# 懸停點擊執行
# 創建事件對象
actions = ActionChains(driver)
time.sleep(1)
# 記錄操作
actions.move_to_element(move)
time.sleep(1.5)
# 懸停的點擊
actions.click(a)
time.sleep(1)
# 開始執行事件
actions.perform()

16.優缺點

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


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved