這篇文章干嘛的?
本屌在上網(wǎng)時(shí)偶然看到一個(gè)圖片網(wǎng)站,網(wǎng)站的尺度是這樣的:

里面的美女露骨而不露點(diǎn),簡(jiǎn)直是宅男福利。一時(shí)興起,決定將網(wǎng)站上的圖片down下來(lái)研究研究。正好最近在研究python,所以決定用這個(gè)抓取圖片存到本地,將圖片url存到 mongodb以防止以后用。
源碼項(xiàng)目github地址 : https://github.com/panacena/mmPictures/
爬蟲(chóng)初識(shí)
網(wǎng)絡(luò)爬蟲(chóng)(又被稱為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁(yè)追逐者),是一種按照一定的規(guī)則,自動(dòng)的抓取萬(wàn)維網(wǎng)信息的程序或者腳本。
要學(xué)習(xí)Python爬蟲(chóng),我們要學(xué)習(xí)的共有以下幾點(diǎn):
- Python基礎(chǔ)知識(shí)
- Python中urllib和urllib2庫(kù)的用法
- Python正則表達(dá)式
- Python爬蟲(chóng)框架Scrapy
- Python爬蟲(chóng)更高級(jí)的功能
當(dāng)然,我們今天暫時(shí)不需要使用框架進(jìn)行爬取,只用urllib2等庫(kù)進(jìn)行操作。其它的一些關(guān)于爬蟲(chóng)的一些基本信息,可以在這位大神的博客中學(xué)習(xí)到。學(xué)習(xí)爬蟲(chóng)點(diǎn)我。
開(kāi)始爬取
確定URL開(kāi)始抓取
-
我們以 http://www.zngirls.com/rank/sum/ 為起始頁(yè)面進(jìn)行爬取,打開(kāi)網(wǎng)頁(yè)后右鍵查看源代碼。
打開(kāi)這個(gè)url后,如圖1。我們需要關(guān)心的是紅色鏈接的內(nèi)容。
圖1 -
這個(gè)如何查找呢?如果你用的是360瀏覽器,在MM圖片那右擊,選擇“審查元素”。之后就可以查看到點(diǎn)擊MM頭像后跳轉(zhuǎn)的url地址和MM頭像的url地址 。圖2:
圖2
3 . 現(xiàn)在還是沒(méi)有看到寫(xiě)真的圖片,我們點(diǎn)擊MM的頭像,進(jìn)入到了下圖的頁(yè)面 http://www.zngirls.com/girl/21751/ 可以看到如圖3這個(gè)頁(yè)面也沒(méi)有寫(xiě)真的具體圖片,只是寫(xiě)真的封面集合。不急,我們繼續(xù)點(diǎn)擊封面。

4 . 點(diǎn)擊封面后,http://www.zngirls.com/g/19671/1.html 進(jìn)入的頁(yè)面就可以看到寫(xiě)真的具體圖片了。這時(shí)我們就可以爬取圖片地址了。當(dāng)然,這個(gè)也是分頁(yè)的,所以也需要獲取一共多少頁(yè)以及每一頁(yè)的url。

開(kāi)始碼代碼吧
從上面的步驟我們整理一下思路,大概分為以下三部:
- 第一步 從 http://www.zngirls.com/rank/sum/ 開(kāi)始抓取MM點(diǎn)擊頭像的鏈接(注意是分頁(yè)的)
- 第二部 從 http://www.zngirls.com/girl/21751/ 抓取每一個(gè)寫(xiě)真集合的鏈接(注意是分頁(yè)的)
- 第三部 從 http://www.zngirls.com/g/19671/1.html 在寫(xiě)真圖片的具體頁(yè)面抓取圖片(注意是分頁(yè)的)
1. 從起始頁(yè)面 http://www.zngirls.com/rank/sum/ 開(kāi)始首選先獲取分頁(yè)的頁(yè)數(shù)以及每一頁(yè)的url,方便下一步獲取點(diǎn)擊MM獲取專(zhuān)輯url地址。接著解析每一頁(yè)的html,獲取每一頁(yè)中點(diǎn)擊MM頭像后跳轉(zhuǎn)的專(zhuān)輯集合頁(yè)面。
"""
從起始頁(yè)面 http://www.zngirls.com/rank/sum/ 開(kāi)始獲取排名的頁(yè)數(shù)和每一頁(yè)的url
"""
def mmRankSum():
req = urllib2.Request("http://www.zngirls.com/rank/sum/", headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
#首先獲取頁(yè)碼數(shù),然后用循環(huán)的方式挨個(gè)解析每一個(gè)頁(yè)面
pages = htmlpath.xpath('//div[@class="pagesYY"]/div/a/@href')
for i in range( len(pages) -2 ):
pagesitem="http://www.zngirls.com/rank/sum/"+ pages[i]
mmRankitem(pagesitem)
"""
參數(shù) url : 分頁(yè)中每一頁(yè)的具體url地址
通過(guò)穿過(guò)來(lái)的參數(shù),使用 lxml和xpath 解析 html,獲取每一個(gè)MM寫(xiě)真專(zhuān)輯頁(yè)面的url
"""
def mmRankitem(url):
req = urllib2.Request(url, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
pages = htmlpath.xpath('//div[@class="rankli_imgdiv"]/a/@href')
for i in range(len(pages)):
print "http://www.zngirls.com/" + pages[i]+"album/"
getAlbums("http://www.zngirls.com/" + pages[i]+"/album/")
2. 從mmRankitem方法中獲取到的url中解析每一個(gè)MM寫(xiě)真專(zhuān)輯圖片的具體地址,也就是寫(xiě)真圖片列表的頁(yè)面。
"""
參數(shù) albumsurl: 每一個(gè)MM專(zhuān)輯的頁(yè)面地址
通過(guò)穿過(guò)來(lái)的參數(shù),獲取每一個(gè)MM寫(xiě)真專(zhuān)輯圖片集合的地址
"""
def getAlbums(girlUrl):
req = urllib2.Request(girlUrl, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
pages = htmlpath.xpath('//div[@class="igalleryli_div"]/a/@href')
for i in range(len(pages)):
print "http://www.zngirls.com/" + pages[i]
3. 從每一頁(yè)中獲取圖片的url,已經(jīng)每一張圖片的名稱,方便下一步進(jìn)行下載。
"""
參數(shù) url : 每一個(gè)MM寫(xiě)真專(zhuān)輯圖片集合的地址
通過(guò)穿過(guò)來(lái)的參數(shù),首先先獲取圖片集合的頁(yè)數(shù),然后每一頁(yè)解析寫(xiě)真圖片的真實(shí)地址
"""
def getPagePicturess(albumsurl):
req = urllib2.Request(albumsurl, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
pages = htmlpath.xpath('//div[@id="pages"]/a/@href')
for i in range(len(pages)-2):
savePictures("http://www.zngirls.com" + pages[i])
"""
參數(shù) url : 每一個(gè)MM寫(xiě)真專(zhuān)輯圖片集合的地址(進(jìn)過(guò)分頁(yè)檢測(cè))
通過(guò)穿過(guò)來(lái)的參數(shù),直接解析頁(yè)面,獲取寫(xiě)真圖片的地址,然后下載保存到本地。
"""
def savePictures(itemPagesurl):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
, "Connection": "keep-alive"
, "Referer": "image / webp, image / *, * / *;q = 0.8"
,"Accept":"image/webp,image/*,*/*;q=0.8"
}
req = urllib2.Request(itemPagesurl, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
print itemPagesurl
pages = htmlpath.xpath('//div[@class="gallery_wrapper"]/ul/img/@src')
for i in range(len(pages) ):
print pages[i]
pciturelist.append(pages[i])
4 .獲取每張圖片的url,可每張照片的名稱,然后下載到本地。
"""
參數(shù) url : 每一個(gè)MM寫(xiě)真專(zhuān)輯圖片集合的地址(進(jìn)過(guò)分頁(yè)檢測(cè))
通過(guò)穿過(guò)來(lái)的參數(shù),直接解析頁(yè)面,獲取寫(xiě)真圖片的地址,然后下載保存到本地。
"""
def savePictures(itemPagesurl):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
, "Connection": "keep-alive"
, "Referer": "image / webp, image / *, * / *;q = 0.8"
,"Accept":"image/webp,image/*,*/*;q=0.8"
}
req = urllib2.Request(itemPagesurl, headers=header)
html = urllib2.urlopen(req)
htmldata = html.read()
htmlpath = etree.HTML(htmldata)
print itemPagesurl
pages = htmlpath.xpath('//div[@class="gallery_wrapper"]/ul/img/@src')
names = htmlpath.xpath('//div[@class="gallery_wrapper"]/ul/img/@alt')
for i in range(len(pages) ):
print pages[i]
pciturelist.append(pages[i])
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
, "Connection": "keep-alive"
, "Referer": pages[i]
}
req = urllib2.Request(pages[i], headers=headers)
urlhtml = urllib2.urlopen(req)
respHtml = urlhtml.read()
binfile = open('%s.jpg' % ( names[i] ) , "wb")
binfile.write(respHtml);
binfile.close();
5. 執(zhí)行完畢后(時(shí)間可能會(huì)比較長(zhǎng)),就可以在文件夾里面看到一張一張的圖片都下載完畢。再這里注意的是防止出現(xiàn)反爬蟲(chóng),可以用設(shè)置header或者代理等方式。

沒(méi)有設(shè)置一些header等參數(shù)時(shí),有時(shí)會(huì)出現(xiàn)如下這種情況,這種情況應(yīng)該是網(wǎng)站有反爬蟲(chóng)的機(jī)制。

源碼項(xiàng)目github地址 : https://github.com/panacena/mmPictures/
這是本人學(xué)習(xí)python后寫(xiě)的一個(gè)小例子。代碼寫(xiě)的很爛。以后會(huì)學(xué)習(xí)Scrapy等框架然后在重新重構(gòu)一下代碼。希望可以給個(gè)star~~~。
下載完后的圖片大概有36228 張圖片。

