前言:這篇文章在大一剛入學的時候就完成了,當初剛入門 Python 爬蟲不久。現在回頭看看這代碼,寫得什么鬼屎玩意兒。趁著周六,把這代碼修改一下。
準備工作
環境
系統: Windows10 x64
編輯器: Vscode
需要的知識
這篇文章講的是 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()
歡迎加入計算機技術協會