Python網絡爬蟲實現selenium對百度識圖二次開發以及批量保存Excel

一.百度識圖自動上傳圖片
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)
driver.get('https://graph.baidu.com/pcpage/index?tpl_from=pc')
driver.find_element(by=By.NAME, value='file').send_keys(r"D:\7.18\圖1.jpg")
input('')

代碼講解:百度識圖自動上傳圖片

這段代碼使用 Selenium 庫實現了自動打開百度識圖網頁并上傳本地圖片的功能。下面是對代碼的逐行解釋:

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
  • 導入必要的 Selenium 模塊:webdriver用于控制瀏覽器,Options用于配置瀏覽器選項,By用于定位網頁元素。

?

edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"

?

  • 創建 Edge 瀏覽器的配置選項對象,并指定 Edge 瀏覽器的安裝路徑。這一步是可選的,如果 Edge 瀏覽器已添加到系統 PATH 中,可以省略。
driver = webdriver.Edge(options=edge_options)
  • 初始化 Edge 瀏覽器驅動,創建一個可以控制瀏覽器的驅動對象。
driver.get('https://graph.baidu.com/pcpage/index?tpl_from=pc')
  • 使用瀏覽器打開百度識圖的網頁。

?

driver.find_element(by=By.NAME, value='file').send_keys(r"D:\7.18\圖1.jpg")

?

  • 定位網頁上的文件上傳元素(通過元素的name屬性值為file來查找)。
  • 使用send_keys()方法模擬鍵盤輸入,將本地圖片的路徑發送給上傳元素,從而實現自動上傳圖片。
input('')

不啟動瀏覽器獲取網頁資源

上述代碼使用了 Selenium WebDriver,它需要啟動一個真實的瀏覽器來執行操作。如果只需要獲取網頁的靜態資源(如 HTML 內容、JSON 數據等),可以使用更輕量級的庫,如requests

  • 程序會在此處暫停,等待用戶輸入(按 Enter 鍵)后才會繼續執行并關閉瀏覽器。這通常用于調試時暫停程序,方便查看結果。

    Selenium WebDriver 更多操作解釋

  • 元素交互方法

    • click():模擬鼠標點擊元素,常用于按鈕、鏈接等可點擊元素。
    • send_keys(text):模擬鍵盤輸入文本到輸入框等元素中。
    • clear():清空輸入框中的內容。
    • submit():提交表單,通常用于表單中的提交按鈕。
  • 瀏覽器導航方法

    • back():模擬瀏覽器的后退按鈕,返回上一頁。
    • forward():模擬瀏覽器的前進按鈕,前進到下一頁。
    • refresh():刷新當前頁面。
    • get(url):打開指定 URL 的網頁。
    • current_url:獲取當前頁面的 URL。
  • 瀏覽器控制方法

    • close():關閉當前瀏覽器窗口。
    • quit():退出整個瀏覽器進程,關閉所有窗口。
    • maximize_window():最大化瀏覽器窗口。
    • set_window_size(width, height):設置瀏覽器窗口大小。
  • 元素定位方法

    • find_element(By.ID, value):通過元素 ID 定位。
    • find_element(By.NAME, value):通過元素 name 屬性定位。
    • find_element(By.CSS_SELECTOR, value):通過 CSS 選擇器定位。
    • find_element(By.XPATH, value):通過 XPath 表達式定位。
    • find_elements():返回所有匹配的元素列表。
import requestsurl = 'https://graph.baidu.com/pcpage/index?tpl_from=pc'
response = requests.get(url)if response.status_code == 200:# 獲取網頁的HTML內容html_content = response.textprint(html_content)
else:print(f"請求失敗,狀態碼:{response.status_code}")

