【代碼回溯】最簡單的一個python爬蟲代碼


人在江湖飄,總是會忘記很多舊事。

有些代碼寫完以后,下次見面變成了陌路之客。

                                         ---------------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的內容(即圖片)保存

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM