首頁  >  文章  >  後端開發  >  python爬蟲[一] 大量下載妹子圖

python爬蟲[一] 大量下載妹子圖

PHPz
PHPz原創
2017-04-04 10:49:545089瀏覽

煎蛋網上的女孩圖專題有著品質很高的美女圖片,今天分享一下用python 批次下載這些妹子圖的方法。了解python 的基本語法,對這篇文章來說,你只要知道如何操作

list

,

for

……in……,如何定義函數就夠了。 ulSoup4。 ##  pip install beautifulsoup4回車運行

##出現Successfully installed 之類的提示訊息就表示安裝已完成。 #ome 和firefox。千多個網頁上的所有圖片,首先你要學會下載一個網頁:)。 練習下載的網址url 是:jandan.net/ooxx/page-2397#comments. 使用chrome 或firefox瀏覽器開啟後,滑鼠右鍵-查看網頁原始碼。位址就包含在這些原始程式碼中,那麼第一步就是下載這些html程式碼。

python爬蟲[一] 大量下載妹子圖

截取了部分程式碼

#使用python 自帶庫urllib.request 來下載網頁。

    import urllib.request    url = 'http://jandan.net/ooxx/page-2397#comments'

## res = urllib.request.urlopen(url)

urllib.request.urlopen()這個函數是幹嘛的呢?  如它的名字一樣,它可以用來打開一個 url 。它既可以接受一個str(我們傳的就是),也可以接受一個 Request物件。這個函數的回傳值

總是可以像 context manager 樣工作的對象,並且自帶 geturl()、info()、getcode()等方法。


其實我們不用管那麼多,只需要記住這個函數可以接受一個網址,然後返回給我們一個包含這個網址所有資訊的物件就行了,我們對這個物件進行操作。

python爬蟲[一] 大量下載妹子圖


現在把 res 物件中的 html程式碼讀出來賦給

變數

html。使用res.read()方法。

html = res.read()python爬蟲[一] 大量下載妹子圖

這時,html中儲存的就是 html原始碼了!


試著

print

(html)



#截取了部分程式碼。

這時你發現結果和滑鼠右鍵-查看網頁原始碼出現的內容不太一樣。原來read()方法的回傳值是 n bytes…這是什麼鬼? 好吧,其實我們是可以解析這個回傳值並得到圖片地址的。但如果你想要得到和瀏覽器中看到的一樣的html 程式碼,可以將上一行程式碼改為 html = res.read().decode('utf-8')

然後print(html)


python爬蟲[一] 大量下載妹子圖


截取了部分程式碼。

OK!一樣了,這是因為 read()的decode('utf-8')可以把read()的回傳值以utf-8編碼。但我們仍使用 html = res.read(),因為其中同樣包含我們需要的資訊。

到目前為止我們只用了4行 python 程式碼,就把網頁 http://jandan.net/ooxx/page-2397#comments  的html程式碼下載儲存到變數html中了。如下:

import urllib.request

#下載網頁

url = 'http://jandan.net/ooxx/page-2397# comments'

res = urllib.request.urlopen(url)

html = res.read()

##二.解析出位址

#下面,使用beautifulsoup4 解析html。 如何確定某張圖片對應的html程式碼在哪裡呢?在該網頁上滑鼠右鍵-檢查。這時左半螢幕是原網頁,右半螢幕是html程式碼和一堆功能

按鈕


python爬蟲[一] 大量下載妹子圖


#Elements 左邊有個選擇箭頭,點選一下變成藍色,再點擊左邊網頁中的圖片,就可以看到右邊html程式碼中自動高亮了一部分程式碼。這部分程式碼就是這張圖片對應的html代碼!這個箭頭就是用來定位網頁中某元素對應的程式碼的。

python爬蟲[一] 大量下載妹子圖


#仔細看這段程式碼:可以看到

src="//wx2.sinaimg.cn/mw600/66b3de17gy1fdrf0wcuscj20p60zktad.jpg"

部分就是這張圖片的位址,src 就是source。 src後面的 style則是它的樣式,不用管它。這時你可以試驗一下,在src前加入http:,造訪http://wx2.sinaimg.cn/mw600/66b3de17gy1fdrf0wcuscj20p60zktad.jpg應該就能看到原來的圖片了。

所以,src對應的內容就是我們需要的圖片連結位址。注意看圖片中,src和圖片位址連結、style和max-width等是類似  

key

