Python爬蟲(1-4)-基本概念、六個讀取方法、下載(原始碼、圖片、影片 )、user-agent反爬

夕瑶^發表於2024-07-10

Python爬蟲

一、爬蟲相關概念介紹

1.什麼是網際網路爬蟲

如果我們把網際網路比作一張大的蜘蛛網,那一臺計算機上的資料便是蜘蛛網上的一個獵物,而爬蟲程式就是一隻小蜘蛛,沿著蜘蛛網抓取自己想要的資料

解釋1:透過一個程式,根據URL進行爬取網頁,獲取有用資訊
解釋2:使用程式模擬瀏覽器,去向伺服器傳送請求,獲取響應資訊

2.爬蟲核心

  • 爬取網頁:爬取整個網頁,包含了網頁中所有的內容
  • 解析資料:將網頁中你得到的資料進行解析,也就是找到你所需要的資料
  • 難點:爬蟲和反爬蟲之間的博弈。即“抓取資料”和”拒絕給你資料”之間的博弈

3.爬蟲分類

  • 通用爬蟲
  • 聚焦爬蟲

根據需求,實現爬蟲程式,抓取需要的資料

設計思路

1.確定要爬取的url
如何獲取Url
2.模擬瀏覽器透過http協議訪問url,獲取伺服器返回的html程式碼
如何訪問
3.解析html字串(根據一定規則提取需要的資料)
如何解析

4.urllib庫使用

二、一個型別and六個方法

HTTPResponse型別

表示從伺服器接收到的 HTTP 響應的物件型別,通常在處理網路請求時使用。它包含了伺服器返回的各種資訊,如狀態碼、響應頭和響應體

  • read()
  • readline() 只讀取一行
  • readlines() 讀取多行
  • getcode() 獲取狀態碼
  • geturl()
  • getheaders() 獲取狀態資訊

三、下載

下載網頁

#下載網頁
url_page='http://www.baidu.com'
urllib.request.urlretrieve(url_page,'baidu.html')

下載圖片

透過“複製影像連結”獲取圖片的存取路徑,注意urlretrieve()函式里要對應好檔案格式

#下載圖片
url_img='https://ww1.sinaimg.cn/mw690/007SWX7Ugy1hr6kqd0netj32wi4crqve.jpg'
urllib.request.urlretrieve(url_img,'zhouyiran.jpg')

下載影片

滑鼠右擊選擇“檢查”

# 下載影片
url_video='https://vdept3.bdstatic.com/mda-pi79hyfq8jscww7u/360p/h264/1694155424021989258/mda-pi79hyfq8jscww7u.mp4?v_from_s=hkapp-haokan-hbf&auth_key=1720607496-0-0-d017b040f470523698685d8261770983&bcevod_channel=searchbox_feed&pd=1&cr=0&cd=0&pt=3&logid=1896481070&vid=10142877359436078513&klogid=1896481070&abtest=101830_2-102148_1-17451_2-3000225_3'
urllib.request.urlretrieve(url_video,'zhou.mp4')

四、請求物件的定製(user-agent反爬)

HTTPHTTP以明文形式傳輸資料,資料在傳輸過程中沒有加密,容易被中間人截獲和篡改。
HTTPSHTTPS使用SSL/TLS協議對資料進行加密,確保資料在傳輸過程中是安全的,即使被截獲也無法輕易解密

user-agentHttp協議中的一部分,屬於頭域的組成部分,User Agent也簡稱UA。它是一個特殊字串頭,是一種向訪問網站提供你所使用的瀏覽器型別及版本、作業系統及版本、瀏覽器核心、等資訊的標識。透過這個標識,使用者所訪問的網站可以顯示不同的排版從而為使用者提供更好的體驗或者進行資訊統計;例如用手機訪問谷歌和電腦訪問是不一樣的,這些是谷歌根據訪問者的UA來判斷的。UA可以進行偽裝。

URL的組成

首先找到百度首頁的user-agent

然後用以下程式碼進行反爬

import urllib.request

url='https://www.baidu.com'

# 構造字典
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0'
}

# 因為引數位置不對應,所以要寫明引數名,再寫引數值
request=urllib.request.Request(url=url,headers=headers)

# 進行包裝後再讀取
response=urllib.request.urlopen(request)

content=response.read().decode('utf-8')

print(content)

相關文章