用爬虫在网站上无限制的批量爬取图片
當(dāng)我們需要在網(wǎng)站上大量下載某種圖片類型的時(shí)候,使用手動(dòng)點(diǎn)擊圖片進(jìn)行保存的形式既費(fèi)時(shí)又費(fèi)力,選擇用爬蟲來獲取海量圖片會(huì)極大的方便我們獲取圖片數(shù)據(jù)這一過程。
一.選擇有反爬蟲機(jī)制的網(wǎng)站進(jìn)行爬取
我們最常見的圖片下載地址就是百度圖片了,但是百度擁有反爬蟲機(jī)制,網(wǎng)上很多爬蟲程序在一頁上只能爬取30張圖片,而且百度頁面沒有分頁,網(wǎng)址沒有頁數(shù)可以讓我們改,還好代碼里面留了翻頁流的網(wǎng)址,所以,現(xiàn)在來分享給大家。
import re import requests from urllib import error from bs4 import BeautifulSoup import os num = 0 numPicture = 0 file = '' List = [] def Find(url):global Listprint('正在檢測(cè)圖片總數(shù),請(qǐng)稍等.....')t = 0i = 1s = 0while t < 2000:Url = url + str(t)try:Result = requests.get(Url, timeout=7)except BaseException:t = t + 60continueelse:result = Result.textpic_url = re.findall('"objURL":"(.*?)",', result, re.S) # 先利用正則表達(dá)式找到圖片urls += len(pic_url)if len(pic_url) == 0:breakelse:List.append(pic_url)t = t + 60return s def recommend(url):Re = []try:html = requests.get(url)except error.HTTPError as e:returnelse:html.encoding = 'utf-8'bsObj = BeautifulSoup(html.text, 'html.parser')div = bsObj.find('div', id='topRS')if div is not None:listA = div.findAll('a')for i in listA:if i is not None:Re.append(i.get_text())return Re def dowmloadPicture(html, keyword):global num# t =0pic_url = re.findall('"objURL":"(.*?)",', html, re.S) # 先利用正則表達(dá)式找到圖片urlprint('找到關(guān)鍵詞:' + keyword + '的圖片,即將開始下載圖片...')for each in pic_url:print('正在下載第' + str(num + 1) + '張圖片,圖片地址:' + str(each))try:if each is not None:pic = requests.get(each, timeout=7)else:continueexcept BaseException:print('錯(cuò)誤,當(dāng)前圖片無法下載')continueelse:string = file + r'\\' + keyword + '_' + str(num) + '.jpg'fp = open(string, 'wb')fp.write(pic.content)fp.close()num += 1if num >= numPicture:return if __name__ == '__main__': # 主函數(shù)入口word = input("請(qǐng)輸入搜索關(guān)鍵詞(可以是人名,地名等): ")url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='#翻頁流的網(wǎng)址tot = Find(url)Recommend = recommend(url) # 記錄相關(guān)推薦print('經(jīng)過檢測(cè)%s類圖片共有%d張' % (word, tot))numPicture = int(input('請(qǐng)輸入想要下載的圖片數(shù)量 '))file = input('請(qǐng)建立一個(gè)存儲(chǔ)圖片的文件夾,輸入文件夾名稱即可')y = os.path.exists(file)if y == 1:print('該文件已存在,請(qǐng)重新輸入')file = input('請(qǐng)建立一個(gè)存儲(chǔ)圖片的文件夾,輸入文件夾名稱即可')os.mkdir(file)else:os.mkdir(file)t = 0tmp = urlwhile t < numPicture:try:url = tmp + str(t)result = requests.get(url, timeout=10)print(url)except error.HTTPError as e:print('網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)調(diào)整網(wǎng)絡(luò)后重試')t = t + 60else:dowmloadPicture(result.text, word)t = t + 60print('當(dāng)前搜索結(jié)束,感謝使用')print('猜你喜歡')for re in Recommend:print(re, end=' ')整個(gè)運(yùn)行臺(tái)的顯示如下(關(guān)鍵詞,下載數(shù)量,存儲(chǔ)文件夾由我們自己在運(yùn)行臺(tái)中輸入設(shè)置):
選擇批量爬取關(guān)鍵詞為“王凱”的圖片,選取了其中的兩張來展示。
二.選擇無反爬蟲機(jī)制的網(wǎng)站進(jìn)行爬取
除了百度圖片以外,還可以從其它的網(wǎng)站上進(jìn)行圖片爬取,比如:美桌,該網(wǎng)站并沒有robots協(xié)議,因此可以任意爬取。
我們可以對(duì)爬取的內(nèi)容進(jìn)行任意更改,比如說從美桌上爬取名為“靳東”的圖片。爬取過程中用到的第三方庫(kù)主要是requests和pypinyin(將漢字轉(zhuǎn)換成拼音),代碼如下
附上三張圖片
還是蠻帥氣的,哈哈
總結(jié)
以上是生活随笔為你收集整理的用爬虫在网站上无限制的批量爬取图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android将毫秒转换成日期,如何在A
- 下一篇: java回顾:MyBatis开发、配置、