網絡爬蟲的相關知識和操作

介紹

爬蟲的定義

爬蟲(Web Crawler)是一種自動化程序,用于從互聯網上抓取、提取和存儲網頁數據。其核心功能是模擬人類瀏覽行為,訪問目標網站并解析頁面內容,最終將結構化數據保存到本地或數據庫。

爬蟲的工作原理

  1. 發送請求:爬蟲通過HTTP/HTTPS協議向目標網站發送請求,獲取網頁的HTML、JSON等原始數據。
  2. 解析內容:使用解析工具(如正則表達式、XPath、BeautifulSoup等)提取所需數據,過濾無關信息。
  3. 存儲數據:將清洗后的數據保存為文本、CSV、數據庫(如MySQL、MongoDB)或其他結構化格式。
  4. 自動化管理:通過調度策略(如時間間隔、優先級隊列)控制爬取頻率,避免被封禁。

爬蟲的應用場景

  • 搜索引擎:Google、百度等搜索引擎依賴爬蟲建立網頁索引庫。
  • 數據分析:抓取電商平臺價格、社交媒體評論等數據用于市場分析。
  • 輿情監控:實時采集新聞、論壇內容以監測公眾情緒。
  • 學術研究:批量獲取公開論文、專利數據以支持統計分析。

常見技術工具

  • 編程語言:Python(Scrapy、Requests庫)、JavaScript(Puppeteer)。
  • 解析庫:BeautifulSoup、lxml、PyQuery。
  • 反爬應對:Selenium模擬瀏覽器行為、代理IP池(如Scrapy-ProxyPool)。

法律與倫理風險

  • 合規性:需遵守目標網站的robots.txt協議,避免爬取敏感或個人隱私數據。
  • 反爬措施:頻繁請求可能導致IP封禁,需合理設置延遲(如time.sleep)。

示例代碼(Python):

import requests
from bs4 import BeautifulSoupurl = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('h1').text
print(title)

requests庫簡介

requests庫是Python中用于發送HTTP請求的第三方庫,簡化了與Web服務的交互過程。它支持GET、POST等多種請求方式,并自動處理URL編碼、會話保持等細節。

獲取網頁源代碼的方法

使用requests的get()方法發送請求,通過text屬性獲取響應內容:

import requests
response = requests.get('https://example.com')
html_content = response.text

關鍵參數說明

  • headers: 可模擬瀏覽器請求頭,避免被反爬
  • timeout: 設置請求超時時間
  • proxies: 配置代理IP
  • verify: 禁用SSL驗證(僅測試環境使用)

網頁解析配合

通常結合BeautifulSoup或lxml進行內容解析:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
title = soup.find('title').text

常見問題處理

  • 亂碼問題:通過response.encoding = 'utf-8'顯式設置編碼
  • JSON響應:直接使用response.json()解析API返回
  • 會話維持:創建Session()對象保持cookies

性能優化建議

  • 復用TCP連接:啟用Session對象
  • 流式下載:對大文件使用stream=True參數
  • 異步請求:考慮aiohttp庫處理高并發場景

反爬應對策略

  • 隨機User-Agent輪換
  • 設置請求延遲
  • 使用CAPTCHA識別服務
  • 處理JavaScript渲染頁面時可配合Selenium

爬蟲中獲取網頁資源的方法

使用 requests 庫

requests 是一個簡單易用的 HTTP 庫,適合大多數網頁抓取任務。安裝 requests 庫可以通過 pip 命令完成:

pip install requests

獲取網頁內容的示例代碼:

import requestsurl = 'https://example.com'
response = requests.get(url)
html_content = response.text

處理可能出現的異常:

try:response = requests.get(url, timeout=5)response.raise_for_status()html_content = response.text
except requests.exceptions.RequestException as e:print(f"Error fetching the URL: {e}")

使用 urllib 庫

urllib 是 Python 的標準庫,無需額外安裝。適合簡單的網頁抓取任務。示例代碼:

from urllib.request import urlopenurl = 'https://example.com'
response = urlopen(url)
html_content = response.read().decode('utf-8')

處理動態加載內容

對于通過 JavaScript 動態加載內容的網頁,可以使用 Selenium 或 Playwright 等工具。

Selenium 示例:

from selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://example.com')
html_content = driver.page_source
driver.quit()

Playwright 示例:

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto('https://example.com')html_content = page.content()browser.close()

處理 AJAX 請求

直接分析網頁的 AJAX 請求,使用 requests 庫模擬請求獲取數據。示例代碼:

import requestsajax_url = 'https://example.com/api/data'
headers = {'X-Requested-With': 'XMLHttpRequest'}
response = requests.get(ajax_url, headers=headers)
data = response.json()

使用 Scrapy 框架

Scrapy 是一個強大的爬蟲框架,適合大規模數據抓取。安裝 Scrapy:

pip install scrapy

創建 Scrapy 項目的示例代碼:

import scrapyclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['https://example.com']def parse(self, response):yield {'title': response.css('title::text').get(),'content': response.text}

處理反爬機制

應對常見反爬機制的方法包括設置 User-Agent、使用代理、限制請求頻率等。

設置 User-Agent 的示例:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)

使用代理的示例:

proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',
}
response = requests.get(url, proxies=proxies)

存儲獲取的資源

將獲取的網頁內容保存到文件或數據庫中。保存到文件的示例:

with open('page.html', 'w', encoding='utf-8') as f:f.write(html_content)

存儲到數據庫的示例(使用 SQLite):

import sqlite3conn = sqlite3.connect('pages.db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS pages (url TEXT, content TEXT)')
cursor.execute('INSERT INTO pages VALUES (?, ?)', (url, html_content))
conn.commit()
conn.close()

爬蟲中提交信息到網頁的方法

使用 requests 庫提交表單數據


通過 requests.post() 方法可以模擬表單提交。需要構建 datajson 參數,包含表單字段和值。
示例代碼:

import requestsurl = "https://example.com/login"
data = {"username": "user", "password": "pass"}
response = requests.post(url, data=data)
print(response.text)

處理登錄后的會話(Cookies)


使用 requests.Session() 保持會話狀態,自動處理 Cookies。
示例代碼:

session = requests.Session()
login_data = {"username": "user", "password": "pass"}
session.post("https://example.com/login", data=login_data)
# 后續請求會自動攜帶 Cookies
response = session.get("https://example.com/dashboard")

提交 JSON 數據
若網頁接口接受 JSON 格式,可通過 json 參數提交。
示例代碼:

import requestsurl = "https://example.com/api"
json_data = {"key": "value"}
response = requests.post(url, json=json_data)

處理文件上傳


通過 files 參數上傳文件,需指定文件對象和 MIME 類型。
示例代碼:

files = {"file": ("filename.txt", open("filename.txt", "rb"), "text/plain")}
response = requests.post("https://example.com/upload", files=files)

處理 AJAX 請求


部分網頁通過 AJAX 動態加載數據,需分析網絡請求(如使用瀏覽器開發者工具),模擬發送相應的請求頭和數據。
示例代碼:

headers = {"X-Requested-With": "XMLHttpRequest","User-Agent": "Mozilla/5.0"
}
data = {"param": "value"}
response = requests.post("https://example.com/ajax", headers=headers, data=data)

注意事項

  • 檢查目標網站的 robots.txt 文件,遵守爬蟲規則。
  • 添加合理的請求頭(如 User-Agent)以避免被攔截。
  • 高頻請求可能導致 IP 被封,建議設置延遲或使用代理。

會話管理基礎

在網絡爬蟲中,會話(Session)用于維持與服務器的交互狀態,模擬用戶行為。HTTP協議本身是無狀態的,會話機制通過Cookies或Token實現狀態保持。

import requestssession = requests.Session()
response = session.get('https://example.com/login')

Cookies處理

服務器通過Set-Cookie頭部傳遞會話標識,爬蟲需保存并自動攜帶Cookies:

# 自動處理Cookies(requests.Session默認行為)
session.get('https://example.com/dashboard')  # 自動攜帶登錄后的Cookies# 手動操作Cookies
cookies = {'session_id': '123abc'}
session.cookies.update(cookies)

請求頭模擬

維持會話需要模擬瀏覽器頭部信息,避免被識別為爬蟲:

headers = {'User-Agent': 'Mozilla/5.0','Accept-Language': 'en-US,en;q=0.9'
}
session.headers.update(headers)