二.批量獲取 Excel 相關圖書信息?

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
def get_info(driver):time.sleep(5)eles_p = driver.find_elements(By.CLASS_NAME, 'book_item')print(f"找到 {len(eles_p)} 個圖書項")  # 調試輸出for ele_p in eles_p:ele_p.click()handles = driver.window_handlesdriver.switch_to.window(handles[-1])time.sleep(5)name = driver.find_element(By.CLASS_NAME, 'book-name').textprice = driver.find_element(By.CLASS_NAME, 'price').textauthor = driver.find_element(By.CLASS_NAME, 'book-author').textfile.write(f'圖書名:{name}\t價格:{price}\t作者名:{author}\n')print(f"已保存:{name}")  # 調試輸出driver.close()driver.switch_to.window(handles[-2])  # 回到上一個標簽頁(索引-2)
file = open('excel圖書匯總.txt', 'w', encoding='utf-8')
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=chrome_options)
driver.get('https://www.ptpress.com.cn/')
elements = driver.find_elements(By.TAG_NAME, "input")
elements[0].send_keys("excel" + Keys.RETURN)
handles = driver.window_handles
driver.switch_to.window(handles[1])
driver.find_element(By.ID, "booksMore").click()
handles = driver.window_handles
driver.switch_to.window(handles[-1])
get_info(driver)
page_num = 1  # 記錄當前頁碼
while True:try:# 嘗試查找下一頁按鈕next_button = driver.find_element(By.CLASS_NAME, 'ivu-page-next')# 檢查按鈕是否禁用(不同網站禁用狀態的class可能不同,需要根據實際情況調整)if 'ivu-page-disabled' in next_button.get_attribute('class'):print(f"已到達最后一頁(第{page_num}頁),停止爬取")breaknext_button.click()page_num += 1print(f"已翻到第{page_num}頁")time.sleep(3)  # 等待頁面加載get_info(driver)except Exception as e:print(f"爬取過程中出錯:{e}")print(f"最后成功爬取的是第{page_num}頁")break
file.close()
driver.quit()  # 關閉瀏覽器

代碼講解:批量獲取 Excel 相關圖書信息

這段代碼使用 Selenium 自動化瀏覽器操作,從人民郵電出版社網站批量獲取 Excel 相關圖書的信息,并保存到文本文件中。下面是對代碼的詳細解釋:

整體流程分析

這個程序主要分為以下幾個部分:

  1. 瀏覽器初始化與搜索
  2. 信息提取函數
  3. 翻頁與循環處理
  4. 異常處理與資源釋放

代碼詳細解釋

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
  • 導入必要的庫:Selenium 相關模塊用于控制瀏覽器,time 模塊用于添加等待時間。
def get_info(driver):time.sleep(5)eles_p = driver.find_elements(By.CLASS_NAME, 'book_item')print(f"找到 {len(eles_p)} 個圖書項")  # 調試輸出for ele_p in eles_p:ele_p.click()handles = driver.window_handlesdriver.switch_to.window(handles[-1])time.sleep(5)name = driver.find_element(By.CLASS_NAME, 'book-name').textprice = driver.find_element(By.CLASS_NAME, 'price').textauthor = driver.find_element(By.CLASS_NAME, 'book-author').textfile.write(f'圖書名:{name}\t價格:{price}\t作者名:{author}\n')print(f"已保存:{name}")  # 調試輸出driver.close()driver.switch_to.window(handles[-2])  # 回到上一個標簽頁(索引-2)
  • get_info 函數:負責從當前頁面提取圖書信息
    • 等待 5 秒讓頁面加載完成
    • 查找所有圖書項元素
    • 遍歷每個圖書項,點擊打開詳情頁
    • 切換到新打開的標簽頁
    • 提取書名、價格和作者信息并寫入文件
    • 關閉當前標簽頁,回到圖書列表頁
file = open('excel圖書匯總.txt', 'w', encoding='utf-8')
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=chrome_options)
driver.get('https://www.ptpress.com.cn/')
  • 打開文件用于保存數據
  • 配置并啟動 Edge 瀏覽器
  • 訪問人民郵電出版社網站
elements = driver.find_elements(By.TAG_NAME, "input")
elements[0].send_keys("excel" + Keys.RETURN)
handles = driver.window_handles
driver.switch_to.window(handles[1])
driver.find_element(By.ID, "booksMore").click()
handles = driver.window_handles
driver.switch_to.window(handles[-1])
get_info(driver)
  • 找到搜索框并輸入 "excel" 進行搜索
  • 切換到搜索結果頁面
  • 點擊 "更多圖書" 按鈕
  • 切換到新打開的圖書列表頁面
  • 調用 get_info 函數提取第一頁的圖書信息
page_num = 1  # 記錄當前頁碼
while True:try:# 嘗試查找下一頁按鈕next_button = driver.find_element(By.CLASS_NAME, 'ivu-page-next')# 檢查按鈕是否禁用if 'ivu-page-disabled' in next_button.get_attribute('class'):print(f"已到達最后一頁(第{page_num}頁),停止爬取")breaknext_button.click()page_num += 1print(f"已翻到第{page_num}頁")time.sleep(3)  # 等待頁面加載get_info(driver)except Exception as e:print(f"爬取過程中出錯:{e}")print(f"最后成功爬取的是第{page_num}頁")break
  • 實現自動翻頁功能:
    • 查找下一頁按鈕
    • 檢查按鈕是否被禁用(表示已到最后一頁)
    • 點擊下一頁按鈕并更新頁碼
    • 等待頁面加載后繼續提取信息
    • 使用 try-except 捕獲異常,確保程序健壯性
file.close()
driver.quit()  # 關閉瀏覽器
  • 關閉文件和瀏覽器,釋放資源

代碼優化建議

  1. 等待機制改進

    • 使用顯式等待替代固定的 time.sleep (),提高代碼穩定性
    • 示例:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待圖書項元素加載完成
eles_p = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'book_item'))
)

異常處理增強

  • 在 get_info 函數中添加元素查找的異常處理
  • 示例:
try:name = driver.find_element(By.CLASS_NAME, 'book-name').text
except:name = "未找到書名"

數據存儲優化

  • 考慮將數據保存為 CSV 或 Excel 格式,便于后續處理
  • 示例:
import csvwith open('books.csv', 'w', newline='', encoding='utf-8') as csvfile:writer = csv.writer(csvfile)writer.writerow(['圖書名', '價格', '作者名'])writer.writerow([name, price, author])

增加日志記錄

  • 使用 logging 模塊替代簡單的 print 語句,便于調試和追蹤
  • 示例:
import logginglogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info(f"找到 {len(eles_p)} 個圖書項")

這個程序通過自動化瀏覽器操作,成功實現了批量獲取圖書信息的功能。通過合理的優化,可以進一步提高代碼的穩定性和可維護性。

?

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

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

相關文章

Vue中的refs字段使用記錄

