本次要爬取的網站是:
先上代碼:
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
