本次要爬取的網站是:
先上代碼:
import requests from bs4 import BeautifulSoup import os import re def getHtmlurl(url): try: r = requests.get(url) r.raise_for_status() # 有效的判斷網絡連接的狀態。如果網連接出現錯誤,那么它就會用try-except來獲取一個異常。 r.encoding = r.apparent_encoding # 設置編碼格式為 從內容中分析出的相應內容編碼方式 return r.text except: return "出現異常" def getimgurl(img): href = img['href'] url = "http://www.netbian.com" + href htm = getHtmlurl(url) soup = BeautifulSoup(htm, 'html.parser') # htm 表示被解析的html格式的內容 # html.parser表示解析用的解析器 return soup def getpic(html): soup = BeautifulSoup(html, 'html.parser') all_img = soup.find('div', class_='list').find('ul').find_all("a", attrs={'href': re.compile('^((?!http).)*$'), 'target': '_blank'}) for img in all_img: title = img['title'] if title.find(u"女") != -1: # 你可以自定義規則來篩選你想要的壁紙 print("不符合要求,跳過") continue soup1 = getimgurl(img) im1 = soup1.find('div', id='main').find('div', class_='endpage').find('p').find('img') img_url = im1['src'] print(img_url) root = 'D:/pictest2/' # 這是你要保存圖片的位置 t = title.split() # 將圖片title按空格分開,取第一個空格前的字符作為圖片名,這個你可以自己調整 path = root + t[0] + '.jpg' try: if not os.path.exists(root): os.mkdir(root) if not os.path.exists(path): r = requests.get(img_url) with open(path, 'wb') as f: f.write(r.content) f.close() print('文件保存成功') else: print('文件已存在') except Exception as e: print(str(e)) print('爬取失敗') def getNextpage(html): soup = BeautifulSoup(html, 'html.parser') nextpage = soup.find('div', class_='list').find('ul').find('li', class_='nextpage').find('a') href = nextpage['href'] url = "http://www.netbian.com" + href return url def main(): url = 'http://www.netbian.com/weimei/index.htm' for i in range(1, 10): html = getHtmlurl(url) print(str(i) + " : ") getpic(html) url = getNextpage(html) if __name__ == '__main__': main()
☞現在我們來分析一下爬取壁紙的步驟:
從做事步驟來看
-
查看網頁的源代碼,挖掘其特征,找出自己要爬取的部分,對於我們的壁紙爬取,找到的就是圖片的網址
-
下載該網址的圖片到本地文件中
從編寫代碼來看
-
得到網頁全部源代碼
-
從源代碼中找到自己要的部分,並想法將它提取出來
-
將圖片下載到本地
☞知道我們的目的和思路后,我們來編寫代碼
-
我們要先得到網頁的全部源代碼,這里需要用到我們的requests庫
def getHtmlurl(url): try: r = requests.get(url) r.raise_for_status() # 有效的判斷網絡連接的狀態。如果網連接出現錯誤,那么它就會用try-except來獲取一個異常。 r.encoding = r.apparent_encoding # 設置編碼格式為 從內容中分析出的相應內容編碼方式 return r.text except: return "出現異常"
其中requests.get(url)得到的就是網頁代碼的全部內容,如下截圖:
-
在代碼中我們所要的就是圖片的網址
我們觀察這些代碼,發現圖片都在這里面
不過要注意,網站下拉最后一個不是圖片,而是下一頁的網址
所以我們在提取的時候要把這最后一個給過濾出去,觀察它們<a>標簽的不同,可以看出它們有一個顯著的區別,就是一個有target標簽,一個沒有
所以我們可以這樣過濾:
all_img = soup.find('div', class_='list').find('ul').find_all("a", attrs={'target': '_blank'})
這里還有一個要過濾的,如下所示,他點開展示的是另外一組圖片
比較它們的區別,可以看到它們的href一個里面包括http,一個不包括,所以我們可以這樣過濾
soup = BeautifulSoup(html, 'html.parser') all_img = soup.find('div', class_='list').find('ul').find_all("a", attrs={'href': re.compile('^((?!http).)*$'),'target': '_blank'})
這樣我們就得到了我們想要的部分,不過事情沒有那么簡單,如果我們點開img標簽里的網址,我們得到的並不是一個高清大圖,於是我們繼續深入內里
進入<a>標簽中的網址,或者直接點擊圖片,然后我們研究一下跳轉后的頁面的源代碼
現在我們要得到這個img標簽里的網址,還是用我們的BeautifulSoup:
soup1 = 通過前一個網頁的a標簽里的地址得到這個跳轉后網頁的全部代碼 im1 = soup1.find('div', id='main').find('div', class_='endpage').find('p').find('img')
從上面這代碼中,我們看出,我們需要通過上一個網頁中的a標簽來得到這個跳轉后的頁面的網址,從而通過BeautifulSoup得到這個頁面的全部內容,這里我定義了一個方法,傳入參數為上一個頁面<a>標簽里的內容
def getimgurl(img): href = img['href'] # 這里我們需要拼一下串,因為a標簽里的網址不是完整的 url = "http://www.netbian.com" + href htm = getHtmlurl(url) soup = BeautifulSoup(htm, 'html.parser') # htm 表示被解析的html格式的內容 # html.parser表示解析用的解析器 return soup
-
現在,我們已經離成功不遠了,我們得到了圖片的網址,現在只要下載下來保存到本地即可
title = img['title'] root = 'D:/pictest/' # 這是你要保存圖片的位置 t = title.split() # 將圖片title按空格分開,取第一個空格前的字符作為圖片名,這個你可以自己調整 path = root + t[0] + '.jpg' try: if not os.path.exists(root): os.mkdir(root) if not os.path.exists(path): r = requests.get(img_url) with open(path, 'wb') as f: f.write(r.content) f.close() print('文件保存成功') else: print('文件已存在') except Exception as e: print(str(e)) print('爬取失敗')
這樣我們的入門級爬蟲就完成啦,根據個人愛好,你還可以進行壁紙的篩選,譬如我不要美女的壁紙,那我可以這樣做
if title.find(u"女") != -1: # 你可以自定義規則來篩選你想要的壁紙 print("不符合要求,跳過") continue
聽完解釋后,再去看一遍源碼吧,相信你就有自己打出來的能力了!!!(其中的getNextpage方法的作用是得到下一頁的網址,相信你們自己已經可以看懂啦)
最終結果如下:
參考文章:https://blog.csdn.net/xuelucky/article/details/81217906