會話超時控制

設置連接和讀取超時防止長時間等待:

session.get('https://example.com', timeout=(3.05, 27))

持久化會話

將會話數據保存供后續使用:

import pickle# 保存會話
with open('session.pkl', 'wb') as f:pickle.dump(session.cookies, f)# 加載會話
with open('session.pkl', 'rb') as f:session.cookies.update(pickle.load(f))

代理與會話結合

通過代理服務器維持會話:

proxies = {'http': 'http://10.10.1.10:3128'}
session.proxies.update(proxies)

驗證碼處理

遇到驗證碼時會話可能需要特殊處理:

# 示例:手動輸入驗證碼
captcha_url = 'https://example.com/captcha.jpg'
response = session.get(captcha_url)
with open('captcha.jpg', 'wb') as f:f.write(response.content)
captcha = input('輸入驗證碼:')
session.post('https://example.com/login', data={'captcha': captcha})

會話劫持防護

部分網站會檢測會話異常,解決方法:

# 維持Referer頭部
session.headers['Referer'] = 'https://example.com/previous_page'# 禁用HTTP重定向自動處理(某些網站通過重定向檢測)
session.post(url, allow_redirects=False)

代理服務器

代理服務器的作用

代理服務器在爬蟲中主要用于隱藏真實IP、繞過訪問限制、提高請求成功率。常見的應用場景包括:

  • 避免目標網站封禁IP
  • 模擬不同地區用戶訪問
  • 分散請求壓力

代理類型及選擇

1. 免費代理

  • 來源:公開代理網站(如FreeProxyList、ProxyScrape)
  • 優點:無需成本
  • 缺點:穩定性差、速度慢、可能存在安全風險

2. 付費代理

  • 推薦服務商:Luminati、Smartproxy、Oxylabs
  • 優點:高匿性、穩定、支持地理位置定制
  • 缺點:需要預算支持

3. 自建代理池

  • 通過工具(如Scrapy-Redis)管理多個代理IP
  • 結合撥號服務器或云服務動態更換IP

代碼實現示例

Python requests庫使用代理

import requestsproxies = {'http': 'http://username:password@proxy_ip:port','https': 'https://username:password@proxy_ip:port'
}response = requests.get('https://example.com', proxies=proxies)
print(response.text)

Scrapy框架代理配置
settings.py 中添加:

DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
}# 通過中間件動態設置代理
class ProxyMiddleware:def process_request(self, request, spider):request.meta['proxy'] = 'http://proxy_ip:port'

代理IP驗證

定期檢測代理可用性:

def check_proxy(proxy):try:requests.get('https://httpbin.org/ip', proxies={'http': proxy}, timeout=5)return Trueexcept:return False

注意事項

  • 遵守目標網站robots.txt規則
  • 設置合理請求間隔(如DOWNLOAD_DELAY
  • 高匿名代理(Elite Proxy)更適合敏感場景
  • 分布式爬蟲建議結合代理池和User-Agent輪換

selenium庫驅動瀏覽器

安裝Selenium庫

使用pip命令安裝Selenium庫:

pip install selenium

下載瀏覽器驅動

根據使用的瀏覽器下載對應的驅動:

  • Chrome: 下載ChromeDriver
  • Firefox: 下載GeckoDriver
  • Edge: 下載EdgeDriver

將下載的驅動文件放在系統PATH路徑或項目目錄中。

基本使用方法

以下是使用Selenium驅動Chrome瀏覽器的示例代碼:

from selenium import webdriver
from selenium.webdriver.common.by import By# 初始化瀏覽器驅動
driver = webdriver.Chrome()  # 或 Firefox(), Edge()# 打開網頁
driver.get("https://www.example.com")# 查找元素并交互
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Selenium")
search_box.submit()# 關閉瀏覽器
driver.quit()

常用操作

  • 查找元素:使用find_elementfind_elements方法,支持多種定位方式(ID、NAME、XPATH等)。
  • 頁面交互click()點擊元素,send_keys()輸入文本,clear()清空輸入框。
  • 等待機制:顯式等待(WebDriverWait)或隱式等待(implicitly_wait)確保元素加載完成。

高級功能

  • 處理彈窗:使用switch_to.alert方法處理JavaScript彈窗。
  • 執行JavaScriptdriver.execute_script("JavaScript代碼")
  • 截圖driver.save_screenshot("filename.png")保存頁面截圖。

注意事項

  • 確保瀏覽器版本與驅動版本兼容。
  • 使用完畢后調用driver.quit()釋放資源,避免內存泄漏。

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

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

相關文章

【vue-6】Vue3 響應式數據聲明:深入理解 ref()

在 Vue3 的 Composition API 中,ref() 是最基礎也是最常用的響應式數據聲明方式之一。它為開發者提供了一種簡單而強大的方式來管理組件狀態。本文將深入探討 ref() 的工作原理、使用場景以及最佳實踐。 1. 什么是 ref()? ref() 是 Vue3 提供的一個函數&…

HTML常用標簽匯總(精簡版)

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>簡單標記</title> </head><body>&…

【.net core】支持通過屬性名稱索引的泛型包裝類

類/// <summary> /// 支持通過屬性名稱索引的泛型包裝類 /// </summary> public class PropertyIndexer<T> : IEnumerable<T> {private T[] _items;private T _instance;private PropertyInfo[] _properties;private bool _caseSensitive;public Prope…

【機器學習|學習筆記】詳解支持向量機(Support Vector Machine,SVM)為何要引入核函數?為何對缺失數據敏感?

【機器學習|學習筆記】詳解支持向量機(Support Vector Machine,SVM)為何要引入核函數?為何對缺失數據敏感? 【機器學習|學習筆記】詳解支持向量機(Support Vector Machine,SVM)為何要引入核函數?為何對缺失數據敏感? 文章目錄 【機器學習|學習筆記】詳解支持向量機(…

Bicep入門篇

前言 Azure Bicep 是 ARM 模板的最新版本,旨在解決開發人員在將資源部署到 Azure 時遇到的一些問題。它是一款開源工具,實際上是一種領域特定語言 (DSL),它提供了一種聲明式編寫基礎架構的方法,該基礎架構描述了虛擬機、Web 應用和網絡接口等云資源的拓撲結構。它還鼓勵在…

命名實體識別15年研究全景:從規則到機器學習的演進(1991-2006)

本文精讀NRC Canada與NYU聯合發表的經典綜述《A survey of named entity recognition and classification》&#xff0c;解析NERC技術演進脈絡與核心方法論 一、為什么命名實體識別&#xff08;NER&#xff09;如此重要&#xff1f; 命名實體識別&#xff08;Named Entity Rec…

eNSP綜合實驗(DNCP、NAT、TELET、HTTP、DNS)

1搭建實驗拓撲2實驗目的學習掌握eNSP中的命令3實驗步驟3.1配置連接PC和客戶端的交換機(僅以右側為例)[Huawei]vlan batch 10 20 #創建vlan Info: This operation may take a few seconds. Please wait for a moment...done. [Huawei]un in en [Huawei]interface e0/0/2 [Huawei…

無人系統與安防監控中的超低延遲直播技術應用:基于大牛直播SDK的實戰分享

技術背景 在 無人機、機器人 以及 智能安防 等高要求行業&#xff0c;高清視頻的超低延遲傳輸 正在成為影響系統性能與業務決策的重要因素。無論是工業生產線的遠程巡檢、突發事件的應急響應&#xff0c;還是高風險環境下的智能監控與遠程控制&#xff0c;視頻鏈路的傳輸延遲都…

go語言學習之包

概念&#xff1a;在Go 語言中&#xff0c;包由一個或多個保存在同一目錄的源碼文件組成&#xff0c;包名宇目錄名無關&#xff0c;但是通常大家習慣包名和目錄名保持一致&#xff0c;同一目錄的源碼文件必須使用相同的包名。包的用途類似于其他語言的命名空間&#xff0c;可以限…

pytorch學習筆記(五)-- 計算機視覺的遷移學習

系列文章目錄 pytorch學習筆記&#xff08;一&#xff09;-- pytorch深度學習框架基本知識了解 pytorch學習筆記&#xff08;二&#xff09;-- pytorch模型開發步驟詳解 pytorch學習筆記&#xff08;三&#xff09;-- TensorBoard的介紹 pytorch學習筆記&#xff08;四&…

數字IC后端培訓教程之數字后端項目典型項目案例解析

數字IC后端低功耗設計實現案例分享(3個power domain&#xff0c;2個voltage domain) Q1: 電路如下圖&#xff0c;clk是一個很慢的時鐘test_clk&#xff08;屬于DFT的)&#xff0c;DFF1與and 形成一個clock gating check。跑pr 發現&#xff0c;時鐘樹綜合CTS階段&#xff08;C…

2025 Data Whale x PyTorch 安裝學習筆記(Windows 版)

一、Anaconda 的安裝與基本操作 1. 安裝 Anaconda/miniconda 官方鏈接&#xff1a;Anaconda | Individual Edition 根據系統版本選擇合適的安裝包下載并安裝。 2. 檢驗安裝 打開 “開始” 菜單&#xff0c;找到 “Anaconda Prompt”&#xff08;一般在 Anaconda3 文件夾…

mac OS上docker安裝zookeeper

拉取鏡像&#xff1a;$ docker pull zookeeper:3.5.7 3.5.7: Pulling from library/zookeeper 3.5.7: Pulling from library/zookeeper 3.5.7: Pulling from library/zookeeper no matching manifest for linux/arm64/v8 in the manifest list entries報錯&#xff1a;由于時M3…

設備通過4G網卡接入EasyCVR視頻融合平臺,出現無法播放的問題排查和解決

EasyCVR視頻融合平臺作為支持多協議接入、多設備集中管理的綜合性視頻解決方案&#xff0c;可實現各類終端設備的視頻流匯聚與實時播放。近期收到用戶反饋&#xff0c;在EasyCVR平臺接入設備后出現視頻流無法播放的情況。為幫助更多用戶快速排查同類問題&#xff0c;現將具體處…

板凳-------Mysql cookbook學習 (十二--------3)

第二章 抽象數據類型和python類 2.5類定義實例&#xff1a; 學校人事管理系統中的類 import datetimeclass PersonValueError(ValueError):"""自定義異常類"""passclass PersonTypeError(TypeError):"""自定義異常類""…

css flex 布局中 flex-direction為column,如何讓子元素的寬度根據內容自動變化

在 display: flex 且 flex-direction: column 的布局中&#xff0c;默認情況下子元素會占滿容器的寬度。要讓子元素的寬度根據內容自適應&#xff0c;而不是自動拉伸填滿父容器&#xff0c;你可以這樣處理&#xff1a;? 解決方案一&#xff1a;設置子元素 align-self: start 或…

性能優化實踐:Modbus 在高并發場景下的吞吐量提升(二)

四、Modbus 吞吐量提升實戰策略4.1 優化網絡配置選擇合適的網絡硬件是提升 Modbus 通信性能的基礎。在工業現場&#xff0c;應優先選用高性能的工業級交換機和路由器。工業級交換機具備更好的抗干擾能力和穩定性&#xff0c;其背板帶寬和包轉發率更高&#xff0c;能夠滿足高并發…

上傳ipa到appstore的幾種工具

無論是用原生開發也好&#xff0c;使用uniapp或flutter開發也好&#xff0c;最好打包好的APP是需要上架appstore的。而在app store connect上架的時候&#xff0c;需要上傳ipa文件到app store的構建版本上。因此&#xff0c;需要上傳工具。下面分析下幾種上傳工具的優缺點&…

數控調壓BUCK電路 —— 基于TPS56637(TI)

0 前言 本文基于 TI 的 TPS56637 實現一個支持調壓的 BUCK 電路&#xff0c;包含從零開始詳細的 原理解析、原理圖、PCB 及 實測數據 本文屬于《DIY迷你數控電源》系列&#xff0c;本系列我們一起實現一個簡單的迷你數控電源 我是 LNY&#xff0c;一個在對嵌入式的所有都感興…

prometheus UI 和node_exporter節點圖形化Grafana

prometheus UI 和node_exporter節點圖形化Grafana 先簡單的安裝一下 進行時間的同步操作安裝Prometheus之前必須要先安裝ntp時間同步&#xff0c;因為prometheus server對系統時間的準確性要求很高&#xff0c;必須保證本機時間實時同步。# 用crontab進行定時的時間的同步 yum …