Python網絡爬蟲與數據采集實戰——網絡爬蟲的基本流程

網絡爬蟲(Web Scraper)是用于自動化地從互聯網上抓取信息的程序。它廣泛應用于搜索引擎、數據采集、市場分析等領域。本文將詳細探討網絡爬蟲的基本流程,包括URL提取、HTTP請求與響應、數據解析與存儲,以及一個實際的爬蟲示例。文章不僅關注基礎概念,更會深入到實際開發中遇到的技術難點和最新的技術解決方案。

1. URL提取

URL提取是網絡爬蟲中最基礎的步驟之一,爬蟲首先需要從目標網站中提取出需要抓取的URL。這一過程通常可以通過兩種方式進行:靜態URL提取和動態URL提取。

1.1 靜態URL提取

靜態頁面的URL提取主要依靠HTML頁面中<a>標簽的href屬性。例如,我們可以使用正則表達式或HTML解析器從網頁源代碼中提取出所有鏈接。

import re
import requests# 獲取網頁內容
response = requests.get('https://example.com')
html_content = response.text# 使用正則表達式提取URL
urls = re.findall(r'href=["'](https?://[^s'"]+)', html_content)
print(urls)
1.2 動態URL提取

對于一些通過JavaScript動態加載的頁面,直接提取HTML中的URL可能不奏效。在這種情況下,我們可以使用Selenium或Playwright等工具來模擬瀏覽器操作,加載JavaScript動態生成的頁面,并提取其中的URL。

from selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://example.com')
# 等待頁面加載完成
driver.implicitly_wait(10)# 獲取頁面中的所有鏈接
links = driver.find_elements_by_tag_name('a')
urls = [link.get_attribute('href') for link in links]
print(urls)

通過這種方式,我們能夠提取動態生成的URL,但同時也需要考慮性能和效率問題,因為模擬瀏覽器的方式相對較慢。

2. HTTP請求與響應

一旦我們提取到URL,就需要向目標服務器發送HTTP請求并獲取響應數據。通常,我們使用Python的requests庫來發送GET或POST請求,并處理返回的HTTP響應。

2.1 HTTP請求

在發送HTTP請求時,我們可以通過自定義請求頭、代理、超時等參數來模擬瀏覽器行為,以避免被反爬蟲機制檢測到。

import requestsurl = 'https://example.com'
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','Accept-Language': 'en-US,en;q=0.9'
}
response = requests.get(url, headers=headers, timeout=10)
2.2 HTTP響應

一旦請求成功,服務器會返回一個HTTP響應。我們需要解析響應中的數據。requests庫提供了響應對象response,其主要屬性包括status_code(響應狀態碼)、text(響應內容)、json()(如果響應為JSON格式)等。

# 檢查響應狀態碼
if response.status_code == 200:print("Request successful")
else:print(f"Request failed with status code {response.status_code}")# 獲取網頁內容
html_content = response.text

對于一些動態生成的頁面,響應內容可能是JSON格式或JavaScript文件,通常需要進一步解析才能提取出所需的信息。

2.3 異常處理與重試機制

在實際開發中,網絡請求可能因為網絡波動、服務器異常等問題失敗。因此,合理的異常處理和重試機制非常重要。

import timedef fetch_url(url):try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()  # 如果響應碼不是200,會拋出異常return responseexcept requests.RequestException as e:print(f"Error fetching {url}: {e}")time.sleep(5)  # 等待一段時間再嘗試return fetch_url(url)response = fetch_url('https://example.com')
3. 數據解析與存儲

數據解析和存儲是網絡爬蟲中最關鍵的部分。我們需要從HTML頁面中提取有用的信息,通常這些信息以文本、表格或列表等形式呈現。

3.1 數據解析

HTML頁面的解析一般使用專門的庫,比如BeautifulSouplxmlPyQuery等。BeautifulSoup是最常用的庫,它提供了簡單易用的接口來查找和篩選HTML元素。

from bs4 import BeautifulSoupsoup = BeautifulSoup(html_content, 'html.parser')# 提取所有的標題
titles = soup.find_all('h1')
for title in titles:print(title.get_text())# 提取鏈接
links = soup.find_all('a', href=True)
for link in links:print(link['href'])

對于結構化的數據(如表格、列表等),可以通過CSS選擇器或XPath精確定位。

3.2 數據存儲

爬取的數據需要存儲到數據庫或文件中。常見的存儲方式有:

  • CSV/JSON文件:適用于小規模的數據存儲。

  • 數據庫:對于大規模、高頻次的數據存儲,推薦使用關系型數據庫(如MySQL、PostgreSQL)或NoSQL數據庫(如MongoDB)。

    import json

    存儲數據到JSON文件

    data = {‘title’: ‘Example Title’, ‘url’: ‘https://example.com’}
    with open(‘data.json’, ‘w’) as f:
    json.dump(data, f)

對于大規模數據,使用數據庫能夠更好地管理和查詢數據。

import sqlite3conn = sqlite3.connect('scraper.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS pages (title TEXT, url TEXT)''')# 插入數據
cursor.execute('INSERT INTO pages (title, url) VALUES (?, ?)', ('Example Title', 'https://example.com'))
conn.commit()
conn.close()
3.3 數據清洗

在數據存儲之前,可能需要對數據進行清洗。比如,去除重復數據、處理缺失值等。對于Web抓取的數據,通常會遇到HTML編碼問題、異常字符、重復頁面等情況。

# 去除多余的空格和換行符
title = title.strip()# 處理HTML實體編碼
import html
title = html.unescape(title)
4. 爬蟲示例

下面我們將構建一個簡單的爬蟲示例,演示如何結合上述步驟提取網頁中的文章標題和鏈接,并存儲到SQLite數據庫中。

import requests
from bs4 import BeautifulSoup
import sqlite3
import time# 創建SQLite數據庫
conn = sqlite3.connect('scraper.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS articles (title TEXT, url TEXT)''')# 爬蟲主體函數
def scrape_articles(base_url):response = requests.get(base_url)if response.status_code != 200:print(f"Failed to retrieve {base_url}")returnsoup = BeautifulSoup(response.text, 'html.parser')# 提取文章標題和鏈接articles = soup.find_all('a', class_='article-link')for article in articles:title = article.get_text(strip=True)url = article['href']print(f"Found article: {title} - {url}")# 將數據存儲到數據庫cursor.execute('INSERT INTO articles (title, url) VALUES (?, ?)', (title, url))conn.commit()# 示例:抓取一個網站的文章鏈接
scrape_articles('https://example.com/articles')# 關閉數據庫連接
conn.close()
總結

網絡爬蟲的開發不僅僅是抓取網頁內容,還涉及到諸如請求優化、數據解析、異常處理、數據存儲等方面的技術。通過合理的URL提取、有效的HTTP請求、精確的數據解析與存儲策略,開發者能夠構建出功能強大且高效的網絡爬蟲系統。在實際開發中,遵循這些基本流程并結合最新的技術解決方案,將極大提升爬蟲的可行性和實用性。

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

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

相關文章

1.3 雙指針專題:快樂數(medium)

1.題目鏈接 202. 快樂數 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/happy-number/submissions/609206400/ 2.題目描述 編寫?個算法來判斷?個數 n 是不是快樂數。 「快樂數」 定義為&#xff1a; 對于?個正整數&#xff0c;每?次將該數替換…

系統結構知識點

1.主存和輔存以頁面交換數據 2.計算機系統硬件固體軟件 3.計算機系統結構概念的實質是確定計算機系統中軟&#xff0c;硬件的界面&#xff0c;界面之上是軟件實現的功能&#xff0c;界面之下是硬件和固體實現的功能 4.計算機組成是指計算機系統結構的邏輯實現。計算機實現是…

STM32 HAL庫 CAN過濾器配置

之前在STM32 f407 CAN收發 基于HAL庫和Cubemx配置_stm32f407can收發程序-CSDN博客這篇博文里寫了一下配置CAN收發的方法&#xff0c;當時由于并沒有使用過濾器的現實需求&#xff0c;所以就也沒仔細研究。現在工作中確實需要用到過濾器了&#xff0c;有些項目中控制器和發動機E…

飛搭系列|數據遷移功能全新升級,助力用戶實現高效無縫遷移!

前言 飛搭低代碼平臺&#xff08;FeiDa&#xff0c;以下簡稱“飛搭”&#xff09;&#xff0c;為企業提供在線化、靈活的業務應用構建工具&#xff0c;支持高低代碼融合&#xff0c;助力企業低門檻、高效率和低成本地快速應對市場變化&#xff0c;加速復雜業務場景落地。 在之…

【后端】【ubuntu】 ubuntu目錄權限查看的幾種方法

在Ubuntu中&#xff0c;有多種方式可以查看目錄或文件的權限&#xff0c;以下為你詳細介紹常見的指令及其使用方法&#xff1a; 1. ls -l 命令 這是最常用的查看文件和目錄權限的命令&#xff0c;-l 選項用于以長格式列出文件和目錄的詳細信息&#xff0c;其中就包含權限信息…

深度學習與大模型基礎-向量

大家好&#xff01;今天我們來聊聊向量&#xff08;Vector&#xff09;。別被這個詞嚇到&#xff0c;其實向量在我們的生活中無處不在&#xff0c;只是我們沒注意罷了。 1. 向量是什么&#xff1f; 簡單來說&#xff0c;向量就是有大小和方向的量。比如你從家走到學校&#x…

TCP/IP原理詳細解析

前言 TCP/IP是一種面向連接&#xff0c;可靠的傳輸&#xff0c;傳輸數據大小無限制的。通常情況下&#xff0c;系統與系統之間的http連接需要三次握手和四次揮手&#xff0c;這個執行過程會產生等待時間。這方面在日常開發時需要注意一下。 TCP/IP 是互聯網的核心協議族&…

用Python和Docker-py打造高效容器化應用管理利器

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著容器化技術的發展,Docker已成為現代化應用部署的核心工具。然而,手動管理容器在規模化場景下效率低下。本文深入探討如何利用Python結…

【RabbitMQ】事務

事務的簡單配置及使用 配置事務管理器聲明隊列生產者代碼測試 RabbitMQ是基于AMQP協議實現的&#xff0c;該協議實現了事務機制&#xff0c;因此RabbitMQ也支持事務機制. SpringAMQP也提供了對事務相關的操作.RabbitMQ事務允許開發者確保消息的發送和接收是原子性的&#xff0c…

在 IntelliJ IDEA 中配置 Git

1. 確保已安裝 Git 在配置之前&#xff0c;確保你的系統已經安裝了 Git。 檢查是否已安裝 Git&#xff1a; bash 復制 git --version 如果未安裝&#xff0c;請前往 Git 官網 下載并安裝。 2. 在 IntelliJ IDEA 中配置 Git 打開 IntelliJ IDEA。 進入設置&#xff1a; Windo…

【A2DP】藍牙A2DP協議剖析:從架構到規范

目錄 一、A2DP 協議架構 1.1 A2DP 協議棧結構組成 1.2 協議棧各部分的關系與作用 二、設備配置與角色定義&#xff08;Configurations and roles &#xff09; 2.1 角色定義 2.2 配置示例與角色體現 三、用戶需求與場景 3.1 用戶需求與場景 3.2 協議限制 3.3 協議要求…

【從零開始學習計算機科學】操作系統(五)處理器調度

【從零開始學習計算機科學】操作系統(五)處理器調度 處理器調度一些簡單的短程調度算法的思路先來先服務(First-Come-First-Served,FCFS)優先級調度及其變種最短作業優先調度算法(SJF)--非搶占式最短作業優先調度算法(SJF)--搶占式最高響應比優先調度算法輪轉調度算法…

27. Harmonyos Next仿uv-ui 組件NumberBox 步進器組件禁用狀態

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; 文章目錄 1. 組件介紹2. 效果展示3. 禁用狀態設置3.1 整體禁用3.2 輸入框禁用3.3 長按禁用 4. 完整示例代碼5. 知識點講解5.1 禁用狀態屬性5.2 禁用…

Shardingsphere-jdbc 自定義脫敏規則

添加郵件脫敏規則&#xff1a; // 123123123qq.com&#xff0c;將前4個字符脫敏 12312****qq.com 代碼重寫MaskAlgorithm相關方法&#xff1a; /** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE…

大模型在甲狀腺良性腫瘤診療全流程中的應用研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 研究意義與價值 二、甲狀腺良性腫瘤概述 2.1 疾病介紹 2.2 流行病學特征 2.3 傳統診療方法綜述 三、大模型技術原理及應用優勢 3.1 大模型技術簡介 3.2 在醫療領域的應用進展 3.3 針對甲狀腺良性腫瘤的應用優勢 四、大模型在…

軟件IIC和硬件IIC的主要區別,用標準庫舉例!

學習交流792125321&#xff0c;歡迎一起加入討論&#xff01; 在學習iic的時候&#xff0c;我們經常會遇到軟件 IC和硬件 IC,它兩到底有什么區別呢&#xff1f; 軟件 IC&#xff08;模擬 IC&#xff09;和硬件 IC&#xff08;外設 IC&#xff09;是兩種實現 IC 總線通信的方式…

店匠科技攜手 PayPal 升級支付體驗,助力獨立站商家實現全球增長

在全球化電商競爭加劇的背景下,獨立站為無數商戶插上了通向事業成功的翅膀。然而,搭建店鋪框架容易,真正實現有效運營卻充滿挑戰。只有當各個環節如齒輪般嚴絲合縫,獨立站運營才能更好地助推行進,實現穩健增長。如今,獨立站商家面臨著全鏈路運營的多重挑戰。從品牌塑造、營銷推…

密碼學 網絡安全 科普 網絡安全密碼技術

網絡加密包括密碼技術和網絡加密方法兩個方面。 一、 密碼技術   密碼技術一般分為常規密碼和公鑰密碼。   常規密碼是指收信方和發信方使用相同的密鑰&#xff0c;即加密密鑰和解密密鑰是相同或等價的。比較著名的常規密碼算法有DES及其各種變形、IDEA、FEAL、Skipjack…

P8686 [藍橋杯 2019 省 A] 修改數組--并查集 or Set--lower_bound()的解法!!!

P8686 [藍橋杯 2019 省 A] 修改數組--并查集 題目 并查集解析代碼【并查集解】 Set 解法解析lower_bound代碼 題目 并查集解析 首先先讓所有的f&#xff08;i&#xff09;i&#xff0c;即每個人最開始的祖先都是自己&#xff0c;然后就每一次都讓輪到那個數的父親1&#xff08…

Anaconda中虛擬環境安裝g++和gcc相同版本

安裝torchSDF的時候遇到的&#xff0c;這是g和gcc版本不一致的問題 gcc: fatal error: cannot execute cc1plus: execvp: No such file or directory compilation terminated.查看gcc, g版本 gcc --version | head -n1 g --version | head -n1發現gcc的是anaconda中的&#x…