人在江湖飄,總是會忘記很多舊事。
有些代碼寫完以后,下次見面變成了陌路之客。
---------------HLK
這里是代碼回溯專題,主要是回憶我自己寫的代碼及原理,讓自己不會忘記曾經寫下的東西。
那么今天來講講最最最初級的python爬蟲程序,"爬某網站的圖片"。
要爬的網頁代碼結構是
<html>
<head></head>
<body>
...
<img src="目標網址">
<img src="目標網址2">
<img src="目標網址3">
...
</body>
<html>
我們要做的操作是:
1、向網頁發送請求並獲得網頁代碼
2、解析網頁代碼里img標簽的src屬性,訪問src屬性里的網址並下載圖片
-
詳細的操作說明
-----------------------------------------------------------------------
首先,本文用的組件為
請求庫 Request
解析庫 BeautifulSoup
所以請在py文件的最開頭輸入
import requests
from bs4 import BeautifulSoup
如果沒有這兩個庫的話,請提前下載好。
-----------------------------------------------------------------------
1、向網頁發送請求並獲得網頁代碼
首先,最基礎的代碼是這三句。
response = requests.get(url, headers=header) #發送帶有請求頭的請求
print(response) #輸出響應信號
page_content = response.content.decode("utf-8") #將網頁內容以utf-8的編碼格式輸出
將page_content抓到手就算成功。(你可以用print或者open().write去看一下輸出的結果與你在瀏覽器里看到的是否相同)
當響應信號為200的時候,說明請求成功。
其余情況請自行百度解決。
關於代碼里的參數url和header:
url即你想要爬的網頁網址。
header是向網頁發送請求時附加的請求頭。
一般是這樣的格式。
header = {
'accept-language':'zh-CN,zh;q=0.9,en;q=0.8;en-GB;q=0.7,en-US;q=0.6',
'cache-control': 'max-age=0',
'accept-encoding': 'gzip, deflate, br',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
那么這個請求頭的內容是怎么得來的呢?實際上是抄的瀏覽器訪問網頁時的請求頭。
為了模仿瀏覽器瀏覽,請大家在該網站里用開發者工具先抓一下請求包,看看請求頭的內容
下圖是用Chrome的開發者工具查看的百度首頁的請求頭。(打開network,刷新該網頁,然后查看第一個請求就行了。一定要刷新哦~)
這樣你就可以將一些請求頭里的數據復制到代碼里,達到爬蟲模仿瀏覽器的效果。(當然了,這只是最基本的爬蟲操作,爬很多網站過不了關的)
2、解析網頁代碼里img標簽的src屬性,訪問src屬性里的網址並下載圖片
獲取了page_content之后,我們就需要用BeautifulSoup對其進行解析。
soup = BeautifulSoup(page_content, "html.parser")
imgs = soup.find_all(name='img') #獲取網頁里關於所有img標簽的數組
上方代碼會返回一個包含所有img標簽的數組,然后我們只要遍歷數組,然后用get方法即可獲得src值
---------------------------------------------------------------------------------
在這之前我想了很多方法去取src值,都相當地麻煩。
感謝niewzh 大佬的博客,讓我用兩三條指令便輕松地獲取了屬性值
博客地址:https://blog.csdn.net/ScapeD/article/details/81813463
---------------------------------------------------------------------------------
如下所示:get方法成功獲取了src……不對,是data-aload值???
for a in imgs: #遍歷img標簽數組里的所有值
data_address = a.get('data-aload') #用get方法將每個img標簽里面對應的屬性抽取出來
實際上獲取的屬性之所以是data-aload,原因是很多網站有特殊的屏蔽機制,src值在爬出的時候內容會變成"loading"之類的非網址值。(當然,也許只是我遇到的網站比較特殊)
而經過仔細分析,我發現data-aload屬性里反而有我想要的值,因此改變了要爬的參數。
你的開頭計划的需求,很可能會與實際不符,要時刻與現況看齊。
由於爬出來的標簽中有一些沒有相對應的屬性(例如本文要爬的data-aload)的圖片,那些就需要另外特殊處理,。
這里將我們所爬到的標簽進行一些過濾和修補,然后就可以將對應網址的圖片下載下來了。
if data_address != None: #只對有src值的img標簽進行操作
data_address=data_address.split()[0]; #返回的src值里有一行空行,此處將其處理了
response = requests.get(data_address, headers=header) #發送帶有請求頭的請求
print("downloading") #提示信息,用來提示你正在保存圖片
open("本地的保存地址", "wb").write(response.content) #將response的內容(即圖片)保存
那么以上就是分步解析了,總的代碼是這樣的(無函數無類):
※有需要的還可以在里面加上num參數來方便給圖片排序,或者加入time.sleep計時器方便調整下載速度之類的。
※這里的header都用了同一個請求頭,具體情況還請具體分析
import requests
from bs4 import BeautifulSoup
#--------------------------------------- 請求部分 -----------------------------------------------------
url = 'xxxxxxxxxxxxxx'
header = {
'accept-language':'zh-CN,zh;q=0.9,en;q=0.8;en-GB;q=0.7,en-US;q=0.6',
'cache-control': 'max-age=0',
'accept-encoding': 'gzip, deflate, br',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
response = requests.get(url, headers=header) #發送帶有請求頭的請求
print(response) #輸出響應信號
page_content = response.content.decode("utf-8") #將網頁內容以utf-8的編碼格式輸出
#--------------------------------------- 解析部分 -----------------------------------------------------
soup = BeautifulSoup(page_content, "html.parser")
imgs = soup.find_all(name='img') #獲取網頁里關於所有img標簽的數組
for a in imgs: #遍歷img標簽數組里的所有值
data_address = a.get('data-aload') #用get方法將每個img標簽里面對應的屬性抽取出來
if data_address != None: #只對有src值的img標簽進行操作
data_address=data_address.split()[0]; #返回的src值里有一行空行,此處將其處理了
response = requests.get(data_address, headers=header) #發送帶有請求頭的請求
#print("downloading") #提示信息,用來提示你正在保存圖片
print(response) #輸出響應信號,用作故障測試檢查點
open("本地的保存地址", "wb").write(response.content) #將response的內容(即圖片)保存