項目工坊 | Python驅動淘寶信息爬蟲

目錄

前言

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
  • datetimeostime:用于處理日期、時間和文件路徑。

  • pandas:用于數據處理和保存到Excel文件。

  • win32apiwin32con:用于訪問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文件中,便于后續分析和處理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71960.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71960.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71960.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯題型

藍橋杯 藍橋杯題型分類語法基礎藝術與籃球(日期問題)時間顯示(時間問題)跑步計劃(日期問題)偶串(字符)最長子序列(字符)字母數(進制轉換)6個0&…

【C語言】文件操作篇

目錄 文件的基本概念文本文件和二進制文件的差異 文件指針FILE 結構體文件指針的初始化和賦值 文件打開與關閉常見操作文件的打開文件的關閉 常見問題打開文件時的路徑問題打開文件失敗的常見原因fclose 函數的重要性 文件讀寫操作常見操作字符讀寫字符串讀寫格式化讀寫二進制讀…

【leetcode hot 100 21】合并兩個有序鏈表

解法一:新建一個鏈表存放有序的合并鏈表。當list1和list2至少有一個非空時,返回非空的;否則找出兩個鏈表的最小值作為新鏈表的頭,然后依次比較兩鏈表,每次都先插入小的值。 /*** Definition for singly-linked list.*…

Ubuntu 24.04.2 安裝 PostgreSQL 16 、PostGIS 3

安裝 PostgreSQL 16 apt install postgresql-16passwd postgres,修改 postgres 用戶密碼su postgrespsql -U postgres, 以 postgres 的身份登錄數據庫alter user postgres with password abc123;\q 退出/etc/postgresql/16/main/postgresql.conf 可修改 #listen_ad…

Spring Boot框架總結(超級詳細)

前言 本篇文章包含Springboot配置文件解釋、熱部署、自動裝配原理源碼級剖析、內嵌tomcat源碼級剖析、緩存深入、多環境部署等等,如果能耐心看完,想必會有不少收獲。 一、Spring Boot基礎應用 Spring Boot特征 概念: 約定優于配置&#…

postgresql14編譯安裝腳本

#!/bin/bash####################################readme################################### #先上傳postgresql源碼包,再配置yum源,然后執行腳本 #備份官方yum源配置文件: #cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS…

AI開發利器:miniforge3無感平替Anaconda3

相信有和我遭遇一樣的同學吧,之前裝了anaconda用的挺好的(可以參考AI開發利器:Anaconda),但是考慮到有可能收到軟件侵權的律師函的風險,還是果斷找個替代品把anaconda卸載掉。miniforge就是在這樣的背景下發…

Reactor中的Flux和Mono的區別

Reactor中的Flux和Mono的區別 在Reactor框架中,Flux 和 Mono 是兩個核心的類型,分別用于處理不同的數據流場景。理解它們之間的區別是掌握響應式編程的關鍵。 1. 基本概念 Flux: 表示一個異步、非阻塞的流,能夠發布零個或多個元素。它適用于…

AI-NAS:當存儲遇上智能,開啟數據管理新紀元

在數據爆炸的時代,NAS(網絡附加存儲)已成為個人和企業存儲海量數據的利器。然而,面對日益龐大的數據量,傳統的NAS系統在文件管理和搜索效率上逐漸力不從心。AI-NAS應運而生,它將NAS與人工智能(A…

用 Vue 3.5 TypeScript 做了一個日期選擇器(改進版)

上一篇 已經實現了一個日期選擇器&#xff0c;只不過是模態窗的形式&#xff0c;這個版本改為文本框彈出&#xff0c;點擊空白處可關閉日歷 代碼也增加了不少 <template><div><!-- 添加文本框 --><div class"date-picker-input-wrapper">&l…

【09】單片機編程核心技巧:變量賦值,從定義到存儲的底層邏輯

【09】單片機編程核心技巧&#xff1a;變量賦值&#xff0c;從定義到存儲的底層邏輯 &#x1f31f; 核心概念 單片機變量的定義與賦值是程序設計的基礎&#xff0c;其本質是通過 RAM&#xff08;隨機存儲器&#xff09; 和 ROM&#xff08;只讀存儲器&#xff09; 的協作實現…

【爬蟲】開篇詞

一、網絡爬蟲概述 二、網絡爬蟲的應用場景 三、爬蟲的痛點 四、需要掌握哪些技術&#xff1f; 在這個信息爆炸的時代&#xff0c;如何高效地獲取和處理海量數據成為一項核心技能。無論是數據分析、商業情報、學術研究&#xff0c;還是人工智能訓練&#xff0c;網絡爬蟲&…

文字轉語音chat-tts-ui

去年已經使用過chattts了&#xff0c;但是昨晚想用的時候卻記怎么打開了&#xff0c;找了一下以前的筆記 MacOS 下源碼部署chat-tts-ui 配置好 python3.9-3.11 環境,安裝git &#xff0c;執行命令 brew install libsndfile git python3.10 繼續執行 brew install ffmpeg ? …

基于SpringBoot+Vue的瑜伽課體驗課預約系統【附源碼】

基于SpringBootVue的瑜伽課體驗課預約系統 一、系統技術說明二、運行說明三、系統的演示四、系統的核心代碼演示 一、系統技術說明 框架&#xff1a;SpringbootVue 數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 數據庫工具&#xff1a;Navicat11 開發軟…

sparkTTS window 安裝

SparkTTS 的簡介 Spark-TTS是一種基于SpardAudio團隊提出的 BiCodec 構建的新系統&#xff0c;BiCodec 是一種單流語音編解碼器&#xff0c;可將語音策略性地分解為兩種互補的標記類型&#xff1a;用于語言內容的低比特率語義標記和用于說話者特定屬性的固定長度全局標記。這種…

從零開始:使用 Python 實現機器學習的基礎與實踐

文章大綱&#xff1a; 引言 機器學習的定義與應用場景。Python 在機器學習領域的優勢。本文目標&#xff1a;通過 Python 實現一個簡單的機器學習項目。 環境準備 安裝 Python 和必要的庫&#xff08;如 NumPy、Pandas、Scikit-learn&#xff09;。使用 Jupyter Notebook 或 V…

ApoorvCTF Rust語言逆向實戰

上周參加了國外的比賽&#xff0c;名稱叫&#xff1a;ApoorvCTF 看一下老外的比賽跟我們有什么不同&#xff0c;然后我根據國內比賽對比發現&#xff0c;他們考點還是很有意思的&#xff0c;反正都是逆向&#xff0c;哈哈哈 Rusty Vault 題目描述&#xff1a; In the heart…

Git和GitHub基礎教學

文章目錄 1. 前言2. 歷史3. 下載安裝Git3.1 下載Git3.2 安裝Git3.3 驗證安裝是否成功 4. 配置Git5. Git基礎使用5.1 通過Git Bash使用5.1.1 創建一個新的倉庫。5.1.1.1 克隆別人的倉庫5.1.1.2 自己創建一個本地倉庫 5.1.2 管理存檔 5.2 通過Visual Studio Code使用 6. Git完成遠…

MySQL中like模糊查詢如何優化?

大家好&#xff0c;我是鋒哥。今天分享關于【MySQL中like模糊查詢如何優化?】面試題。希望對大家有幫助&#xff1b; MySQL中like模糊查詢如何優化? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在 MySQL 中&#xff0c;LIKE 模糊查詢雖然非常常見&#xff0c;…

?LeetCode(數學分類) 2. 兩數相加——暴力與優化?

?LeetCode(數學分類) 2. 兩數相加——暴力與優化? 提示&#xff1a; 每個鏈表中的節點數在范圍 [1, 100] 內 0 < Node.val < 9 題目數據保證列表表示的數字不含前導零 題解&#xff1a; 暴力與優化&#xff0c;暴力即轉換為十進制解題&#xff0c;優化即直接在鏈表上進…