這段代碼是 Vue.js 中結合 Element UI 等 UI 庫的典型表單驗證寫法,具體含義如下:代碼拆解 this.$refs.fromData.validate((valid) > {// 驗證后的回調邏輯 })this.$refs.fromData $refs 是 Vue 提供的特殊屬性,用于訪問模板中通過 ref&qu…

多方案對比分析:后端數據加密策略及實踐

多方案對比分析:后端數據加密策略及實踐 隨著互聯網業務對用戶隱私和數據安全的要求不斷提升,后端系統中對敏感數據的加密保護已成為必備需求。從對稱加密、非對稱加密到數據庫透明加密、應用層字段加密,各種方案各有特點。本文將以方案對比分…

《Java語言程序設計》1.4 復習題

1.4.1 什么是操作系統?列出一些流行的操作系統?操作系統(Operating System)是運行在計算機上的最重要的程序。操作系統管理和控制計算機的活動。通用計算機的流行操作系統有Microsoft Windows、Mac OS以及Linux。如果沒有在計算機上安裝和運行操作系統,像Web瀏覽器…

OpenCV圖像自動縮放(Autoscaling)函數autoscaling()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 該函數用于對輸入圖像進行自動縮放(Autoscaling),即根據輸入圖像的像素值范圍將其線性映射到一個新的范圍內&am…

多線程的認識

競爭與協作在單核 CPU 系統里,為了實現多個程序同時運行的假象,操作系統通常以時間片調度的方式,讓每個進程執行每次執行一個時間片,時間片用完了,就切換下一個進程運行,由于這個時間片的時間很短&#xff…

SpringCloud相關總結

SpringCloud相關總結 1. 權威文檔推薦: 官方文檔:https://spring.io/cloud 玩的時候,注意SpringBoot與SpringCloud的版本兼容問題,推薦參考:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%…

NW983NW988美光固態閃存NW991NW992

美光NW系列固態閃存深度解析:技術、對比與應用指南一、技術根基與架構創新美光NW系列固態閃存的技術突破源于其先進的G9 NAND架構,該架構采用5納米制程工藝和多層3D堆疊技術,在單位面積內實現了高達256層的存儲單元堆疊,存儲密度較…

pytest + requests 接口自動化測試框架

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 使用 pytest + req

Android性能優化之網絡優化

一、網絡性能瓶頸深度解析 1. 網絡請求全鏈路耗時分析 #mermaid-svg-3cXlC9wERu99EHQH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3cXlC9wERu99EHQH .error-icon{fill:#552222;}#mermaid-svg-3cXlC9wERu99EHQH …

實現庫存顯示和狀態按鈕的Question

首先實現顯示圖書庫存 1 if條件標簽里的test""要和實體類的屬性名保持一致 否則會報找不到get方法的錯誤org.apache.ibatis.reflection.ReflectionException: There is no getter for property named stock in class2后端已經把bookStock傳到前端了,但是顯…

vue + Cesium 實現 3D 地圖水面效果詳解

一、引言Cesium 是一個強大的開源 JavaScript 庫,用于創建基于 Web 的 3D 地理信息系統 (GIS) 應用程序。它提供了豐富的 API,可以實現各種復雜的地理可視化效果,包括地形渲染、建筑物建模、矢量數據顯示等。本文將詳細介紹如何使用 Cesium 實…

統信 UOS 運行 Windows 應用新利器!彩虹虛擬化軟件 V3.2 全新上線,限時30天免費體驗

原文鏈接:統信 UOS 運行 Windows 應用新利器!彩虹虛擬化軟件 V3.2 全新上線,限時30天免費體驗 在國產操作系統逐漸普及的今天,許多用戶仍面臨一個實際問題——一些辦公軟件或行業工具仍然僅支持 Windows 系統。對于已全面部署統信…

Vue中使用vue-3d-model實現加載3D模型預覽展示

場景 要實現在頁面中簡單快速的加載3D模型用于產品展示。 實現效果如下: 注: 博客: 霸道流氓氣質-CSDN博客 實現 3D模型技術方案對比 這里用于快速展示簡單3d模型。 3D模型文件下載 可下載的網站較多,比如: Sk…

GaussDB join 連接的用法

1 join 連接的作用join 連接用于把來自兩個或多個表的行結合起來,基于這些表之間的共同字段。 最常見的 join 類型:inner join(簡單的 join)。 inner join 從多個表中返回滿足 join條件的所有行。2 示例數據讓我們看看選自 "…

GitHub開源輕量級語音模型 Vui:重塑邊緣智能語音交互的未來

前言 今天將深入解析一款顛覆性開源語音模型——Vui(來自 Fluxions-AI 項目)。它正以“輕量化”為矛,刺破傳統語音模型高耗能的壁壘,讓智能語音無處不在。 GitHub:https://github.com/fluxions-ai/vuihuggingface&am…

用aws下載NOAA的MB文件

安裝aws下載某航次MB文件 安裝aws curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install下載對應航次數據 aws s3 cp s3://noaa-wcsd-pds/data/raw/Atlantis/AT26-09 /home/xxx/…

Kubernetes (k8s)、Rancher 和 Podman 的異同點分析

1. Kubernetes (k8s) 類型:容器編排系統。功能: 自動化部署、擴展和管理容器化應用。支持跨多臺主機的容器編排。提供服務發現、負載均衡、滾動更新等功能。 架構:基于 Master-Node 架構,Master 負責調度和管理,Node 運…

71 模塊編程之新增一個字符設備

前言這個 主要是 最開始的時候了解驅動的時候, 看到的一系列的 case, 這里 來大致剖析一下 相關的道理這些模塊 是怎么和內核交互的, 內核的這些業務是怎么實現的 這里主要是一個模塊來注冊了一個字符設備 然后這個字符設備 可讀可寫, 基于的是分配的一段空間 測試用例測試模塊…

小眾創新方向!多傳感器融合與視覺慣性導航,定位精度和效率大幅提升!

多傳感器融合與視覺慣性導航技術(VINS)取得了顯著進展。近期,研究人員通過優化視覺與慣性傳感器數據的融合算法、引入深度學習技術以及改進系統架構,顯著提升了VINS在復雜環境下的定位精度和魯棒性。基于深度學習的特征提取方法能…

超簡單linux上部署Apache

1.Apache是什么?Apache 是世界上最流行的 ??開源Web服務器軟件??,由 Apache 軟件基金會維護。??主要功能??:接收客戶端(如瀏覽器)的HTTP請求,返回網頁、圖片等靜態/動態資源。??特點??&#xf…