使用python抓取美女福利圖片

這篇文章干嘛的?

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

圖片站首頁(yè)

里面的美女露骨而不露點(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)始抓取
  1. 我們以 http://www.zngirls.com/rank/sum/ 為起始頁(yè)面進(jìn)行爬取,打開(kāi)網(wǎng)頁(yè)后右鍵查看源代碼。
    打開(kāi)這個(gè)url后,如圖1。我們需要關(guān)心的是紅色鏈接的內(nèi)容。

    圖1

  2. 這個(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)擊封面。

圖3

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

Paste_Image.png
開(kāi)始碼代碼吧

從上面的步驟我們整理一下思路,大概分為以下三部:

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ī)制。

反爬蟲(chóng)

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

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,835評(píng)論 6 427
  • 爬蟲(chóng)文章 in 簡(jiǎn)書(shū)程序員專(zhuān)題: like:128-Python 爬取落網(wǎng)音樂(lè) like:127-【圖文詳解】py...
    喜歡吃栗子閱讀 22,684評(píng)論 4 411
  • 今天比往天回家要晚些,在學(xué)校耽誤了一下,回家以最快的速度將飯菜弄好。今天特意給兒子弄了個(gè)回鍋肉,香香甜甜孩子很喜歡...
    燦爛陽(yáng)光1閱讀 261評(píng)論 0 4
  • 嶙峋走獸臥龍門(mén),狹道九折鎖天脊。 飛流喧喧白麟遠(yuǎn),塊壘方方翠云低。 古棧奇出忽見(jiàn)路,鐵鎖長(zhǎng)橫暗聞笛。 蟬聲唱遍懸飛...
    十年以期閱讀 594評(píng)論 0 0
  • 項(xiàng)目開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)有圖形,圖表的制作,用PHP自帶的制圖函數(shù)已經(jīng)不能滿足現(xiàn)在市場(chǎng)上的需求了。不會(huì)的小伙伴不用擔(dān)心...
    西貝巴巴閱讀 947評(píng)論 0 1

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