自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文帶您理解Selenium 和 BeautifulSoup:掌握數(shù)據(jù)抓取的核心技術(shù)

開發(fā) 前端
網(wǎng)站數(shù)據(jù)爬取是一項(xiàng)全棧技術(shù),涉及 HTTP、HTML、Python、Selenium、BeautifulSoup 和正則表達(dá)式等工具。成功抓取依賴于對網(wǎng)頁結(jié)構(gòu)的理解、繞過防爬機(jī)制及流量控制。

近期開發(fā)了一個數(shù)據(jù)抓取/數(shù)據(jù)格式化(指定網(wǎng)站內(nèi)容)的小工具,起初設(shè)想使用 requests 和正則表達(dá)式的組合來實(shí)現(xiàn),然而實(shí)際操作后發(fā)現(xiàn)無法順利抓取數(shù)據(jù)。于是我轉(zhuǎn)而嘗試 requests 搭配 BeautifulSoup,但問題依舊,頁面采用動態(tài)加載且有反爬機(jī)制,必須模擬瀏覽器行為才能獲取數(shù)據(jù)。最后,經(jīng)過多次調(diào)整,最終選擇了 Python 驅(qū)動的 Selenium 方案,并結(jié)合正則表達(dá)式來格式化數(shù)據(jù),成功實(shí)現(xiàn)了抓取任務(wù)。

接下來,將探討使用 Selenium、BeautifulSoup 和 HTML 結(jié)構(gòu)進(jìn)行網(wǎng)頁抓取的基礎(chǔ)知識。無論您是有抱負(fù)的數(shù)據(jù)科學(xué)家,還是只是想擴(kuò)展您的技術(shù)技能,這些知識都將成為您網(wǎng)頁抓取之旅的基礎(chǔ)。

HTML:Web 的支柱

HTML(超文本標(biāo)記語言)是創(chuàng)建網(wǎng)頁的標(biāo)準(zhǔn)語言。它由一系列定義網(wǎng)站結(jié)構(gòu)、布局和內(nèi)容的元素組成。

這些元素由標(biāo)簽表示,例如 <p> 表示段落、<h1> 表示標(biāo)題、<a> 表示超鏈接。通過了解這些標(biāo)簽的組織方式,您可以識別在網(wǎng)頁抓取過程中要提取的相關(guān)內(nèi)容。

每個 HTML 文件都由構(gòu)成其底層結(jié)構(gòu)的幾個基本組件組成。這些組件以嵌套的層次結(jié)構(gòu)組織,文檔的內(nèi)容包含在這些標(biāo)簽中。

<!DOCTYPE html> 
<html> 
<head> 
    <title>您的頁面標(biāo)題</title> 
</head> 
<body> 
    <!-- 您的內(nèi)容放在此處 --> 
</body> 
</html>
  1. <!DOCTYPE html>:此聲明定義所使用的 HTML 文檔類型和版本。它可幫助瀏覽器了解如何正確呈現(xiàn)頁面。
  2. <html>:這是頁面的根元素,它包含文檔的所有其他元素。
  3. <head>:head 元素包含有關(guān)文檔的元信息。
  4. <title>:title元素指定網(wǎng)頁的標(biāo)題,顯示在瀏覽器的標(biāo)題欄或選項(xiàng)卡中。
  5. <body>:body元素包含網(wǎng)頁的實(shí)際內(nèi)容,如文本、圖像和多媒體。

除了構(gòu)成 HTML 文件基本結(jié)構(gòu)的標(biāo)簽外,還有許多其他標(biāo)簽用于在網(wǎng)頁上創(chuàng)建不同類型的內(nèi)容。以下是您會遇到的一些最常見的 HTML 標(biāo)簽:

  1. <h1>至<h6>:這些是標(biāo)題標(biāo)簽,用于在內(nèi)容中創(chuàng)建標(biāo)題和副標(biāo)題。<h1>是最大和最重要的,而是<h6>最小和最不重要的。
  2. <p>:段落標(biāo)簽用于創(chuàng)建文本段落。它會自動在段落前后添加邊距,從而在文本塊之間提供清晰的分隔。
  3. <a>:錨標(biāo)記用于創(chuàng)建超鏈接,使用戶可以在網(wǎng)頁之間導(dǎo)航。該href屬性指定鏈接的目標(biāo) URL。
  4. <ul>和<ol>:這些標(biāo)簽分別用于創(chuàng)建無序列表(項(xiàng)目符號)和有序列表(編號)。列表中的每個項(xiàng)目都包含在一個<li>標(biāo)簽中。
  5. <table>:table 標(biāo)簽用于創(chuàng)建表格,以行和列的形式顯示數(shù)據(jù)。它通常與其他標(biāo)簽(如<tr>(表格行)、<th>(表格標(biāo)題)和<td>(表格數(shù)據(jù)單元格))一起使用。

每個 HTML 元素可以具有各種屬性,這些屬性可提供附加信息或修改其行為。網(wǎng)頁抓取中最常用的一些屬性是class、id和href。和通常class都id用于定位和獲取感興趣的信息。href用于瀏覽不同的頁面。

  • class:該class屬性允許您將一個或多個 CSS 類分配給 HTML 元素
<p class="highlighted important" >
本段落class屬性有兩個類:“highlighted”和“important”。
</p>
  • id:該id屬性用于唯一標(biāo)識 HTML 文檔中的元素。每個id值在整個文檔中都必須是唯一的。
<div id = "main-content" >
此div具有唯一ID:“main-content”
。</div>
  • href:該href屬性主要與 (anchor) 標(biāo)簽一起使用<a>,指定超鏈接的目標(biāo) URL。當(dāng)用戶點(diǎn)擊鏈接時,瀏覽器將導(dǎo)航到指定的 URL。
<a >
訪問百度
</a>

網(wǎng)絡(luò)數(shù)據(jù)抓取主要有三種方式:

  1. 靜態(tài)抓取:這種方式僅解析 HTML,忽略 JavaScript。它不需要瀏覽器即可從服務(wù)器提取網(wǎng)頁,獲取的內(nèi)容就是頁面源代碼中看到的靜態(tài)部分。通過提供的 URL,您可以直接獲取 HTML 結(jié)構(gòu)進(jìn)行剪切和解析。這也是它被稱為“靜態(tài)抓取”的原因——只需獲取并處理服務(wù)器返回的靜態(tài)頁面內(nèi)容。
  2. API 抓?。喝缃窈芏嗑W(wǎng)站的架構(gòu)是 API + JS 的組合。通過分析頁面結(jié)構(gòu),可以找到 API 地址和請求方法,直接向服務(wù)器發(fā)送請求,獲取結(jié)構(gòu)化的 JSON 數(shù)據(jù)。這種方式最為簡便,因?yàn)榉祷氐臄?shù)據(jù)是格式化的json 或xml 數(shù)據(jù)。
  3. 動態(tài)抓?。哼@種方式使用瀏覽器,可以讀取通過 JavaScript 生成或修改的內(nèi)容。簡而言之,動態(tài)抓取模擬真實(shí)用戶操作——像用戶一樣發(fā)送輸入、改變頁面或點(diǎn)擊按鈕。有時,還需要自動化瀏覽器操作來獲取特定內(nèi)容。對于此類任務(wù),通常需要使用 Selenium WebDriver 來模擬用戶行為。

這三種方式各有優(yōu)劣,選擇哪種方式取決于目標(biāo)網(wǎng)站的技術(shù)架構(gòu)和防爬策略。

使用 BeautifulSoup 進(jìn)行靜態(tài)網(wǎng)頁抓取

Beautifulsoup是一個使用 HTML/XML 解析器并將網(wǎng)頁/html/xml 轉(zhuǎn)換為標(biāo)簽、元素、屬性和值的樹的 Python 庫。

安裝BeautifulSoup

向想要抓取的網(wǎng)頁的 URL 發(fā)送一個 HTTP GET 請求,服務(wù)器將返回包含 HTML 內(nèi)容的響應(yīng),使用 Python 的 requests 庫來請求;使用BeautifulSoup加載解析html。

from bs4 import BeautifulSoup
import requests
url='https://bot.sannysoft.com/'
html_content = requests.get(url).text
soup = BeautifulSoup(html_content, "html")
print(soup.prettify())

可以通過 .find([element_tag]) 方法輕松從 HTML 結(jié)構(gòu)中提取出我們感興趣的內(nèi)容——用于查找單個元素;如果有多個元素,可以使用 .findAll([element_tag]) 方法。

table_ele=soup.find('table')
tres=table_ele.findAll('tr')
for tr in tres:
  tdes=tr.findAll('td')
  if len(tdes)>1:
    print(tdes[0].text,':',tdes[1].text)

使用 Selenium 進(jìn)行動態(tài)網(wǎng)頁抓取

Selenium 用于自動化網(wǎng)頁應(yīng)用程序操作。它允許您像人類用戶一樣打開瀏覽器并執(zhí)行任務(wù),例如點(diǎn)擊按鈕和在網(wǎng)站上搜索特定信息。

安裝Selenium和驅(qū)動,需要一個驅(qū)動程序來與瀏覽器進(jìn)行交互。

  1. 安裝 Selenium:在命令提示符或終端中運(yùn)行以下命令:pip install selenium
  2. 下載驅(qū)動程序:需要瀏覽器的驅(qū)動程序,讓 Selenium 能夠與瀏覽器交互。建議使用chrome,檢查您的 Google Chrome 版本,然后在 https://developer.chrome.com/docs/chromedriver/downloads?hl=zh-cn下載對應(yīng)的 Chromedriver。

下面是一個簡單的示例:

import subprocess
import threading
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time




def openChrome():
    cmd = '"C:\Program Files\Google\Chrome\Application\chrome.exe" ' \
          '--remote-debugging-port=9222 ' \
          '--user-data-dir="d:\selenium\ChromeProfile" ' \
          ' --disable-popup-blocking --disable-gpu --safebrowsing-disable-download-protection '
    sub_chrome_process = subprocess.Popen(cmd, shell=True)




thread = threading.Thread(target=openChrome)
thread.start()
time.sleep(2)
print(f"{openChrome =}")


def getDriver():
    chrome_options = Options()
    chrome_options.add_argument('--ignore-certificate-errors')
    chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    driver = webdriver.Chrome(optinotallow=chrome_options)
    """params = {
        "behavior": "allow",
        "downloadPath": download_dir # 設(shè)置新的下載路徑
    }
    driver.execute_cdp_cmd("Page.setDownloadBehavior", params)
    driver.execute_cdp_cmd("Security.setIgnoreCertificateErrors", {"ignore": True})"""
    return driver




driver =getDriver()
driver.get("https://bot.sannysoft.com/")


print("*"*50)
table_ele=driver.find_element(By.TAG_NAME,"table")
for tr_ele in table_ele.find_elements(By.TAG_NAME,"tr"):
    tdes_ele=tr_ele.find_elements(By.TAG_NAME,'td')
    if len(tdes_ele)>1:
        print(tdes_ele[0].text.replace('\n',''),":",tdes_ele[1].text)
print("*"*50)


scroll_step = 200  # 每次滾動的像素
pause_time = 0.3  # 每次滾動后的等待時間(秒)
current_height = driver.execute_script("return document.body.scrollHeight")  # 獲取當(dāng)前頁面總高度
# 逐步向下滾動
for j in range(0, current_height, scroll_step):
    driver.execute_script(f"window.scrollBy(0, {scroll_step});")
    time.sleep(pause_time)

這段代碼的邏輯和步驟如下:

1.導(dǎo)入必要的庫:

subprocess:用于在 Python 中啟動新進(jìn)程。

threading:用于創(chuàng)建和管理線程。

selenium.webdriver:用于與瀏覽器進(jìn)行交互。

time:用于時間延遲。

2.定義 openChrome 函數(shù):

構(gòu)造一個命令行字符串 cmd,用于啟動 Google Chrome 瀏覽器,并指定一些啟動選項(xiàng),注意開啟遠(yuǎn)程模式:--remote-debugging-port=9222:開啟遠(yuǎn)程調(diào)試,允許其他程序(如 Selenium)連接到這個端口。

使用 subprocess.Popen 啟動 Chrome 瀏覽器進(jìn)程。

3.創(chuàng)建并啟動線程:

使用 threading.Thread 創(chuàng)建一個新線程,目標(biāo)是運(yùn)行 openChrome 函數(shù)。

啟動該線程,并在啟動后等待 2 秒,以確保 Chrome 瀏覽器啟動完成。

4.定義 getDriver 函數(shù):

創(chuàng)建一個 Options 對象,配置 Chrome 的啟動選項(xiàng)。

添加忽略證書錯誤的選項(xiàng):chrome_options.add_argument('--ignore-certificate-errors')。

設(shè)置調(diào)試地址,使 Selenium 能夠連接到已啟動的 Chrome 實(shí)例:chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")。

使用配置的選項(xiàng)創(chuàng)建 Chrome WebDriver 實(shí)例并返回。

5.獲取 WebDriver:

調(diào)用 getDriver 函數(shù)獲取 WebDriver 并訪問指定的 URL(這里是一個示例網(wǎng)頁 "https://bot.sannysoft.com/")。

6.打印表格數(shù)據(jù):

使用 find_element 和 find_elements 方法找到網(wǎng)頁中的 <table> 元素及其子元素 <tr> 和 <td>。

遍歷表格的每一行,如果該行中有多個單元格(<td>),則打印第一個和第二個單元格的文本內(nèi)容。

7.滾動頁面:

設(shè)置每次滾動的像素和等待時間。

獲取當(dāng)前頁面的總高度。

使用 execute_script 方法逐步向下滾動頁面,直到達(dá)到頁面底部。

通過這段代碼,您可以實(shí)現(xiàn)自動化瀏覽器操作,抓取網(wǎng)頁上的表格數(shù)據(jù),并進(jìn)行頁面滾動,以獲取更多信息。

特別注意的如果是直接打開的chrome 瀏覽器的話(driver =webdriver.Chrome()) ,WebDriver 標(biāo)記為True,有較多的網(wǎng)站防爬取判斷,被網(wǎng)站攔截掉,可以直接先開啟遠(yuǎn)程模式打開chrome ,然后創(chuàng)建dirver連接到debuggerAddress 上驅(qū)動chrome 。

以下是實(shí)踐過程中點(diǎn)滴總結(jié):

  • 網(wǎng)站數(shù)據(jù)爬取是全棧的技術(shù)活,需要了解HTTP、HTML、Python、Selenium、BeautifulSoup、正則表達(dá)式、驗(yàn)證碼識別等。
  • 從網(wǎng)站進(jìn)行數(shù)據(jù)爬取和解析本質(zhì)上可以理解網(wǎng)頁的非格式化數(shù)據(jù)逆向?yàn)楦袷交瘮?shù)據(jù)的過程;不同完整需要不同的方式和策略,特別是網(wǎng)站防爬設(shè)置、流量控制,需要控制速率、模擬一些真人操作的一些行為。
  • 內(nèi)容的解析和格式化才是最具挑戰(zhàn)性的工作,特別是解析文檔類的數(shù)據(jù),正則表達(dá)式的功底是需要的。

網(wǎng)站數(shù)據(jù)爬取是一項(xiàng)全棧技術(shù),涉及 HTTP、HTML、Python、Selenium、BeautifulSoup 和正則表達(dá)式等工具。成功抓取依賴于對網(wǎng)頁結(jié)構(gòu)的理解、繞過防爬機(jī)制及流量控制。解析與格式化是其中最具挑戰(zhàn)的環(huán)節(jié),特別是文檔類數(shù)據(jù)的處理,需要扎實(shí)的正則表達(dá)式能力。

責(zé)任編輯:武曉燕 來源: 新語數(shù)據(jù)故事匯
相關(guān)推薦

2017-12-21 14:48:43

數(shù)據(jù)安全數(shù)據(jù)泄漏檢測技術(shù)

2024-07-11 12:14:20

Pythonmapfilter

2024-10-17 16:45:46

Python內(nèi)置函數(shù)

2023-10-24 11:44:21

2025-04-30 10:36:17

2024-08-19 00:01:00

2025-01-06 07:54:13

SPC控制圖工具

2024-10-06 14:01:47

Python裝飾器對象編程

2021-07-28 07:53:20

C#.NET設(shè)計

2025-02-05 12:06:15

正態(tài)分?jǐn)?shù)變換NST

2023-03-08 17:54:29

802.1x協(xié)議無線網(wǎng)絡(luò)

2024-12-30 00:00:05

2024-03-12 17:54:55

容器類型Init

2025-04-22 08:57:27

2024-05-21 09:45:40

機(jī)器學(xué)習(xí)人工智能XAI

2016-11-15 14:33:05

Flink大數(shù)據(jù)

2020-12-10 11:00:37

JavaJVM命令

2018-05-16 11:05:49

ApacheFlink數(shù)據(jù)流

2022-10-21 17:24:34

契約測試定位

2016-11-22 17:05:54

Apache Flin大數(shù)據(jù)Flink
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號