仙女姐姐@chuu chloe和@什么七七——python圖片爬蟲
兩年以前用爬蟲爬過一個學校網(wǎng)站逼友,現(xiàn)在忘得那是一干二凈榴嗅∧赐铮可不成想周偎,望著眾多的美女圖片,我竟然也會有嫌麻煩的時候撑帖∪乜玻或許我應該說,是眼前這讓人眼花繚亂目不暇接的美好胡嘿,讓我感嘆時間的寶貴蛉艾,想要迅速將她們“一網(wǎng)打盡”,我找到高分chrome插件衷敌,卻發(fā)現(xiàn)這些插件只能下載部分圖片勿侯,于是我從頭撿起爬蟲,寫下這篇整理性的文章缴罗。沒有需求助琐,哪來的學習的動力?
最簡單的爬蟲
首先必須說的是面氓,我不需要寫那種一爬爬全站的爬蟲兵钮,我只看好看的XD。這次看到的是這位chuu chloe姐姐舌界,大家或許見過掘譬,絕對一見傾心的那種。爬的網(wǎng)站是我時不時逛逛的宅男吧禀横,上面有時會有高質量的圖屁药。我沒有大量爬圖,不會對網(wǎng)站產(chǎn)生什么影響。目標網(wǎng)址:http://zhainanba.net/21483.html酿箭。貼一張目標截圖:
我第一眼看到這位姐姐复亏,就看呆了,已經(jīng)說不出話來缭嫡。我想說缔御,看到她我好像看到了無人的純白雪山——她值得我為她寫一個爬蟲。
初次嘗試
爬蟲重要的不是代碼妇蛀,而是分析網(wǎng)頁的方法耕突。老規(guī)矩F12進行審查。
很快注意到圖片的url是由數(shù)字結尾评架,按尾數(shù)進行循環(huán)便能將這些圖全爬下來眷茁。首先只寫這么一個簡單的規(guī)則找點感覺。
### 如果url規(guī)則簡單到能一眼看出纵诞,直接用簡單的版本上祈。b
# 導入常用的爬蟲包
import urllib.request
import re
import os
import requests
# 定義一個路徑函數(shù),用來確定保存圖片的路徑
targetDir = input('圖片存儲路徑')
def destFile(path):
if not os.path.isdir(targetDir): # 如果路徑不存在則創(chuàng)建
os.mkdir(targetDir)
pos = path.rindex('/') # 以最后一個斜杠后的字符作為圖片名稱
t = os.path.join(targetDir,path[pos+1:])
return t
fail_url = [] # 這個列表是為了記錄下之后可能出現(xiàn)的超時情況
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Referer': 'http://zhainanba.net/21483.html'}
注意到我這里的header里寫了referer浙芙,第一次寫沒有寫referer登刺,是我小看了這個網(wǎng)站,我以為他不會有反爬措施嗡呼,沒想到還是采用了基本的反爬纸俭。。南窗。referer簡單來說就是標識“你是從哪個網(wǎng)站來到這個網(wǎng)站的”揍很,如果不加referer的話會報404(推薦寫header時把能加的信息都加上)。
爬蟲代碼
下面寫爬蟲體万伤。我加了一個超時處理的步驟女轿,因為在運行時發(fā)現(xiàn)有些圖片在request時會卡住,可能網(wǎng)站有進一步的反爬措施壕翩,具體的之后得檢查源碼才能看出是網(wǎng)絡問題還是有反爬機制。
if __name__ == "__main__":
for i in range(1,31,1): # 爬尾號為1 - 30 的所有圖片
i = str(i)
if len(i) < 2: # 之前注意到url中尾數(shù)小于10都補了零傅寡,這里也用簡單的判斷補上
i = '0' + i
else:
pass
link = 'http://ac.meijiecao.net/ac/img/znb/meizitu/20190611_meizitu_' + i + '.jpg' # 爬取的圖片url
print(link)
try:
r = requests.get(link,headers = header,timeout=(10,10)) # 用timeout和try來防止超時
filename = destFile(link)
if r.status_code == 200: # 響應碼為200時才進行寫入放妈,304和404都不寫
open(filename,'wb').write(r.content)
print(r.status_code,'Sucess!')
del r
else:
print(r.status_code,'Fail.')
pass
except:
print(link,'Timeout.')
fail_url.append(link) # 將超時的url加入列表
pass
運行結果如下:
因為圖片有水印,這里也不便于直接放出荐操,給出鏈接:鏈接: https://pan.baidu.com/s/1leTJLlw8mm7AVlP_hb9ATg 提取碼: 16ti
再戰(zhàn):采用BeautifulSoup
老是去查看url的尾數(shù)也不是長久之計芜抒,很多url都不規(guī)則,不可能每一次都去找規(guī)律托启,所以用網(wǎng)頁解析器才是正道宅倒。簡單的parser我選BeautifulSoup。bs4的全面用法我推薦Beautiful Soup 4.4.0 文檔屯耸。這次換一個爬拐迁,@什么七七 這位小姐姐也是一位仙女蹭劈。
# parse html with bs4, urls from zhainanba
from urllib import request
from bs4 import BeautifulSoup
fail_url = []
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Referer':'http://zhainanba.net/tag/%e7%bd%91%e7%bb%9c%e7%ba%a2%e4%ba%ba'} # referer和url需要自己更改,懂的都懂线召,不懂只能查
targetDir = input('圖片存儲路徑')
def getHTMLcode(url):
re_url = request.Request(url,headers=header)
page_code = request.urlopen(re_url).read()
return page_code.decode('utf8')
def getImg(page_code):
soup = BeautifulSoup(page_code,'html.parser')
image_list = soup.find(attrs={'class':'article-content'}) # 查看源碼可知所有的圖片都在article-content
image = image_list.find_all('img') # 圖片在article-content下的img里
for img in image:
img_url = img.get('src') # 圖片的url在src里
print(img_url)
try:
r = requests.get(img_url,headers = header,timeout=(10,10)) # 用timeout和try來防止超時
filename = destFile(img_url)
if r.status_code == 200: # 響應碼為200時才進行寫入铺韧,304和404都不寫
open(filename,'wb').write(r.content)
print(r.status_code,'Sucess!')
del r
else:
print(r.status_code,'Fail.')
pass
except:
print(img_url,'Timeout.')
fail_url.append(img_url)
pass
url = 'http://zhainanba.net/22631.html'
page_code = getHTMLcode(url)
getImg(page_code)
結果如下:
也分享在網(wǎng)盤里:
鏈接: https://pan.baidu.com/s/1jot8BkVSVB9JT-599fZSDA 提取碼: bp63
總結
寫爬蟲不僅是為了短時間獲得自己想獲得的東西,也是為了以后的一些小項目做準備缓淹。其中的一個想法是哈打,如果要訓練仙女們的臉部模型,大批量的照片必不可少讯壶,所以之后可能要挑戰(zhàn)sina的反爬機制料仗,或者找一些圖量大的網(wǎng)站琢磨一下。這個過程中伏蚊,肯定會積累很多的優(yōu)質圖片立轧,不只有仙女,還會有那些不太上得了臺面的東西丙挽,我就不說了肺孵,我挺相信我的眼光的。