用Python實現自動化的Web測試(Selenium)

Python作為數據科學和自動化領域的主流語言,在網絡爬蟲開發中占據著重要地位。本文將全面介紹Python爬蟲的技術棧、實現方法和最佳實踐。

爬蟲技術概述

網絡爬蟲(Web Crawler)是一種按照特定規則自動抓取互聯網信息的程序。它可以自動化地瀏覽網絡、下載內容并提取有價值的數據,廣泛應用于搜索引擎、數據分析和商業智能等領域。

核心庫與技術棧

1. 基礎請求庫

  • Requests:簡潔易用的HTTP庫,適合大多數靜態頁面抓取

  • urllib:Python標準庫中的HTTP工具集

2. 解析庫

  • BeautifulSoup:HTML/XML解析庫,適合初學者

  • lxml:高性能解析庫,支持XPath

  • PyQuery:jQuery風格的解析庫

3. 高級框架

  • Scrapy:完整的爬蟲框架,適合大型項目

  • Selenium:瀏覽器自動化工具,處理JavaScript渲染

  • Playwright:新興的瀏覽器自動化庫,支持多瀏覽器

4. 異步處理

  • aiohttp:異步HTTP客戶端/服務器框架

  • Asyncio:Python異步IO框架

實戰示例

示例1:基礎靜態頁面抓取

python

import requests
from bs4 import BeautifulSoup
import pandas as pddef scrape_basic_website(url):"""抓取靜態網站基本信息"""try:# 設置請求頭模擬瀏覽器headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}# 發送GET請求response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()  # 檢查請求是否成功# 解析HTML內容soup = BeautifulSoup(response.content, 'lxml')# 提取數據data = {'title': soup.title.string if soup.title else '','headings': [h.get_text().strip() for h in soup.find_all(['h1', 'h2', 'h3'])],'links': [a.get('href') for a in soup.find_all('a') if a.get('href')],'text_content': soup.get_text()[0:500] + '...'  # 限制文本長度}return dataexcept requests.exceptions.RequestException as e:print(f"請求錯誤: {e}")return None# 使用示例
if __name__ == "__main__":result = scrape_basic_website('https://httpbin.org/html')if result:print("網頁標題:", result['title'])print("前5個鏈接:", result['links'][:5])

示例2:處理動態內容(使用Selenium)

python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Optionsdef scrape_dynamic_content(url):"""抓取需要JavaScript渲染的動態內容"""# 配置瀏覽器選項chrome_options = Options()chrome_options.add_argument('--headless')  # 無頭模式chrome_options.add_argument('--no-sandbox')chrome_options.add_argument('--disable-dev-shm-usage')driver = webdriver.Chrome(options=chrome_options)try:driver.get(url)# 等待特定元素加載完成wait = WebDriverWait(driver, 10)element = wait.until(EC.presence_of_element_located((By.TAG_NAME, "main")))# 提取動態生成的內容dynamic_content = driver.find_element(By.TAG_NAME, "main").text# 截圖功能(用于調試)driver.save_screenshot('page_screenshot.png')return dynamic_content[:1000]  # 返回部分內容finally:driver.quit()# 使用示例
# content = scrape_dynamic_content('https://example.com')
# print(content)

示例3:使用Scrapy框架

創建Scrapy項目:

bash

scrapy startproject myproject
cd myproject

定義爬蟲(spiders/example_spider.py):

python

