爬蟲:一個簡單實例說明爬蟲機制

爬蟲,我的簡單理解就是通過寫定的程序,利用計算機的高速的優勢,批量高效的獲取數據的一種機制。通常我們訪問網站是通過瀏覽器,而爬蟲就是通過程序訪問網站,也就是讓程序偽裝成瀏覽器進行訪問。

爬蟲:一個簡單實例說明爬蟲機制

​Request偽裝瀏覽器發送請求應用實例

import requests

res = requests.get(

url='https://blog.csdn.net/BBJG_001', # 我的CSDN個人主頁

)

print(res.url)

# https://blog.csdn.net/BBJG_001

print(res.text) # 查看整個網頁(html的形式),就是在瀏覽器中查看網頁源代碼所看到的的內容

# 這裡只截取開始幾行來顯示

#

#

#

#

# <link>

BeautifulSoup

是一個用來解析html頁面的模塊,可以接收一個html或xml的字符串,通過其中封裝的方法可以很方便的根據標籤以及標籤的屬性獲得html頁面中的標籤所含的內容。

在此之前,爬取的頁面的解析往往是通過正則表達式來完成的,而正則表達式的使用不是那麼容易的

這裡以我的CSDN個人主頁為例來說明BeautifulSoup模塊的使用

導入支持包

import requests

from bs4 import BeautifulSoup # 解析html網頁的

獲取網頁

res = requests.get(

url='https://blog.csdn.net/BBJG_001', # 我的CSDN個人主頁

)

用獲取的網頁封裝BeautifulSoup對象

soup = BeautifulSoup(res.text, 'html.parser')

在瀏覽器中訪問上面的網頁,按F12查看源碼

爬蟲:一個簡單實例說明爬蟲機制

看到目錄主體都在class=‘article-list’的div下

展開一個文章項目

爬蟲:一個簡單實例說明爬蟲機制


​其中一個h4標籤中封裝這標題一行,包含著指向文章詳細內容的鏈接

根據上面的結構從BeautifulSoup中獲取內容

div = soup.find(name='div', attrs={'class': 'article-list'})

# find:找到閾值相匹配的第一個標籤

# 通過class進行find的時候,要格外注意一下,因為不同的標籤的class值可能是相同,

# 這裡我通過查看源碼確認了該class值只在這個div才有

# 通過id尋找是一種比較準確的方式,因為通過id匹配是唯一的

# 在class相同的情況下,可以通過多指定幾個屬性的方式增加定位的精確度

h4_list = div.find_all(name='h4')

# find_all:找對與之相匹配的所有標籤

a_list = [h4.find(name='a') for h4 in h4_list] # 從h4列表中提取出a標籤

data = {}

for a in a_list:

link = a.attrs.get('href') # 獲取標籤的某個屬性

content = a.text# 獲取標籤中間的內容

print(link)

# 只給出部分做顯示

# https://blog.csdn.net/BBJG_001/article/details/104587102

# https://blog.csdn.net/BBJG_001/article/details/104587067

# https://blog.csdn.net/BBJG_001/article/details/104587033

獲取圖片舉例

注意這裡跟上面沒有什麼關係,只是為了介紹這個功能而做的測試

r2 = requests.get('https://imgconvert.csdnimg.cn/aHR0cHM6Ly96eWRzdG9yZS0xMjU4NDc3NzE0LmNvcy5hcC1iZWlqaW5nLm15cWNsb3VkLmNvbS90eXBvcmEvMjAyMDAyMjMxNTE2MDctMTE5ODQ0LnBuZw?x-oss-process=image/format,png')

savepath = r'data/pictures/test01.png'

with open(savepath, 'wb') as f: # 因為下載的是圖片,所以是wb,以二進制流寫入

f.write(r2.content)

# ret.text 將結果ret轉換成字符串,ret.content直接是二進制文件

實際應用中可以find到網頁中獲得的img標籤中的src屬性,根據src獲取文件,並進行保存,注意保存圖片時文件打開方式為wb,f.write()中的傳參為二進制形式

防爬蟲機制

要說明的是,不是所有的網站內容都是可以爬取,或者說不是那麼容易爬取的

瀏覽器在發送請求時,除了會攜帶一些服務器所需的認證信息(用戶名/密碼/token等),還會攜帶一些瀏覽器本身的信息,比較簡單的防爬蟲機制就是去檢測發送的信息中的這些瀏覽器信息,如果信息不完善或不匹配,訪問目標可能會駁回通過代碼發送的訪問請求

通過在代碼中追加瀏覽器信息可以騙過防爬蟲措施不到位的網站

山東掌趣網絡科技



分享到:


相關文章: