清明節(jié)宅在家里,學爬蟲纺且,試著用python爬取www.meizitu.com這個網(wǎng)站中的美少女圖片。用了python3以及requests,BeautifulSoup,multiprocessing這些包稍浆。
1.嘗試分析载碌,得到圖片url
首先打開該網(wǎng)站,點擊右鍵衅枫,查看網(wǎng)頁源代碼嫁艇。或者通過requests查看首頁內容弦撩。
import requests
from bs4 import BeautifulSoup
url='www.meizitu.com'
response=requests.get(url)
soup=BeautifulSoup(response.content,'lxml')
分析soup步咪,我們看到其中有圖片的連接,還有連接到其他網(wǎng)頁的url益楼,通過BeautifulSoup得到他們(BeautifulSoup的介紹猾漫,請看Beautiful Soup 4.2.0 文檔
webs=soup.find_all('a',target='_blank')
此時webs類似list,能通過index來調用其中的元素感凤,而每一個元素都類似字典
webs[0]['href']#得到url
而經過分析悯周,我們知道,圖片的url能通過類似方法獲得
soup.find_all('img')[0]['src']
2.嘗試保存圖片
photoUrl='http://pic.meizitu.com/wp-content/uploads/2016a/02/26/01.jpg'
photo = requests.get(pict_url)
with open(,'wb') as newfile:? #圖片輸出
? ? newfile.write(picture.content)
另外我們發(fā)現(xiàn)所以圖片的url都是統(tǒng)一的命名格式陪竿,所以我們可以通過拆解圖片的url提取字符串作為圖片名稱
photoStoreName=photoUrl.split('uploads')[1]
保存圖片
with open(photoStoreName,'wb') as newfile:? #圖片輸出
? ? ?newfile.write(photo.content)
3.整體框架
用偽代碼將整個爬蟲框架BFS介紹下:
stack=deque() #deque來自collections這個包禽翼,將還沒爬過的url加入其中
nameSet=set() ?#將保存過的圖片加入其中
visited=set() #將已經爬過的網(wǎng)頁url加入其中
while stack:?
? ? url=stack.popleft()
? ? response =requests.get(url)
? ? visited.add(url)
? ? soup= BeautifulSoup(response.content,'lxml')
? ? 分析soup,得到網(wǎng)頁url還有圖片族跛,如果網(wǎng)頁url不在visited中闰挡,則加入stack;如果圖片的名稱不在nameSet中礁哄,則保存圖片长酗,并將該名字加入nameSet
4.多進程
前三步其實已經可以爬取圖片了,但是圖片非常多(我自己由于網(wǎng)速限制姐仅,沒爬完花枫,只爬了6000多張刻盐,已經營養(yǎng)不良了),所以采取多進程的方法來爬劳翰。python的multiprocessing的pool敦锌,非常好用。
5. 最后代碼
有V1,V2,V3三個版本佳簸,V1簡單實現(xiàn)了爬取圖片乙墙,V2實現(xiàn)了單線程爬取全部圖片,V3實現(xiàn)了多進程爬取全部圖片生均。V3多進程的實現(xiàn)听想,應該還存在點小問題,如果各位有什么想法马胧,歡迎私信聯(lián)系我汉买。