爬蟲基礎(chǔ)知識
什么是爬蟲?
爬蟲是一種自動化程序,用于從互聯(lián)網(wǎng)上獲取數(shù)據(jù)。它通過模擬瀏覽器行為,訪問指定的網(wǎng)頁,并從中提取所需的信息。爬蟲工作的核心是發(fā)送HTTP請求、獲取網(wǎng)頁內(nèi)容、解析網(wǎng)頁結(jié)構(gòu)并提取數(shù)據(jù)。
爬蟲的工作原理
爬蟲的工作原理可以分為以下幾個步驟:
- 發(fā)送HTTP請求:爬蟲通過發(fā)送HTTP請求來訪問目標網(wǎng)頁。
- 獲取網(wǎng)頁內(nèi)容:目標網(wǎng)站接收到請求后,會返回網(wǎng)頁的HTML源代碼作為響應(yīng)。
- 解析網(wǎng)頁內(nèi)容:爬蟲利用解析技術(shù)(如XPath、正則表達式等)對HTML源代碼進行解析,從中提取需要的信息。
- 存儲數(shù)據(jù):爬蟲將提取到的數(shù)據(jù)進行存儲,可以保存到本地文件或?qū)懭霐?shù)據(jù)庫。
爬蟲的應(yīng)用領(lǐng)域
爬蟲在各個領(lǐng)域都有廣泛應(yīng)用:
- 數(shù)據(jù)采集與分析:爬蟲可以用于采集互聯(lián)網(wǎng)上的各種數(shù)據(jù),如新聞、商品信息、股票數(shù)據(jù)等。這些數(shù)據(jù)可以用于后續(xù)的數(shù)據(jù)分析、挖掘和建模。
- 搜索引擎:搜索引擎利用爬蟲技術(shù)來獲取互聯(lián)網(wǎng)上的網(wǎng)頁信息,并建立搜索索引,以提供給用戶相關(guān)的搜索結(jié)果。
- 輿情監(jiān)測:企業(yè)或政府可以利用爬蟲技術(shù)來監(jiān)控社交媒體等平臺上的輿情動態(tài),及時獲取和分析公眾的意見和反饋。
- 價格監(jiān)測:電商平臺可以利用爬蟲定期監(jiān)測競爭對手的商品價格,以調(diào)整自己的定價策略。
- 其他領(lǐng)域:爬蟲還廣泛應(yīng)用于個性化推薦系統(tǒng)、自然語言處理、機器學(xué)習等領(lǐng)域。
爬蟲準備工作
安裝Python
爬蟲通常使用Python進行開發(fā),因此需要先安裝Python。您可以從Python官方網(wǎng)站(https://www.python.org/)下載最新版本的Python,并按照安裝向?qū)нM行安裝。
安裝必要的庫和工具
爬蟲開發(fā)中需要使用一些常用的庫和工具來簡化開發(fā)流程:
- requests:用于發(fā)送HTTP請求和處理響應(yīng)。可以通過
pip install requests
命令安裝。 - BeautifulSoup:一個優(yōu)秀的HTML/XML解析庫,可以方便地從網(wǎng)頁中提取數(shù)據(jù)。可以通過
pip install beautifulsoup4
命令安裝。 - lxml:一個高性能的XML/HTML解析庫,可以用于XPath解析??梢酝ㄟ^
pip install lxml
命令安裝。
網(wǎng)頁解析與XPath
網(wǎng)頁結(jié)構(gòu)與標簽
網(wǎng)頁通常使用HTML(超文本標記語言)編寫,它由一系列標簽組成。標簽用于定義網(wǎng)頁的結(jié)構(gòu)和呈現(xiàn)。常見的HTML標簽有<html>
、<head>
、<body>
、<div>
、<p>
等等。通過理解這些標簽及其嵌套關(guān)系,可以更好地理解網(wǎng)頁的結(jié)構(gòu)。
CSS選擇器與XPath
網(wǎng)頁解析可以使用不同的方法,其中兩種常見的方法是CSS選擇器和XPath。
-
CSS選擇器:CSS選擇器是一種用于選擇HTML元素的語法。它通過使用標簽名、類名、ID等屬性,可以方便地定位到指定的元素。例如,通過
.classname
選擇類名為classname
的元素,通過#id
選擇ID為id
的元素。 -
XPath:XPath是一種用于在XML和HTML文檔中進行選擇的語言。XPath使用路徑表達式來選擇節(jié)點或節(jié)點集合。例如,使用
//
表示選擇從根節(jié)點開始的所有節(jié)點,使用/
表示選擇當前節(jié)點的子節(jié)點,使用[]
表示篩選條件等。
Xpath 語法
XPath的基本表達式:
# 選擇所有名為"book"的節(jié)點
xpath_expression = "http://book"
# 選擇根節(jié)點下的所有名為"title"的子節(jié)點
xpath_expression = "/root/title"
# 選擇當前節(jié)點
xpath_expression = "."
# 選擇當前節(jié)點的父節(jié)點
xpath_expression = ".."
-
nodename
:選擇指定名稱的節(jié)點。 -
//nodename
:選擇文檔中所有匹配名稱的節(jié)點。 -
/
:從根節(jié)點開始選擇。 -
.
:選擇當前節(jié)點。 -
..
:選擇當前節(jié)點的父節(jié)點。
XPath的謂語(Predicate):
謂語用于進一步篩選節(jié)點,可以使用一些條件進行過濾。
# 選擇第2個名為"book"的節(jié)點
xpath_expression = "http://book[2]"
# 選擇最后一個名為"title"的節(jié)點
xpath_expression = "http://title[last()]"
# 選擇位置小于3的名為"book"的節(jié)點
xpath_expression = "http://book[position()<3]"
# 選擇具有屬性lang的名為"book"的節(jié)點
xpath_expression = "http://book[@lang]"
# 選擇屬性lang的值為"en"的名為"book"的節(jié)點
xpath_expression = "http://book[@lang='en']"
# 選擇文本內(nèi)容為"Python"的名為"title"的節(jié)點
xpath_expression = "http://title[text()='Python']"
# 選擇屬性lang包含"en"的名為"book"的節(jié)點
xpath_expression = "http://book[contains(@lang, 'en')]"
# 選擇屬性lang以"en"開始的名為"book"的節(jié)點
xpath_expression = "http://book[starts-with(@lang, 'en')]"
# 選擇屬性lang以"en"結(jié)束的名為"book"的節(jié)點
xpath_expression = "http://book[ends-with(@lang, 'en')]"
-
[]
:用于定義謂語條件。 -
[n]
:選擇第n個節(jié)點。 -
[last()]
:選擇最后一個節(jié)點。 -
[position()<n]
:選擇位置小于n的節(jié)點。 -
[@attribute]
:選擇具有指定屬性的節(jié)點。 -
[@attribute='value']
:選擇具有指定屬性值的節(jié)點。 -
[text()='value']
:選擇具有指定文本值的節(jié)點。 -
[contains(@attribute, 'value')]
:選擇屬性包含特定值的節(jié)點。 -
[starts-with(@attribute, 'value')]
:選擇屬性以特定值開始的節(jié)點。 -
[ends-with(@attribute, 'value')]
:選擇屬性以特定值結(jié)束的節(jié)點。
XPath的軸(Axis):
軸用于在節(jié)點之間建立關(guān)聯(lián),常見的軸包括:
# 選擇所有祖先節(jié)點
xpath_expression = "http://book/ancestor::node()"
# 選擇所有祖先節(jié)點和當前節(jié)點自身
xpath_expression = "http://book/ancestor-or-self::node()"
# 選擇當前節(jié)點的屬性節(jié)點
xpath_expression = "http://book/attribute::node()"
# 選擇當前節(jié)點的所有子節(jié)點
xpath_expression = "http://book/child::node()"
# 選擇當前節(jié)點的所有后代節(jié)點
xpath_expression = "http://book/descendant::node()"
# 選擇當前節(jié)點的所有后代節(jié)點和自身
xpath_expression = "http://book/descendant-or-self::node()"
# 選擇當前節(jié)點之后的所有節(jié)點
xpath_expression = "http://book/following::node()"
# 選擇當前節(jié)點之后的所有同級節(jié)點
xpath_expression = "http://book/following-sibling::node()"
# 選擇當前節(jié)點的父節(jié)點
xpath_expression = "http://book/parent::node()"
# 選擇當前節(jié)點之前的所有節(jié)點
xpath_expression = "http://book/preceding::node()"
# 選擇當前節(jié)點之前的所有同級節(jié)點
xpath_expression = "http://book/preceding-sibling::node()"
# 選擇當前節(jié)點
xpath_expression = "http://book/self::node()"
-
ancestor
:選擇所有祖先節(jié)點。 -
ancestor-or-self
:選擇所有祖先節(jié)點和當前節(jié)點自身。 -
attribute
:選擇當前節(jié)點的屬性節(jié)點。 -
child
:選擇當前節(jié)點的所有子節(jié)點。 -
descendant
:選擇當前節(jié)點的所有后代節(jié)點。 -
descendant-or-self
:選擇當前節(jié)點的所有后代節(jié)點和自身。 -
following
:選擇當前節(jié)點之后的所有節(jié)點。 -
following-sibling
:選擇當前節(jié)點之后的所有同級節(jié)點。 -
namespace
:選擇當前節(jié)點的命名空間節(jié)點。 -
parent
:選擇當前節(jié)點的父節(jié)點。 -
preceding
:選擇當前節(jié)點之前的所有節(jié)點。 -
preceding-sibling
:選擇當前節(jié)點之前的所有同級節(jié)點。 -
self
:選擇當前節(jié)點。
XPath的運算符:
XPath支持使用運算符進行條件篩選,常見的運算符包括:
# 判斷兩個值是否相等
xpath_expression = "http://book[price=10]"
# 判斷兩個值是否不相等
xpath_expression = "http://book[price!=10]"
# 判斷一個值是否小于另一個值
xpath_expression = "http://book[price<10]"
# 判斷一個值是否大于另一個值
xpath_expression = "http://book[price>10]"
# 判斷一個值是否小于等于另一個值
xpath_expression = "http://book[price<=10]"
# 判斷一個值是否大于等于另一個值
xpath_expression = "http://book[price>=10]"
# 用于邏輯與操作
xpath_expression = "http://book[price=10 and lang='en']"
# 用于邏輯或操作
xpath_expression = "http://book[price=10 or lang='en']"
# 用于邏輯非操作
xpath_expression = "http://book[not(price=10)]"
-
=
:判斷兩個值是否相等。 -
!=
:判斷兩個值是否不相等。 -
<
:判斷一個值是否小于另一個值。 -
>
:判斷一個值是否大于另一個值。 -
<=
:判斷一個值是否小于等于另一個值。 -
>=
:判斷一個值是否大于等于另一個值。 -
and
:用于邏輯與操作。 -
or
:用于邏輯或操作。 -
not
:用于邏輯非操作。
XPath的函數(shù):
XPath提供了一些內(nèi)置函數(shù),可以在選擇節(jié)點時進行一些操作和轉(zhuǎn)換。常用的函數(shù)包括:
# 選擇節(jié)點的文本內(nèi)容
xpath_expression = "http://title/text()"
# 選擇節(jié)點的名稱
xpath_expression = "name(//book)"
# 連接多個字符串
xpath_expression = 'concat("Hello", " ", "World")'
# 判斷一個字符串是否包含另一個字符串
xpath_expression = 'contains("Hello World", "Hello")'
# 判斷一個字符串是否以另一個字符串開始
xpath_expression = 'starts-with("Hello World", "Hello")'
# 判斷一個字符串是否以另一個字符串結(jié)束
xpath_expression = 'ends-with("Hello World", "World")'
# 獲取字符串的長度
xpath_expression = 'string-length("Hello World")'
# 移除字符串兩端的空白字符并壓縮中間的空白字符
xpath_expression = 'normalize-space(" Hello World ")'
# 計算節(jié)點的數(shù)量
xpath_expression = 'count(//book)'
-
text()
:選擇節(jié)點的文本內(nèi)容。 -
name()
:選擇節(jié)點的名稱。 -
concat()
:連接多個字符串。 -
contains()
:判斷一個字符串是否包含另一個字符串。 -
starts-with()
:判斷一個字符串是否以另一個字符串開始。 -
ends-with()
:判斷一個字符串是否以另一個字符串結(jié)束。 -
string-length()
:獲取字符串的長度。 -
normalize-space()
:移除字符串兩端的空白字符并壓縮中間的空白字符。 -
count()
:計算節(jié)點的數(shù)量。
使用XPath解析網(wǎng)頁
使用XPath解析網(wǎng)頁可以方便地定位和提取需要的數(shù)據(jù)。以下是使用Python的lxml庫進行XPath解析csdn中python專欄的示例代碼:
import requests
from bs4 import BeautifulSoup
import time
from selenium import webdriver
# 發(fā)送HTTP請求獲取網(wǎng)頁內(nèi)容
url = "https://blog.csdn.net/nav/python"
# 使用Chrome瀏覽器,需提前安裝ChromeDriver并配置環(huán)境變量
driver = webdriver.Chrome()
# 打開網(wǎng)頁
driver.get(url)
# 等待網(wǎng)頁內(nèi)容加載完成(根據(jù)實際情況調(diào)整等待時間)
time.sleep(3)
# 獲取完整的網(wǎng)頁內(nèi)容
html = driver.page_source
# 關(guān)閉瀏覽器
driver.quit()
# 解析網(wǎng)頁內(nèi)容
soup = BeautifulSoup(html, "lxml")
# 提取所需信息
articles = soup.select(".Community .active-blog")
# print(articles)
for article in articles:
title = article.select_one(".content .desc").text.strip()
author = article.select_one(".operation .operation-c span").text.strip()
print("標題:", title)
print("作者:", author)
print("-" * 50)
代碼中,我們使用requests庫發(fā)送HTTP請求獲取網(wǎng)頁內(nèi)容,然后使用lxml庫的etree模塊將HTML源代碼轉(zhuǎn)換為可解析的樹形結(jié)構(gòu)。接下來,我們使用XPath路徑表達式來選擇所需的節(jié)點,并通過xpath()方法提取出標題和作者等信息。
效果如圖:文章來源:http://www.zghlxwxcb.cn/news/detail-520766.html
未完待續(xù)…
文章來源地址http://www.zghlxwxcb.cn/news/detail-520766.html
到了這里,關(guān)于爬蟲入門指南(1):學(xué)習爬蟲的基礎(chǔ)知識和技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!