大部分小程序都是基于py2.7的,我于是便想直接出一個(gè)py3.4最新版本的教程。大致看一下第一篇了解一下的一些概念性的東西以及bs4第三方庫的使用。請(qǐng)參考文末。
我們的第一個(gè)小程序的相關(guān)要求:
目標(biāo):抓取一個(gè)網(wǎng)站的兩千張搞笑圖片。(本文先下載一張,多張的處理在這個(gè)過程中會(huì)出現(xiàn)一些麻煩,所以以后再說)
需要的工具:chrome瀏覽器,python3,第三方庫BS4。Notepad++。至于安裝方法,請(qǐng)移步到這里。
當(dāng)然,實(shí)現(xiàn)一個(gè)非常牛逼的爬蟲的理想是遠(yuǎn)大的,但是我們?cè)谂苤?,先要自己好好的修煉一下基本功——先從獲取一張圖片開始。
我們發(fā)現(xiàn)這個(gè)網(wǎng)站比較符合我的要求。
http://www.76xh.com/tupian/1174.html
我們打開一個(gè)網(wǎng)頁,按下f12,研究一番以后,發(fā)現(xiàn)如下規(guī)律。
- 每一個(gè)網(wǎng)頁有一張圖片。其圖片質(zhì)量不算高。
- 由于是一個(gè)網(wǎng)址對(duì)應(yīng)一個(gè)圖片地址,
而且網(wǎng)址鏈接有這樣子的規(guī)律。
http://www.76xh.com/tupian/1174.html
。。。
http://www.76xh.com/tupian/3111.html
也就是我們可以從上面的鏈接中下載相關(guān)的html文件,進(jìn)而我們從html這個(gè)文件中提取出相關(guān)圖片的鏈接。接著把相關(guān)的圖片內(nèi)部數(shù)據(jù)下載到內(nèi)存中,接著寫成相關(guān)文件放在硬盤中。
由此看來,我們的獲取一張圖片的步驟分成這樣的幾步。
S1.發(fā)起含有圖片鏈接的html。(urllib.request)
S2.解析出圖片地址(通過bs4這個(gè)強(qiáng)大的html解析工具)
S3.發(fā)起圖片數(shù)據(jù)的請(qǐng)求(urllib.request)
S4.把圖片保存下來。(os)
我們從這個(gè)鏈接開始講起。打開IDLE,調(diào)整成shell模式,逐行輸入
from bs4 import BeautifulSoup
import os,urllib.request
pageUrl = 'http://www.76xh.com/tupian/1111.html'
htmlDoc = urllib.request.urlopen(pageUrl).read()
這條命令將鏈接的請(qǐng)求內(nèi)容返回到htmlDoc
我們可以用print(htmlDoc)不過強(qiáng)力不推薦這種方法輸出,太慢了.強(qiáng)烈建議另一種BeautifulSoup的prettify方法
打印出來的東西依稀可以看出這東西的確是html文件的具體內(nèi)容。
當(dāng)然,我們要這一堆垃圾是沒有用的,我們要從中解析出所需的圖片。用chrome瀏覽器打開相關(guān)網(wǎng)頁,然后看到圖片右擊點(diǎn)擊審查元素。我們?cè)谶@里可以看出我們的具體鏈接位置。
這里采用的是相對(duì)地址,
<img src="/d/file/middle/c/483368.jpg" data-bd-imgshare-binded="1">
身在遠(yuǎn)程的我們只能通過絕對(duì)地址來訪問。
http://www.76xh.com/d/file/middle/c/483368.jpg
而這個(gè)相對(duì)鏈接
/d/file/middle/c/483368.jpg則是藏在深深地html角落里,怎么獲?。课依諅€(gè)去,我總不能使用查找字符串的方式來查找這東西吧。正則表達(dá)式完全不懂啊有木有!
好吧,我們既然暫時(shí)沒有辦法使用正則表達(dá)式。那么我們猜想一下,會(huì)不會(huì)有這么一個(gè)第三方庫之類的東西是專門用來操作這個(gè)html文件,進(jìn)而提取其中的數(shù)據(jù)呢的呢?
有的,BeautifulSoup4.安裝以及介紹方法請(qǐng)移步。
輸入
Soup = BeautifulSoup(htmlDoc)
將htmlDoc的所有內(nèi)容轉(zhuǎn)換成BeautifulSoup對(duì)象,
我們這個(gè)時(shí)候可以輸入
Print(soup.prettify())
查看格式化的html文件。
輸入
soup.find_all("div",class_="pic_text")
我們便可以將我們需要的圖片鏈接大致范圍確定下來了。
Find_all返回一個(gè)list。
接著我們使用下面兩行代碼
divHtml = soup.find_all("div",class_="pic_text")
imgUrl = 'http://www.76xh.com' + divHtml[0].img.attrs['src']
輸入以上代碼便可以提取出我們需要的圖片鏈接??梢詐rint看一下內(nèi)容
這時(shí)候我們發(fā)現(xiàn)了一件事情。就是html文檔的標(biāo)題可以用來做文件名。
于是請(qǐng)求,保存下來。
data = urllib.request.urlopen(imgUrl).read()
fileName = soup.title.contents[0] + '.jpg'
filePath = os.path.join('C:/img',fileName)
image = open(filePath,'wb')
image.write(data)
image.close()
所有有效代碼如下。
【自寫小腳本-抓取【www.76xh.com】V0.1.py】-只能抓取一張圖片
pageUrl = 'http://www.76xh.com/tupian/1111.html'
htmlDoc = urllib.request.urlopen(pageUrl).read()
soup = BeautifulSoup(htmlDoc)
#print (soup.prettify())
#print ("正在下載第(%d)"%(i))
divHtml = soup.find_all("div",class_="pic_text")
imgUrl = 'http://www.76xh.com' + divHtml[0].img.attrs['src']
data = urllib.request.urlopen(imgUrl).read()
fileName = soup.title.contents[0] + '.jpg'
filePath = os.path.join('C:/img',fileName)
image = open(filePath,'wb')
image.write(data)
image.close()