來自 《Python項目案例開發從入門到實戰》(清華大學出版社 鄭秋生 夏敏捷主編)中爬蟲應用——抓取百度圖片
本文使用 request 庫來爬取某個網站的圖片,前面幾章博客介紹了如何使用 urllib 庫來抓取網頁,本文主要使用的是 request 庫來抓取網頁內容,使用方法基本一致,但 request 方法相對簡單一些
爬蟲的基本思路別忘了:
1. 指定要抓取的鏈接然后抓取網站源代碼
2. 提取你想要的內容,比如你想要爬取圖片信息,可以選擇用正則表達式過濾或者使用提取 <img /> 標簽的方法
3. 循環得到的要爬取內容列表,保存文件
這里的代碼和本人博客前幾章(圖片爬蟲系列一)的差異在於:
1. 提取網頁使用的是 requests 庫
2. 保存圖片的時候后綴不固定使用 png 或者 jpg,而是使用圖片本身的后綴名
3. 保存圖片的時候不使用 urllib.request.urlretrieve 函數,而是使用文件的讀寫操作來保存圖片
具體代碼如下圖所示:
1 # 使用requests、bs4庫下載華僑大學主頁上的所有圖片
2 import os 3 import requests 4 from bs4 import BeautifulSoup 5 import shutil 6 from pathlib import Path # 關於文件路徑操作的庫,這里主要為了得到圖片后綴名
7
8
9 # 該方法傳入url,返回url的html的源代碼
10 def getHtmlCode(url): 11 # 偽裝請求的頭部來隱藏自己
12 headers = { 13 'User-Agent': 'MMozilla/5.0(Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0'
14 } 15 # 獲取網頁
16 r = requests.get(url, headers=headers) 17 # 指定網頁解析的編碼格式
18 r.encoding = 'UTF-8'
19 # 獲取url頁面的源代碼字符串文本
20 page = r.text 21 return page 22
23
24 # 該方法傳入html的源代碼,通過截取其中的img標簽,將圖片保存到本機
25 def getImg(page, localPath): 26 # 判斷文件夾是否存在,存在則刪除,最后都要重新新的文件夾
27 if os.path.exists(localPath): 28 shutil.rmtree(localPath) 29 os.mkdir(localPath) 30
31 # 按照Html格式解析頁面
32 soup = BeautifulSoup(page, 'html.parser') 33 # 返回的是一個包含所有img標簽的列表
34 imgList = soup.find_all('img') 35 x = 0 36 # 循環url列表
37 for imgUrl in imgList: 38 try: 39 # 得到img標簽中的src具體內容
40 imgUrl_src = imgUrl.get('src') 41 # 排除 src='' 的情況
42 if imgUrl_src != '': 43 print('正在下載第 %d : %s 張圖片' % (x+1, imgUrl_src)) 44 # 判斷圖片是否是從絕對路徑https開始,具體為什么這樣操作可以看下圖所示
45 if "https://" not in imgUrl_src: 46 m = 'https://www.hqu.edu.cn/' + imgUrl_src 47 print('正在下載: %s' % m) 48 # 獲取圖片
49 ir = requests.get(m) 50 else: 51 ir = requests.get(imgUrl_src) 52 # 設置Path變量,為了使用Pahtlib庫中的方法提取后綴名
53 p = Path(imgUrl_src) 54 # 得到后綴,返回的是如 '.jpg'
55 p_suffix = p.suffix 56 # 用write()方法寫入本地文件中,存儲的后綴名用原始的后綴名稱
57 open(localPath + str(x) + p_suffix, 'wb').write(ir.content) 58 x = x + 1
59 except: 60 continue
61
62
63 if __name__ == '__main__': 64 # 指定爬取圖片鏈接
65 url = 'https://www.hqu.edu.cn/index.htm'
66 # 指定存儲圖片路徑
67 localPath = './img/'
68 # 得到網頁源代碼
69 page = getHtmlCode(url) 70 # 保存圖片
71 getImg(page, localPath)
注意,為什么判斷圖片鏈接是否從 "https://" 開始主要是因為我們下載圖片需要完整的絕對路徑,而這個得來需要看原網頁代碼,選擇一張圖片,點擊 html 所在的代碼,鼠標放着,就可以看到絕對路徑,然后根據這個絕對路徑設置需要添加的缺少部分,如下圖所示: