04selenium爬蟲輕鬆入門

请叫我虾發表於2024-12-08

selenium爬蟲

簡介:

能夠模擬瀏覽器執行

是自動化測試工具

pip install selenium安裝selenium

針對不同的瀏覽器需要安裝不同的驅動

確認瀏覽器的版本

image

image

https://www.cnblogs.com/aiyablog/articles/17948703

下載驅動

image

image

# @作者: 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的版本來解決

image

詳細解釋程式碼:

# @作者: 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()

定位頁面元素

image

等等資訊都可以進行定位

# @作者: 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()

使用打碼平臺處理圖片登入驗證碼

image

image

image

image

image

改成python3的輸出方式(加上括號)
image

需要的東西:超級鷹的使用者名稱,超級鷹的密碼,超級鷹的軟體ID,需要處理的圖片路徑,處理的驗證碼型別
image

# 使用超級鷹打碼平臺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)

好了,以上就結束了,只是一個簡單的使用,之後直接看官方文件吧,
沒啥說的,又是無聊的一天。
最近太忙也不知道忙什麼。。

相關文章