selenium爬蟲
簡介:
能夠模擬瀏覽器執行
是自動化測試工具
pip install selenium安裝selenium
針對不同的瀏覽器需要安裝不同的驅動
確認瀏覽器的版本
https://www.cnblogs.com/aiyablog/articles/17948703
下載驅動
# @作者: Alice
# @時間: 2024/12/7 22:10
from selenium import webdriver
# Chrome瀏覽器
chromedriver_path = r"./chromedriver-win64/chromedriver.exe"
driver = webdriver.Chrome(executable_path=chromedriver_path)
# Selenium 4中webdriver.Chrome的初始化方法不再接受executable_path引數來指定Chrome WebDriver的路徑。
selenium4之後不支援executable_path引數的解決辦法:
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service('./chromedriver-win64/chromedriver.exe')
driver = webdriver.Chrome(service=service)
解決了驅動的問題,開啟瀏覽器之後出現閃退的解決辦法:
pip install selenium==4.5.0,透過降低當前selenium的版本來解決
詳細解釋程式碼:
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
關閉瀏覽器
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
time.sleep(2)
driver.close()
訪問頁面
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
url = "https://www.baidu.com"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
driver.get(url=url)
time.sleep(2)
driver.close()
設定瀏覽器的大小
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
url = "https://www.baidu.com"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
driver.maximize_window() # 全屏顯示
driver.get(url=url)
time.sleep(2)
driver.set_window_size(900, 500) # 設定瀏覽器視窗具體的大小
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
time.sleep(2)
driver.close()
前進和後退
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
baidu_url = "https://www.baidu.com"
jd_url = "https://www.jd.com"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
driver.maximize_window() # 全屏顯示
driver.get(url=baidu_url)
time.sleep(2)
driver.set_window_size(900, 500) # 設定瀏覽器視窗具體的大小
driver.get(url=jd_url)
driver.back() # 回退
time.sleep(2)
driver.forward() # 前進
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
time.sleep(2)
driver.close()
獲取頁面基本資訊
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
baidu_url = "https://www.baidu.com"
jd_url = "https://www.jd.com"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
driver.maximize_window() # 全屏顯示
driver.get(url=baidu_url)
print(driver.title) # 網頁標題
print(driver.current_url) # 網頁url
time.sleep(2)
driver.set_window_size(900, 500) # 設定瀏覽器視窗具體的大小
driver.get(url=jd_url)
print(driver.title) # 網頁標題
print(driver.current_url) # 網頁url
driver.back() # 回退
time.sleep(2)
driver.forward() # 前進
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
print(driver.name) # 瀏覽器名稱
time.sleep(2)
print(driver.page_source) # 網頁原始碼
driver.close()
定位頁面元素
等等資訊都可以進行定位
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
from selenium.webdriver.common.by import By # 定位頁面元素
import time
baidu_url = "https://www.baidu.com"
jd_url = "https://www.jd.com"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
driver.maximize_window() # 全屏顯示
driver.get(url=baidu_url)
print(driver.title) # 網頁標題
print(driver.current_url) # 網頁url
time.sleep(2)
driver.set_window_size(900, 500) # 設定瀏覽器視窗具體的大小
driver.get(url=jd_url)
print(driver.title) # 網頁標題
print(driver.current_url) # 網頁url
driver.back() # 回退
time.sleep(2)
driver.forward() # 前進
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
print(driver.name) # 瀏覽器名稱
time.sleep(2)
search = driver.find_element(by=By.ID,value='key')
# <selenium.webdriver.remote.webelement.WebElement (session="fc667113340e1e99705053d61f33698f", element="f.BE6C03606C78BBB8D11B9791071B748E.d.DBD267C241C18F6579A7387F952D3D0F.e.12")>
btn = driver.find_element(by=By.CLASS_NAME,value='button')
# <selenium.webdriver.remote.webelement.WebElement (session="fc667113340e1e99705053d61f33698f", element="f.BE6C03606C78BBB8D11B9791071B748E.d.DBD267C241C18F6579A7387F952D3D0F.e.33")>
# print(driver.page_source) # 網頁原始碼
driver.close()
退出整個瀏覽器與關閉當前頁面
driver.quit() # 退出瀏覽器
driver.close() # 關閉當前頁面
擷取當前瀏覽器頁面,並且儲存截圖
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
url = "https://www.baidu.com"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
driver.get(url=url)
time.sleep(2)
driver.save_screenshot("baidu.png")
driver.close()
可以使用selenium爬取的練手網站
https://www.gushiwen.cn/
輸入資料
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
from selenium.webdriver.common.by import By
url = "https://www.baidu.com"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
driver.get(url=url)
search = driver.find_element(by=By.ID,value='kw')
time.sleep(2)
search.send_keys("python爬蟲")
time.sleep(2)
driver.close()
點選搜尋
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
from selenium.webdriver.common.by import By
url = "https://www.gushiwen.cn/"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
driver.get(url=url)
search = driver.find_element(by=By.ID,value='txtKey')
time.sleep(2)
search.send_keys("長恨歌")
time.sleep(2)
submit = driver.find_element(By.XPATH, '//*[@id="search"]/form/input[3]')
submit.click() # 點選搜尋按鈕
time.sleep(2)
driver.close()
獲取所有指定元素,指定該元素的屬性值
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
from selenium.webdriver.common.by import By
url = "https://www.gushiwen.cn/"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
driver.get(url=url)
search = driver.find_element(by=By.ID,value='txtKey')
time.sleep(2)
search.send_keys("長恨歌")
time.sleep(2)
submit = driver.find_element(By.XPATH, '//*[@id="search"]/form/input[3]')
submit.click() # 點選搜尋按鈕
time.sleep(2)
a_list = driver.find_elements(By.TAG_NAME, 'a')
for a in a_list:
print(a.get_attribute('href'))
driver.close()
獲取超連結文字內容是指定文字的元素
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
from selenium.webdriver.common.by import By
url = "https://www.gushiwen.cn/"
service = Service('./chromedriver-win64/chromedriver.exe') # 指定谷歌瀏覽器的驅動
# <selenium.webdriver.chrome.service.Service object at 0x000001E74A970F10>
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f1bf13922c749ba9b55dd155538b4d32")>
driver.get(url=url)
search = driver.find_element(by=By.ID,value='txtKey')
time.sleep(2)
res = driver.find_elements(By.LINK_TEXT, '唐詩三百')
print(res)
driver.close()
模擬登入圖片驗證碼網站,遇到驗證碼首先將驗證碼圖片進行截圖
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
from selenium.webdriver.common.by import By # 定位元素
url = "https://www.gushiwen.cn/" # 要訪問的網址
service = Service('./chromedriver-win64/chromedriver.exe') # 谷歌瀏覽器驅動
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
driver.maximize_window()
driver.get(url=url) # 使用谷歌瀏覽器訪問指定網址
# 點選我的
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div/div[2]/div/a[6]').click()
time.sleep(2)
username = 'xxxxxx'
userpass = 'xxxxxx'
# 獲取使用者名稱節點 並輸入使用者名稱
driver.find_element(By.ID, 'email').send_keys(username)
time.sleep(2)
# 獲取密碼節點 並輸入密碼
driver.find_element(By.ID, 'pwd').send_keys(userpass)
time.sleep(2)
# 獲取雁陣嗎圖片的節點物件 並進行擷取 儲存為code.png
driver.find_element(By.ID, 'imgCode').screenshot('code.png')
time.sleep(2)
driver.close()
使用打碼平臺處理圖片登入驗證碼
改成python3的輸出方式(加上括號)
需要的東西:超級鷹的使用者名稱,超級鷹的密碼,超級鷹的軟體ID,需要處理的圖片路徑,處理的驗證碼型別
# 使用超級鷹打碼平臺https://www.chaojiying.com/
# @作者: Alice
# @時間: 2024/12/7 22:16
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
import time
from selenium.webdriver.common.by import By # 定位元素
from chaojiying import run # 呼叫超級鷹
url = "https://www.gushiwen.cn/" # 要訪問的網址
service = Service('./chromedriver-win64/chromedriver.exe') # 谷歌瀏覽器驅動
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
driver.maximize_window()
driver.get(url=url) # 使用谷歌瀏覽器訪問指定網址
# 點選我的
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div/div[2]/div/a[6]').click()
time.sleep(2)
username = 'xxxxxxxxx'
userpass = 'xxxxxxxxx'
driver.find_element(By.ID, 'email').send_keys(username)
time.sleep(2)
driver.find_element(By.ID, 'pwd').send_keys(userpass)
time.sleep(2)
driver.find_element(By.ID, 'imgCode').screenshot('code.png')
path = "./code.png"
img_id = "1004"
pic_str = run(path, img_id)["pic_str"] # 返回的就是一個dict不用json了
time.sleep(2)
driver.find_element(By.ID, 'code').send_keys(pic_str)
time.sleep(2)
driver.find_element(By.ID, 'denglu').click()
time.sleep(2)
driver.close()
滑鼠滾動,利用execute_script方法執行js程式碼
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
def scroll_windwo(driver, stop_lengt=None, step_length=2000):
while True:
if stop_lengt:
if stop_lengt - step_length <= 0: # 剛好夠一步,走完直接結束迴圈,走完剩下的
driver.execute_script(f'window.scrollBy(0, {stop_lengt})') # execute_script可以執行js,向下滾動多少畫素
break
print(f"當前的總路程為:{stop_lengt}")
driver.execute_script(f'window.scrollBy(0, {step_length})') # 走好每一步
stop_lengt -= step_length # 更新總路程
time.sleep(0.5)
url = "https://news.163.com/"
step_length = 2000 # 每次滾動的距離(畫素)
stop_lengt = 30000 # 滾動的總距離(畫素)
service = Service('./chromedriver-win64/chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.maximize_window()
driver.get(url=url)
for i in range(1, 6):
scroll_windwo(driver, stop_lengt, step_length) # 滾動一個總路程
more = driver.find_element(By.XPATH, '//*[@id="index2016_wrap"]/div[3]/div[2]/div[3]/div[2]/div[5]/div/a[3]')
driver.execute_script('arguments[0].click();', more) # 點選更多
print(f'第{i}次點選')
driver.quit()
不顯示瀏覽器,即:無頭模式
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
url = "https://www.gushiwen.cn/"
opt = Options()
service = Service('./chromedriver-win64/chromedriver.exe')
opt.add_argument("--headless") # 無頭模式
driver = webdriver.Chrome(service=service, options=opt)
driver.get(url=url)
print(driver.page_source)
使用打碼平臺登入之後獲取cookie然後將cookie使用json模組序列化儲存到本地
# @作者: Alice
# @時間: 2024/12/7 22:16
import time
import json
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
from selenium.webdriver.common.by import By # 定位元素
from chaojiying import run # 呼叫超級鷹
url = "https://www.gushiwen.cn/" # 要訪問的網址
service = Service('./chromedriver-win64/chromedriver.exe') # 谷歌瀏覽器驅動
driver = webdriver.Chrome(service=service) # 谷歌瀏覽器
driver.maximize_window()
driver.get(url=url) # 使用谷歌瀏覽器訪問指定網址
# 點選我的
driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div/div[2]/div/a[6]').click()
time.sleep(2)
username = 'xxxxxxxx'
userpass = 'xxxxxxxx'
# 獲取使用者名稱節點 並輸入使用者名稱
driver.find_element(By.ID, 'email').send_keys(username)
time.sleep(2)
# 獲取密碼節點 並輸入密碼
driver.find_element(By.ID, 'pwd').send_keys(userpass)
time.sleep(2)
# 獲取雁陣嗎圖片的節點物件 並進行擷取 儲存為code.png
driver.find_element(By.ID, 'imgCode').screenshot('code.png')
path = "./code.png"
img_id = "1004"
pic_str = run(path, img_id)["pic_str"] # 返回的就是一個dict不用json了
time.sleep(2)
driver.find_element(By.ID, 'code').send_keys(pic_str)
time.sleep(2)
driver.find_element(By.ID, 'denglu').click()
time.sleep(2)
cookies = driver.get_cookies() # cookie返回的結果是一個列表型別<class 'list'>
driver.close()
json_cookies = json.dumps(cookies) # 使用json進行處理,序列化為json放到本地檔案中
with open('gsw_cookies.txt', 'w') as f:
f.write(json_cookies)
使用本地的cookie進行登入
# @作者: Alice
# @時間: 2024/12/7 22:16
import time
import json
from selenium import webdriver # Selenium的中文名是“硒”,webdriver網路驅動程式
from selenium.webdriver.chrome.service import Service # service服務
url = "https://so.gushiwen.cn/user/collect.aspx" # 這裡直接進入登入介面了
service = Service('./chromedriver-win64/chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.maximize_window()
driver.get(url=url) # 使用谷歌瀏覽器訪問指定網址,沒有cookie之前是沒有登入的狀態
time.sleep(2)
with open('gsw_cookies.txt', 'r') as f:
cookies = json.loads(f.read()) # 反序列化為列表型別的cookie
for cookie in cookies:
driver.add_cookie(cookie)
driver.refresh() # 重新整理使得cookie生效
# 重新訪問登入介面,有了cookie之後是已經登入的狀態
driver.get(url)
好了,以上就結束了,只是一個簡單的使用,之後直接看官方文件吧,
沒啥說的,又是無聊的一天。
最近太忙也不知道忙什麼。。