目錄
前言
1 完整代碼
2 代碼解讀
2.1?導入模塊
2.2?定義?TaoBao?類
2.3?search_infor_price_from_web?方法
2.3.1 獲取下載路徑
2.3.2 設置瀏覽器選項
2.3.3 反爬蟲處理
2.3.4 啟動瀏覽器
2.3.5 修改瀏覽器屬性
2.3.6 設置下載行為
2.3.7 打開淘寶登錄頁面
2.3.8 登錄淘寶
2.3.9 搜索商品并提取信息
2.3.10 提取商品信息
3.11 保存數據到Excel
2.4?執行腳本
3 總結與思考
前言
Selenium作為主流的Web自動化測試框架,在數據采集領域也有廣泛應用。本文將分享如何使用Selenium實現淘寶物資價格信息的爬取。目前代碼還存在一些缺陷,主要體現在:1)未能有效繞過淘寶的反爬蟲機制;2)登錄環節仍需人工干預。歡迎大伙在評論區分享解決方案。
1 完整代碼
import datetime
import os
import timeimport pandas as pd
import win32api
import win32con
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import Byclass TaoBao():# 下載每月出門單信息def search_infor_price_from_web(self, path_dir=os.path.abspath(r'.'), descr_list=['脫脂紗布', '機器人', '襯衫']):key1 = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 0,win32con.KEY_READ)download_path = win32api.RegQueryValueEx(key1, 'Desktop')[0]download_path = os.path.join(os.path.dirname(download_path), 'Downloads')print(download_path)# FileProcess().remove_assign_excel_file_in_path(download_path, key)# 重新從網站下載調撥文件print('瀏覽器設置默認信息,如關閉下載保留提示!!!')start_x_1 = datetime.datetime.now()options = Options()prefs = {'download.prompt_for_download': False, 'download.default_directory': download_path}options.add_experimental_option("prefs", prefs)options.add_experimental_option('excludeSwitches', ['enable-automation']) # 這里去掉window.navigator.webdriver的特性options.add_argument("--disable-blink-features=AutomationControlled")options.add_argument('--force-device-scale-factor=1')options.add_argument('--start-maximized') # 最大化窗口options.add_experimental_option('excludeSwitches', ['enable-automation']) # 禁用自動化欄options.add_experimental_option('useAutomationExtension',False) # 禁用自動化欄的原理:將window.navigator.webdriver改為undefined。# 屏蔽密碼提示框prefs = {'credentials_enable_service': False, 'profile.password_manager_enabled': False}options.add_experimental_option('prefs', prefs)# 反爬蟲特征處理options.add_argument('--disable-blink-features=AutomationControlled')# options.add_argument("--headless") # 無界面模式# options.add_argument("--disadle-gpu") # 禁用顯卡# driver = webdriver.Chrome(chrome_options=options)driver = webdriver.Chrome(options=options)# 修改了瀏覽器的內部屬性,跳過了登錄的滑動驗證driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})# driver = webdriver.Chrome()driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')params = {'cmd': 'Page.setDownloadBehavior','params': {'behavior': 'allow', 'downloadPath': download_path}}driver.execute("send_command", params)print('瀏覽器將打開已經進入!!!')end_x_1 = datetime.datetime.now()print('花費%s時長進入瀏覽器!!!' % (end_x_1 - start_x_1))driver.maximize_window() # 最大化谷歌瀏覽器driver.implicitly_wait(10) # 隱性等待10s# driver.get('https://www.taobao.com')driver.get('https://login.taobao.com/member/login.jhtml')# 修改了瀏覽器的內部屬性,跳過了登錄的滑動驗證driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})# 手機掃碼登入# 嘗試輸入密碼try:time.sleep(3)# 輸入賬號密碼username = driver.find_element(By.ID, 'fm-login-id')# username.send_keys('jianfei.xu')username.send_keys('XXXXXX')time.sleep(10)password = driver.find_element(By.ID, 'fm-login-password')# password.send_keys('0000000.')password.send_keys('XXXXX')time.sleep(10)# 點擊登入driver.find_element(By.XPATH,'/html/body/div/div[2]/div[3]/div/div/div/div[1]/div/form/div[6]/button').click()driver.implicitly_wait(10) # 隱式等待10stime.sleep(5)except:passtime.sleep(60)print(123)data_list = []for search_str in descr_list:# 輸入搜索框path = '/html/body/div[3]/div[2]/div[1]/div/div/div[3]/div/div[1]/form/div[4]/input'driver.find_element(By.XPATH, path).clear()driver.find_element(By.XPATH, path).send_keys(search_str)time.sleep(2)# 查詢path = '/html/body/div[3]/div[2]/div[1]/div/div/div[3]/div/div[1]/form/div[2]/button'driver.find_element(By.XPATH, path).click()time.sleep(2)# 切換瀏覽器窗口handle = driver.window_handles # 獲取句柄,得到的是一個列表driver.switch_to.window(handle[-1]) # 切換至最新句柄time.sleep(10)try:path = '/html/body/div[3]/div[3]/div[1]/div[1]/div/div[2]/div[3]'text_str = driver.find_element(By.XPATH, path).textexcept:passtry:path = '/html/body/div[3]/div[3]/div/div[1]/div/div[3]'text_str = driver.find_element(By.XPATH, path).textexcept:pass'/html/body/div[3]/div[4]/div/div[1]/div/div[3]/div[3]/div/div[1]/a/div/div[1]/div[1]/img[1]''/html/body/div[3]/div[4]/div/div[1]/div/div[3]/div[3]/div/div[2]/a/div/div[1]/div[1]/img''/html/body/div[3]/div[4]/div/div[1]/div/div[3]/div[3]/div/div[3]/a/div/div[1]/div[1]/img''/html/body/div[3]/div[4]/div/div[1]/div/div[3]/div[3]/div/div[4]/a/div/div[1]/div[1]/img'# 對text_str進行數據提取print(text_str)data_dic = {}data_dic['物資'] = search_strtext_list = text_str.split('\n')print(text_list)ix = 1for i in range(len(text_list)):each_str = text_list[i]if each_str == '¥':print('>>>>>>>>>>>>>>>>>>>>')descr_picture_url = os.path.join(path_dir, text_list[i - 1] + '.webp')print(descr_picture_url)print(text_list[i - 1]) # 描述print(text_list[i])print(text_list[i + 1]) # 金額print(text_list[i + 3]) # 地點data_dic['對比%s-描述' % str(ix)] = text_list[i - 1]data_dic['對比%s-金額' % str(ix)] = text_list[i + 1]data_dic['對比%s-地點' % str(ix)] = text_list[i + 3]ix += 1data_list.append(data_dic)print('>>>>>>>>>>>>>>>>>>')print(text_str)# 關閉最新窗口# 跳轉到新頁面進行完一系列操作后driver.close() # 關閉新開的頁面time.sleep(2)driver.switch_to.window(driver.window_handles[0]) # 跳轉首頁df = pd.DataFrame(data_list)df.to_excel('temp123.xlsx')df = pd.DataFrame(data_list)df.to_excel('temp123.xlsx')return df# 類引用
TaoBao().search_infor_price_from_web()
這段代碼是一個使用Selenium自動化工具從淘寶網站上抓取商品信息的Python腳本。代碼的主要功能是通過模擬瀏覽器操作,登錄淘寶,搜索指定商品,并提取商品的價格、描述和地點等信息,最后將這些信息保存到Excel文件中。以下是對上述代碼的詳細解讀
2 代碼解讀
2.1?導入模塊
import datetime
import os
import time
import pandas as pd
import win32api
import win32con
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
-
datetime
、os
、time
:用于處理日期、時間和文件路徑。 -
pandas
:用于數據處理和保存到Excel文件。 -
win32api
、win32con
:用于訪問Windows注冊表,獲取下載路徑。 -
selenium
:用于自動化瀏覽器操作,模擬用戶行為。
2.2?定義?TaoBao
?類
class TaoBao():
-
這個類封裝了從淘寶網站抓取商品信息的功能。
2.3?search_infor_price_from_web
?方法
def search_infor_price_from_web(self, path_dir=os.path.abspath(r'.'), descr_list=['脫脂紗布', '機器人', '襯衫']):
-
這是類中的主要方法,用于從淘寶網站抓取商品信息。
-
path_dir
:指定保存文件的路徑,默認為當前目錄。 -
descr_list
:要搜索的商品列表,默認為?['脫脂紗布', '機器人', '襯衫']
。
2.3.1 獲取下載路徑
key1 = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 0,win32con.KEY_READ)
download_path = win32api.RegQueryValueEx(key1, 'Desktop')[0]
download_path = os.path.join(os.path.dirname(download_path), 'Downloads')
print(download_path)
-
通過訪問Windows注冊表,獲取用戶的桌面路徑,并將其修改為下載路徑(
Downloads
文件夾)。
2.3.2 設置瀏覽器選項
options = Options()
prefs = {'download.prompt_for_download': False, 'download.default_directory': download_path}
options.add_experimental_option("prefs", prefs)
-
設置Chrome瀏覽器的下載選項,禁用下載提示,并指定下載路徑。
2.3.3 反爬蟲處理
options.add_experimental_option('excludeSwitches', ['enable-automation']) # 去掉window.navigator.webdriver的特性
options.add_argument("--disable-blink-features=AutomationControlled")
-
通過修改瀏覽器選項,避免被網站識別為自動化腳本。
2.3.4 啟動瀏覽器
driver = webdriver.Chrome(options=options)
-
啟動Chrome瀏覽器,應用之前設置的選項。
2.3.5 修改瀏覽器屬性
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})
-
通過執行Chrome DevTools Protocol命令,修改瀏覽器的
navigator.webdriver
屬性,避免被檢測為自動化工具。
2.3.6 設置下載行為
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
params = {'cmd': 'Page.setDownloadBehavior','params': {'behavior': 'allow', 'downloadPath': download_path}}
driver.execute("send_command", params)
-
設置瀏覽器的下載行為,允許下載并指定下載路徑。
2.3.7 打開淘寶登錄頁面
driver.get('https://login.taobao.com/member/login.jhtml')
-
打開淘寶的登錄頁面。
2.3.8 登錄淘寶
username = driver.find_element(By.ID, 'fm-login-id')
username.send_keys('XXXXX')
password = driver.find_element(By.ID, 'fm-login-password')
password.send_keys('XXXXX')
driver.find_element(By.XPATH, '/html/body/div/div[2]/div[3]/div/div/div/div[1]/div/form/div[6]/button').click()
-
通過輸入用戶名和密碼,點擊登錄按鈕,完成登錄操作。
2.3.9 搜索商品并提取信息
for search_str in descr_list:driver.find_element(By.XPATH, path).clear()driver.find_element(By.XPATH, path).send_keys(search_str)driver.find_element(By.XPATH, path).click()
-
遍歷
descr_list
中的每個商品名稱,輸入搜索框并點擊搜索按鈕。
2.3.10 提取商品信息
text_str = driver.find_element(By.XPATH, path).text
text_list = text_str.split('\n')
-
從搜索結果頁面中提取商品信息,并將其拆分為列表。
3.11 保存數據到Excel
df = pd.DataFrame(data_list)
df.to_excel('temp123.xlsx')
-
將提取的商品信息保存到Excel文件中。
2.4?執行腳本
TaoBao().search_infor_price_from_web()
-
創建
TaoBao
類的實例,并調用search_infor_price_from_web
方法,執行整個抓取過程。
3 總結與思考
這段代碼通過Selenium模擬瀏覽器操作,實現了從淘寶網站抓取商品信息的功能。代碼中使用了多種反爬蟲技術,避免被網站檢測為自動化腳本。最終,抓取到的商品信息被保存到Excel文件中,便于后續分析和處理。