#製作爬蟲的基本步驟
一般來說,製作一個爬蟲需要分成以下幾個步驟:
分析需求(對,需求分析非常重要,不要告訴我你老師沒教你)
分析網頁原始碼,配合F12(沒有F12那麼亂的網頁原始碼,你想看死我?)
寫正規表示式或XPath表達式(就是前面說的那個神器)
#運行:
恩,讓我輸入關鍵字,讓我想想,輸入什麼好?好像有點暴露愛好了。
Enter
#好像開始下載了!好讚! ,我看看下載的圖片,哇瞬間我感覺我又補充了很多表情包....
#好了,差不多就是這麼個東西。
需求分析
」最好還能自動下載"
…這就是需求,好了,我們開始分析需求,至少要實現兩個功能,一是搜尋圖片,二是自動下載。首先,搜尋圖片,最容易想到的就是爬百度圖片的結果,好,那我們就上百度圖片看看
##基本上就是這樣,還挺漂亮的。
我們試著搜一個東西,我打一個暴字,出來一系列搜尋結果,這說明什麼....
隨便找一個回車
好了,我們已經看到了很多圖片了,如果我們能把這裡面的圖片都爬下來就好了。我們看見網址裡有關鍵字資訊
我們試著在網址直接換下關鍵字,跳轉了有沒有!
這樣,可以透過這個網址找出特定的關鍵字的圖片,所以理論上,我們可以不用開啟網頁就能搜尋特定的圖片了。下個問題就是如何實現自動下載,其實利用之前的知識,我們知道可以用request,獲取圖片的網址,然後把它爬下來,保存成.jpg就行了。
分析網頁
好了,我們開始做下一步,分析網頁原始碼。這裡 我先切換回傳統頁面,為什麼要這樣做,因為目前百度圖片採用的是瀑布流模式,動態載入圖片,處理起來很麻煩,傳統的翻頁介面就好很多了。
這裡還一個技巧,就是:能爬手機版就不要爬電腦版,因為手機版的程式碼很清晰,很容易取得需要的內容。
好了,切換回傳統版本了,還是有頁碼的看的舒服。
我們點選右鍵,檢視原始碼
#這都是什麼鬼,怎麼可能看清楚! !
###這時候,就要用F12了,開發者工具!我們回到上一頁面,按F12,出來下面這個工具欄,我們需要用的就是左上角那個東西,一個是滑鼠跟隨,一個是切換手機版本,都對我們很有用。我們這裡用第一個###
然后选择你想看源代码的地方,就可以发现,下面的代码区自动定位到了这个位置,是不是很NB!
我们复制这个地址
然后到刚才的乱七八糟的源代码里搜索一下,发现它的位置了!(小样!我还找不到你!)但是这里我们又疑惑了,这个图片怎么有这么多地址,到底用哪个呢?我们可以看到有thumbURL,middleURL,hoverURL,objURL
通过分析可以知道,前面两个是缩小的版本,hover是鼠标移动过后显示的版本,objURL应该是我们需要的,不信可以打开这几个网址看看,发现obj那个最大最清晰。
好了,找到了图片位置,我们就开始分析它的代码。我看看是不是所有的objURL全是图片
貌似都是以.jpg格式结尾的,那应该跑不了了,我们可以看到搜索出61条,说明应该有61个图片
通过前面的学习,写出如下的一条正则表达式不难把?
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
好了,正式开始编写爬虫代码了。这里我们就用了2个包,一个是正则,一个是requests包,之前也介绍过了,没看的回去看!
#-*- coding:utf-8 -*-import reimport requests
然后我们把刚才的网址粘过来,传入requests,然后把正则表达式写好
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA' html = requests.get(url).text pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
理论有很多图片,所以要循环,我们打印出结果来看看,然后用request获取网址,这里由于有些图片可能存在网址打不开的情况,加个5秒超时控制。
pic_url = re.findall('"objURL":"(.*?)",',html,re.S) i = 0for each in pic_url:print eachtry: pic= requests.get(each, timeout=10)except requests.exceptions.ConnectionError:print '【错误】当前图片无法下载'continue
好了,再就是把网址保存下来,我们在事先在当前目录建立一个picture目录,把图片都放进去,命名的时候,用数字命名把
string = 'pictures\\'+str(i) + '.jpg' fp = open(string,'wb') fp.write(pic.content) fp.close() i += 1
整个代码就是这样:
#-*- coding:utf-8 -*- import re import requests url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1460997499750_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%B0%8F%E9%BB%84%E4%BA%BA'html = requests.get(url).text pic_url = re.findall('"objURL":"(.*?)",',html,re.S)i = 0for each in pic_url: print each try: pic= requests.get(each, timeout=10) except requests.exceptions.ConnectionError: print '【错误】当前图片无法下载' continue string = 'pictures\\'+str(i) + '.jpg' fp = open(string,'wb') fp.write(pic.content) fp.close()i += 1
我们运行一下,看效果(什么你说这是什么IDE感觉很炫!?赶紧去装Pycharm,Pycharm的配置和使用看这个文章!)!
好了我们下载了58个图片,咦刚才不是应该是61个吗?
我们看,运行中出现了有一些图片下载不了
我们还看到有图片没显示出来,打开网址看,发现确实没了。
所以,百度有些图片它缓存到了自己的机器上,所以你还能看见,但是实际连接已经失效
好了,现在自动下载问题解决了,那根据关键词搜索图片呢?只要改url就行了,我这里把代码写下来了
word = raw_input("Input key word: ") url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+word+'&ct=201326592&v=flip'result = requests.get(url)
好了,享受你第一个图片下载爬虫吧!!当然不只能下载百度的图片拉,依葫芦画瓢,你现在应该做很多事情了,比如爬取头像,爬淘宝展示图,或是...美女图片,捂脸。一切都凭客官你的想象了,当然,作为爬虫的第一个实例,虽然纯用request已经能解决很多问题了,但是效率还是不够高,如果想要高效爬取大量数据,还是用scrapy吧
以上是利用python5分鐘做個圖片自動下載器的詳細內容。更多資訊請關注PHP中文網其他相關文章!