-value的對應關係。這與後面提取圖片的地址所用的方法有關。 看其他圖片對應的程式碼,可以看到它們的格式都是一樣的,也就是都包含在

中。


使用BeautifulSoup()解析html。除了傳入html,我們也傳了一個'html.parser'參數,這表示我們希望 BeautifulSoup()函數以html的解析方式來解析變數html。 parser是句法分析的意思。

soup = BeautifulSoup(html,'html.parser')

##這行程式碼將html解析成一個soup物件。我們可以很方便地對這個物件進行操作。例如只提取包含'img'的文字內容:


result = soup.find_all('img')

用find_all()方法。

print(result)可以看到result是一個列表,每個元素都是src-圖片位址鍵值對,只不過包含 等我們不需要的內容。


python爬蟲[一] 大量下載妹子圖


#地截取了部分程式碼。

使用get方法把雙引號中的位址提取出來,並在開頭加上 http:。


links=[]

for content in result:

    links.append

('http:'+content .get('src'))

content.get('src')就是在content中取得鍵src所對應的值,即雙引號中的位址。

links.append()是常見的在清單中新增元素的方法。

print(links)可以看到這個清單裡每個元素都是原來雙引號中的圖片位址。如下圖:


python爬蟲[一] 大量下載妹子圖


# 截取了部分程式碼


使用瀏覽器開啟任何一個位址都能看到對應的圖片! YO!這說明我們就差最後一步了,下載它們!

提取地址部分就完成了。程式碼也是相當的簡潔,如下:###

#解析網頁

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'html.parser')

result = soup. find_all('img')

links=[]

for content in result:

    links.append('http:'+content.get('src') )

三.下載圖片

最後就是依序存取links中的位址,把圖片下載下來!

在開頭

 import os

#先建立photo資料夾存放下載的圖片,以下程式碼會將photo資料夾建立在這個程式. py檔案所在的位置。

if not os.path.exists('photo'):

    os.makedirs('photo')

我們知道links是個列表,所以最好使用循環來一個一個下載、命名、存放。



i=0

for link in links:

i+=1

    filename ='photo\\'+'photo'+str(i)+'.png'

    with open(filename,'w ') as file:

        urllib.request.urlretrieve(link,filename)

i是循環變量,i+=1是控制循環的語句。

filename為圖片命名,但其實是先建立一個具有此名稱的文件,然後把圖片寫進去。從filename的賦值語句可以看出,'photo\\'說明它位於photo資料夾,後面的'photo'+str(i)則是為了有序,全下載完後會是photo1,photo2,photo3這樣的感覺~ '.png'是後綴。用 + 號連接字串在python中也是常用的做法。

with這兩行語句,將 link中的位址指向的圖片取得到本地,然後存入 filename 。

open(filename,'w'),開啟filename這個資料夾,'w'表示開啟方式是 write 寫入。也就是說在這裡open()接受了兩個參數,一個是檔名(檔路徑),一個是開啟方式。

urllib.request.urlretrieve(link,filename) 的功能是訪問 link 這個鏈接,然後取回一份拷貝放入 filename中。

3部分都寫完後,點擊運行!就能在.py檔案所在路徑發現photo資料夾,裡面全是我們下載的圖片啦~


python爬蟲[一] 大量下載妹子圖



##完整程式碼如下:

import urllib.request

from bs4 import BeautifulSoup

#import os

#下載網頁

url = 'http://jandan.net/ooxx/page-2397#comments'

res = urllib.request.urlopen(url)

#html = res.read()

#解析網頁

soup = BeautifulSoup(html,'html.parser')

result = soup.find_all('img ')

links=[]

for content in result:

#    links.append('http:'+content.get('src'))

#下載並儲存圖片

if not os.path.exists('photo'):

    os.makedirs('photo')

#i=0

for link in links:

    i+=1

    filename ='photo\\'+'photo'+str(i)+'.png'

    with open(filename,'w') as file:

###        urllib.request.urlretrieve(link,filename)#########這個小程式算是面向過程的寫法吧,從上到下,也沒有定義函數。這樣可能對剛入門的新手更易懂一些。 ######妹子圖的連結######http://jandan.net/ooxx/page-2397#comments 只有中間的數字會在1-2XXX間變化。 #########url = 'http://jandan.net/ooxx/page-'+str(i)+'#comments'#########改變i 的值就能批量下載了。可是有評論說頻繁的訪問該網站可能會被封 IP,這點我也不懂,請自行嘗試! ###

以上是python爬蟲[一] 大量下載妹子圖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn