python小爬蟲抓取搞笑圖片

大部分小程序都是基于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ī)律。

  1. 每一個(gè)網(wǎng)頁有一張圖片。其圖片質(zhì)量不算高。
  2. 由于是一個(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.comV0.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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容