import scrapy
from myproject.items import WebsiteItemclass ExampleSpider(scrapy.Spider):name = "example"allowed_domains = ["example.com"]start_urls = ["https://example.com"]custom_settings = {'CONCURRENT_REQUESTS': 1,'DOWNLOAD_DELAY': 2,  # 遵守爬蟲禮儀'USER_AGENT': 'MyWebCrawler/1.0 (+https://mywebsite.com)'}def parse(self, response):# 提取數據item = WebsiteItem()item['url'] = response.urlitem['title'] = response.css('title::text').get()item['content'] = response.css('p::text').getall()yield item# 跟蹤鏈接(可選)for next_page in response.css('a::attr(href)').getall():if next_page is not None:yield response.follow(next_page, callback=self.parse)

高級技巧與最佳實踐

1. 處理反爬機制

python

import random
import timedef advanced_scraper(url):"""高級爬蟲,應對反爬措施"""headers_list = [{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'},{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'},{'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'}]# 使用代理(可選)proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',}try:# 隨機選擇請求頭headers = random.choice(headers_list)response = requests.get(url, headers=headers, timeout=15,# proxies=proxies  # 如果需要使用代理取消注釋)# 隨機延遲,避免請求過于頻繁time.sleep(random.uniform(1, 3))return responseexcept Exception as e:print(f"高級抓取錯誤: {e}")return None

2. 數據存儲

python

import json
import csv
import sqlite3def save_data(data, format='json', filename='data'):"""多種格式保存數據"""if format == 'json':with open(f'{filename}.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=2)elif format == 'csv':if data and isinstance(data, list) and len(data) > 0:keys = data[0].keys()with open(f'{filename}.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.DictWriter(f, fieldnames=keys)writer.writeheader()writer.writerows(data)elif format == 'sqlite':conn = sqlite3.connect(f'{filename}.db')c = conn.cursor()# 創建表(根據實際數據結構調整)c.execute('''CREATE TABLE IF NOT EXISTS scraped_data(id INTEGER PRIMARY KEY, title TEXT, content TEXT)''')# 插入數據(根據實際數據結構調整)for item in data:c.execute("INSERT INTO scraped_data (title, content) VALUES (?, ?)",(item.get('title'), str(item.get('content'))))conn.commit()conn.close()

3. 異步爬蟲提高效率

python

import aiohttp
import asyncioasync def async_scraper(urls):"""異步爬蟲,提高抓取效率"""async with aiohttp.ClientSession() as session:tasks = []for url in urls:task = asyncio.ensure_future(fetch(session, url))tasks.append(task)results = await asyncio.gather(*tasks)return resultsasync def fetch(session, url):"""異步獲取單個URL"""try:async with session.get(url, timeout=aiohttp.ClientTimeout(total=10)) as response:return await response.text()except Exception as e:print(f"Error fetching {url}: {e}")return None# 使用示例
# urls = ['https://example.com/page1', 'https://example.com/page2']
# results = asyncio.run(async_scraper(urls))

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

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

相關文章

「Memene 摸魚日報 2025.9.17」上海張江人工智能創新小鎮正式啟動,華為 DCP 技術獲網絡頂會獎項

theme: condensed-night-purple 以下內容包括「人工智能生成內容」 上海張江人工智能創新小鎮正式啟動,華為 DCP 技術獲網絡頂會獎項 👏在昨天(2025.9.16),AI領域有這些內容可能值得你關注: 上海張江人工智…

Vehiclehal的VehicleService.cpp

VehicleService.cpp 是 Android Automotive OS 中負責車輛相關功能的核心服務組件,主要處理車身信息獲取及狀態設置接口,通過 HIDL(Hardware Interface Definition Language)接口與系統框架層交互。 ?12核心功能VehicleService.c…

《LINUX系統編程》筆記p11

公共資源也稱為共享資源,是指可以被多個并發進程或線程共同訪問(讀取或寫入)的系統資源。臨界資源是公共資源的一個子集。特指那些一次僅允許一個進程或線程訪問的公共資源。如果一個進程正在使用它,其他試圖訪問該資源的進程必須…

spring-kafka消費異常處理

默認的消費異常處理 默認情況下,如果程序沒有顯式做任何的異常處理,spring-kafka會提供一個默認的DefaultErrorHandler, 它會使用FixedBackOff做重試,會不間斷的連續重試最多9次,也就是說一個消息最多會被消費10次。如果重試次數耗…

leecode73 矩陣置零

我的思路 這個題目不難,就是一句話,遍歷這個矩陣的時候,當遇到0的時候就把該行該列改為0,同時為了不影響后續的遍歷,我們可以將這個遍歷和修改分為兩個數組。使用mn的輔助空間 class Solution {public void setZeroe…

Spring Boot 與前端文件上傳跨域問題:Multipart、CORS 與網關配置

前言在前后端分離架構下,文件上傳是一個常見功能。但在 Spring Boot 項目中,我們經常會遇到前端調用接口上傳文件時出現 跨域問題,表現為:瀏覽器控制臺報錯:Access-Control-Allow-Origin 缺失或不匹配。使用 FormData …

快速解決云服務器的數據庫PhpMyAdmin登錄問題

打開PhpMyAdmin數據庫管理器登錄頁面賬號密碼就是你的用戶名(如YiXun)和密碼注意:root賬戶的密碼,點擊下面的“root密碼”即能看到或修改PhpMyAdmin無法打開如果打不開:在數據庫,點擊PHPMyAdmin&#xff0c…

vite+vue3中使用FFmpeg@0.12.15實現視頻編輯功能,不依賴SharedArrayBuffer!!!

FFmpeg0.12.15完全不依賴SharedArrayBuffer!!!強烈推薦使用 本文章主要是在vitevue3項目中使用FFmpeg,只展示了如何在項目中引入和基礎的使用 更多詳細參數可參照 ffmpeg官網https://ffmpeg.org/ 一、安裝FFmpeg 可通過npm直接安裝 npm install ffmpeg/core0.12.10…

構網型5MW中壓儲能變流升壓一體機技術方案

1 構網型儲能背景概述1.1 新型電力系統亟需構網支撐眾所周知,新型電力系統具有兩高特征:高比例新能源大規模并網、高比例電力電子大范圍接入。近年來風光裝機占比越來越高,而傳統火電裝機占比越來越低,并在2023年首次降至50%以下…

SRE 系列(七)| 從技術架構到團隊組織

目錄SRE落地與組織架構實踐技術架構與組織架構的匹配技術架構示例運維職責分工技術保障體系SRE 多角色團隊總結SRE落地與組織架構實踐 在落地 SRE 時,很多團隊最關心的問題之一就是組織架構:我們究竟需要怎樣的團隊形態,才能支撐微服務和分…

香港期權市場的主要參與者有哪些?

本文主要介紹香港期權市場的主要參與者有哪些?香港期權市場作為全球重要的金融衍生品市場,其參與者結構呈現多元化、專業化的特征,主要涵蓋以下核心群體。香港期權市場的主要參與者有哪些?1. 機構投資者(主導力量&…

搜維爾科技:全身可穿戴Teslasuit動捕服的功能,自立式FES裝置

功能性電刺激 (FES) 設備廣泛應用于康復和醫療實踐。其底層技術利用低能量電脈沖,在中風、脊髓損傷、多發性硬化癥、腦癱等各種疾病患者中人工產生身體運動。一般來說,FES系統可以分為三類:開環、有限狀態控制和閉環方法。這三種方法描述了 F…

【深度學習新浪潮】MoE是什么技術?

混合專家模型(Mixture of Experts,MoE)是大模型時代提升計算效率與模型能力的核心技術之一。其核心思想是將復雜任務分解為多個子任務,通過動態路由機制激活特定專家網絡處理輸入數據,從而在保持模型容量的同時大幅降低計算成本。以下是技術細節與實際應用的深度解析: 一…

Java進階教程,全面剖析Java多線程編程,實現Callable接口實現多線程,筆記05

Java進階教程,全面剖析Java多線程編程,實現Callable接口實現多線程,筆記05 參考資料 多線程&JUC-05-多線程的第三種實現方式一、實現Callable接口實現多線程 二、三種方式對比 優點缺點繼承Thread類編程比較簡單,可以直接使…

軌道交通絕緣監測—軌道交通安全的隱形防線

軌道交通絕緣監測作為保障行車安全的核心環節,正面臨多重技術與環境挑戰。復雜運營環境是首要痛點,隧道內高濕度(月均濕度達95%)會增大鋼軌表面電導率,霧氣中的鹽分更會加速扣件絕緣性能下降,導致過渡電阻驟…

tar-符號連接(軟連接)

1.符號連接是什么符號鏈接(symbolic link,也叫軟鏈接)本質上是一個 指向路徑的特殊文件。例如:ln -s /etc/passwd passwd_link這會創建一個叫 passwd_link 的文件,但它本身不存放 /etc/passwd 的內容,而是存…

ffmpeg切割音頻

ffmpeg切割音頻 我希望對指定音頻切割,按照開始時間,結束時間,切割成新文件,自動保存,非常好用 step1: from pydub import AudioSegment import os# 配置FFmpeg路徑(確保路徑正確) ffmpeg_path …

Python 批量處理:Markdown 與 HTML 格式相互轉換

文章目錄引言與同類工具的優勢對比Python 將 Markdown 轉換為 HTMLPython 將 HTML 轉換為 Markdown批量轉換與自動化處理引言 在多平臺內容分發與管理的場景中,文檔格式轉換已成為內容生態系統中的關鍵環節。Markdown 作為輕量級標記語言,以其語法簡潔、…

御控物聯網遠程控制水泵啟停智能自控解決方案

在農業灌溉、城市排水、工業供水等場景中,水泵作為核心設備,長期面臨以下難題:人工依賴度高:需24小時值守,暴雨或干旱時響應滯后; 能耗浪費嚴重:空轉、過載運行導致電費居高不下; …

RedisI/O多路復用:單線程網絡模型epoll工作流程

epoll1. 在內核創建eventpoll結構體,返回句柄epfd(唯一標識)eventpoll包含存放被監聽的fd的紅黑樹,和存放已就緒的fd的鏈表2. 將要監聽的fd加入到epoll紅黑樹中,并設置callback回調函數callback觸發時,就將…