Python爬蟲之爬取百度貼吧帖子內的圖片

前言:這篇文章在大一剛入學的時候就完成了,當初剛入門 Python 爬蟲不久。現在回頭看看這代碼,寫得什么鬼屎玩意兒。趁著周六,把這代碼修改一下。

準備工作

環境
系統: Windows10 x64
編輯器: Vscode


用到的庫
requests -> 文檔
bs4 -> 文檔

需要的知識

這篇文章講的是 Python爬蟲, 其實懂點 Python 語法應該很容易看懂。
還有一些HTML語法基礎以及HTTP基礎。不懂可以在后臺留言。
這幾個庫的用法會在代碼中體現。

開始爬蟲

這次要爬取的帖子是這個。
地址在這:http://tieba.baidu.com/p/4629627483


這個帖子下面有很多南濱校園的照片,非常漂亮。

基本思路

我們如何獲取到每張圖片呢?
其實很簡單

第一步:獲取每張圖片的鏈接
第二步:保存圖片

是不是非常簡單,具體怎么做請往下看。

第一步:獲取每張圖片的鏈接

這個很簡單,看圖



圖片地址就在箭頭所指的方向。
那如何獲取這個鏈接呢?
非常簡單。
首先要獲取整個頁面的HTML源碼,然后再獲取圖片地址。
不算注釋7行代碼就可以搞定

# 導入所需要的庫
import requests 
from bs4 import BeautifulSoup
url = 'http://tieba.baidu.com/p/4629627483' # 帖子地址
html = requests.get(url)  # 用 get 方法發送請求,返回 response 保存到變量 html
soup = BeautifulSoup(html.text, 'lxml') # 用 BeautifulSoup 庫解析網頁源代碼
for eve_url in soup.find_all('img', class_='BDE_Image'): # 在網頁源代碼中找到所有圖片地址
    print(eve_url['src']) # 打印出圖片地址

隨便打開一個鏈接驗證一下


第二步:保存圖片

在第一步中我們獲取到了每張圖片的地址,接下來我們就要保存這些圖片到我們的電腦中。
上一步我們只是獲取到了圖片的地址,還沒有保存,這里我們需要用一個列表來保存這些圖片的地址

# 導入所需要的庫
import requests 
from bs4 import BeautifulSoup
url = 'http://tieba.baidu.com/p/4629627483' # 帖子地址
html = requests.get(url)  # 用 get 方法發送請求,返回 response 保存到變量 html
soup = BeautifulSoup(html.text, 'lxml') # 用 BeautifulSoup 庫解析網頁源代碼
for eve_url in soup.find_all('img', class_='BDE_Image'): # 在網頁源代碼中找到所有圖片地址
    img_url_list = [] # 定義一個空列表,用于保存圖片地址
    img_url_list.append(eve_url['src']) # 將每張圖片的地址添加到列表當中

接下來就是要保存這些圖片了,直接看代碼

# 導入所需要的庫
import requests 
from bs4 import BeautifulSoup
url = 'http://tieba.baidu.com/p/4629627483' # 帖子地址
html = requests.get(url)  # 用 get 方法發送請求,返回 response 保存到變量 html
soup = BeautifulSoup(html.text, 'lxml') # 用 BeautifulSoup 庫解析網頁源代碼
for eve_url in soup.find_all('img', class_='BDE_Image'): # 在網頁源代碼中找到所有圖片地址
    img_url_list = [] # 定義一個空列表,用于保存圖片地址
    img_url_list.append(eve_url['src']) # 將每張圖片的地址添加到列表當中
    for eve_url in img_url_list:
        pic = requests.get(eve_url).content # 因為圖片是以二進制存儲的,所以這些要用 content
        with open(eve_url.split('/')[-1] + '.jpg', 'wb') as f: # 將圖片保存到文件根目錄
                f.write(pic) # 寫入圖片
                f.close()

運行完之后看一下文件根目錄,可以看到圖片已經被下載下來了。



是不是很簡單?
不過這里只下載了第一帖的圖片,還有第二頁,第三頁...如何下載?

翻頁功能

這里我們回到帖子第一頁,拉倒最下面點擊第二頁,觀察URL的變化


地址變為了 http://tieba.baidu.com/p/4629627483?pn=2
對比一下第一頁 http://tieba.baidu.com/p/4629627483
多了一個參數 pn
我們把 2 改為 3,是不是就可以跳轉到第三頁, 試一下

成功跳轉,這證明我們的猜想是正確的,那這就非常簡單了。
只需要將參數值修改一下,就可以實現翻頁功能。
直接看最后的代碼

# 導入所需要的庫
import requests 
from bs4 import BeautifulSoup
for i in range(3):
    url = 'http://tieba.baidu.com/p/4629627483' + '?pn=' + str(i) # 帖子地址
    html = requests.get(url)  # 用 get 方法發送請求,返回 response 保存到變量 html
    soup = BeautifulSoup(html.text, 'lxml') # 用 BeautifulSoup 庫解析網頁源代碼
    for eve_url in soup.find_all('img', class_='BDE_Image'): # 在網頁源代碼中找到所有圖片地址
        img_url_list = [] # 定義一個空列表,用于保存圖片地址
        img_url_list.append(eve_url['src']) # 將每張圖片的地址添加到列表當中
        for eve_url in img_url_list:
            pic = requests.get(eve_url).content # 因為圖片是以二進制存儲的,所以這些要用 content
            with open(eve_url.split('/')[-1], 'wb') as f: # 將圖片保存到文件根目錄
                    f.write(pic) # 寫入圖片
                    f.close()

到這里就結束了,其實這幾行代碼一點也不 Python。
可以把這些功能比如獲取網頁源代碼、保存圖片封裝成函數,在主函數里調用。
emmm,那我還是封裝一下吧,反正外賣也沒到。

import requests
from bs4 import BeautifulSoup

imgUrls =[] #存放所有圖片的URL

def get_Html_ImgUrl(url):
    '''
    獲取網頁的源代碼和圖片的地址
    存放在imgUrls這個列表里
    '''
    #獲取網頁源代碼
    headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
    html = requests.get(url, headers=headers)
    html.encoding = 'utf-8'
    soup = BeautifulSoup(html.text, 'lxml')
    #獲取圖片的地址并且存放在imgUrls列表里
    for i in soup.find_all('img', class_='BDE_Image'):
        imgUrls.append(i['src'])

def save_img():
    #保存圖片
    for i,url in enumerate(imgUrls):
        pic = requests.get(url).content
        with open('./'+str(i)+'.jpg', 'wb') as f:#保存至根目錄下
             f.write(pic)
def main():
    url = 'http://tieba.baidu.com/p/4629627483?pn='
    for i in range(3):
        try:
            get_Html_ImgUrl(url + str(i))
        except:
            pass
    save_img()

if __name__ == '__main__':
    main()

歡迎加入計算機技術協會

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,381評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,951評論 19 139
  • 一、 女孩子是水做的。 女孩子生下來就是被寵的。 女孩子要富養。 女孩子可以撒嬌。 女孩子可以膽小。 女孩子力氣小...
    花生牛奶醬醋茶閱讀 513評論 0 1
  • 于此第四年 破曉時離開 致我未及的欲望 與遺憾 我在圖書館巨大的玻璃幕墻后 翻來覆去地背誦 書本...
    一安焉閱讀 722評論 15 23