Scrapy爬女神圖(一)—— 這是你們要的小姐姐

Scrapy第二篇: 多層次網頁爬取 | 圖片爬取

(先隨便放個封面圖)


看到這個標題,目測一大波老司機心里開始os:難道又是 妹子圖???
(我。。。我還能說什么)
89768193

寶寶的品位可不一般的好吧?。?!
這年代最流行什么呀?
當然是“女神”,“?;ā崩玻。。。~,說“網紅”的當我沒說。。)
顏值高,有范兒,關鍵氣質逆天對不對~

比如這樣:


這樣:


或者這樣:


這樣:


</br>
不錯吧?(嘿嘿據說最后這個還是我川的妹子~)心動不如行動,今天我們就用Scrapy把諸位女神收入囊中!
目標網站:唯一圖庫
搜索關鍵詞:?;?br>
唯一圖庫

一、步驟

1、首先分析網站
打開上面這個頁面


下拉就是各位MM的簡介
下拉到最底部就是這樣
第2頁

點完之后發現,真的只有6頁。


查看源代碼

隨便點擊進入某個主頁


查看源碼

看完第一個圖,來看后面的圖


第二個圖是這樣

第三個圖是這樣

可以看出規律了吧,皆是是 url=xxx+_n.html(n為1,2,3...)的結構,只要獲得前面那一串和最大頁數就可以構造了。

但是進一步分析就會發現,每個MM個人頁面內圖片的URL結構是不一樣的(這里也要注意),如下所示:



基本上無規律可循,不能構造出來,只能從源碼中獲取圖片真實鏈接

2、思路
用Scrapy爬取思路:
1)先獲取首頁siteURL,以及標題
2)然后由其進入MM個人頁面獲取最大頁數Num第一個圖片URL
3)構造每一個圖片地址pageURL
4)requests獲取源碼中具體原圖地址detailURL
5)獲取圖片并保存入文件,以1)中標題作為文件名

這里就涉及到了多層次頁面爬取的問題
怎么辦呢,不要忘了,可以用meta傳參數。

二、代碼

首先來看整個項目的文件結構
以為沒有本項目用到middlewares中間件,所以刪去了


entrypoint是一個設置,使得程序可以在IDE中運行。
只需要調用entrypoint即可運行程序

from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'XiaoHua'])

來看具體分塊代碼實現:

1、items部分
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy

class XiaohuaItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field() 
    siteURL=scrapy.Field() #首頁中各MM的URL
    pageURL=scrapy.Field() #每一張圖片入口URL
    detailURL=scrapy.Field() #圖片原圖地址
    title=scrapy.Field()  #MM標題
    fileName=scrapy.Field() #文件夾名,每一個MM一個文件夾
    path=scrapy.Field()  #圖片存儲路徑(絕對路徑)

</br>

2、settings部分
# -*- coding: utf-8 -*-
# Scrapy settings for XiaoHua project

BOT_NAME = 'XiaoHua'
SPIDER_MODULES = ['XiaoHua.spiders']
NEWSPIDER_MODULE = 'XiaoHua.spiders'

#是否遵循機器人規則
ROBOTSTXT_OBEY = False
#默認是16,一次可以請求的最大次數
CONCURRENT_REQUESTS=32
#下載延遲
DOWNLOAD_DELAY=0.1
#Cookies設置
COOKIES_ENABLED = False
#headers設置
DEFAULT_REQUEST_HEADERS = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate, sdch',
'Accept-Language':'zh-CN,zh;q=0.8',
'Cache-Control':'max-age=0',
'Connection':'keep-alive',
'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}

#管道設置
ITEM_PIPELINES = {'XiaoHua.pipelines.XiaohuaPipeline': 300}

</br>

3、spiders部分
# --coding:utf-8--
import scrapy
from XiaoHua.items import XiaohuaItem
from scrapy.http import Request
import requests
import re
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

class Myspider(scrapy.Spider):
    name='XiaoHua'
    allowed_domains=['mmonly.cc']
    base=r'F:/Desktop/code/info/XiaoHua/'
    def start_requests(self):
        #一共有6頁
        for i in range(1,7):
            url='https://www.mmonly.cc/tag/xh1/'+str(i)+'.html'
            yield Request(url,callback=self.parse_one)

    def parse_one(self,response):
        #創建一個大的list存儲所有的item
        items=[]
        pattern=re.compile(r'<div class="title".*?<a.*?href="(.*?)">(.*?)</a></span></div>',re.S)
        mains=re.findall(pattern,response.text)
        for main in mains:
            #創建實例,并轉化為字典
            item=XiaohuaItem()
            item['siteURL']=main[0]
            item['title']=main[1]
            item['fileName']=self.base+item['title']
            items.append(item)

        for item in items:
            #創建文件夾
            fileName=item['fileName']
            if not os.path.exists(fileName):
                os.makedirs(fileName)
            #用meta傳入下一層
            yield Request(url=item['siteURL'],meta={'item1':item},callback=self.parse_two)

    def parse_two(self,response):
        #傳入上面的item1
        item2=response.meta['item1']
        source=requests.get(response.url)
        html=source.text.encode('utf-8')
        #用正則提取頁數
        pattern=re.compile(r'共(.*?)頁',re.S)
        Num=re.search(pattern,html).group(1)
        items=[]
        for i in range(1,int(Num)+1):
            #注意這里,創建實例的位置
            item=XiaohuaItem()
            item['fileName']=item2['fileName']
            #構造每一個圖片的存儲路徑
            item['path']=item['fileName']+'/'+str(i)+'.jpg'
            #構造每一個圖片入口鏈接,以獲取源碼中的原圖鏈接
            item['pageURL']=response.url[:-5]+'_'+str(i)+'.html'
            items.append(item)
        for item in items:
            yield Request(url=item['pageURL'],meta={'item2':item},callback=self.parse_three)

    def parse_three(self,response):
        item=XiaohuaItem()
        #傳入上面的item2
        item3=response.meta['item2']
        #匹配正則獲取圖片真實地址detailURL
        pattern=re.compile(r'<li class="pic-down h-pic-down"><a target="_blank" class="down-btn" href=\'(.*?)\'>.*?</a>',re.S)
        URL=re.search(pattern,response.text).group(1)
        item['detailURL']=URL
        item['path']=item3['path']
        item['fileName']=item3['fileName']
        yield item

</br>

4、pipelines部分
# -*- coding: utf-8 -*-
import requests
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

#用requests的get方法獲取圖片并保存入文件
class XiaohuaPipeline(object):
    def process_item(self, item, spider):
        detailURL=item['detailURL']
        path=item['path']
        fileName=item['fileName']

        image=requests.get(detailURL)
        f=open(path,'wb')
        f.write(image.content)
        f.close()
        print u'正在保存圖片:',detailURL
        print u'圖片路徑:',path
        print u'文件:',fileName
        return item

寫完代碼,直接調用entrypoint即可在IDE中運行(我用的Pycharm)
這個小項目我也放到github上了:https://github.com/LUCY78765580/Python-web-scraping/tree/master/XiaoHua (如果您覺得有幫助,可以star我喲~)

三、結果

最后結果就是這樣的:



一共抓取圖片2114張

文件是這樣
隨便打開是這樣

</br>

四、參考:

meta傳參這一塊,參考了博客:
http://www.lxweimin.com/p/c77c59aa4b92

五、我分享我快樂

這里是你們要的小姐姐_

百度網盤https://pan.baidu.com/s/1bpxPRen
密碼:25gq

下載下來稍稍解壓即可,不用太感謝(順手點個贊就行),我是造福人類的小天使~
</br>

六、總結

最后,總結本篇關鍵:
1、Scrapy爬取多級網頁結構(主要用meta傳遞數據)
2、Scrapy爬取圖片的一般方法(別的方法放下次討論)
對了,不知各位有沒有發現,我們在爬唯一圖庫時,竟然如此順利,沒有遇到任何反爬。感嘆:良心網站呀

970168903

本篇就是這樣啦~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,761評論 25 708
  • scrapy學習筆記(有示例版) 我的博客 scrapy學習筆記1.使用scrapy1.1創建工程1.2創建爬蟲模...
    陳思煜閱讀 12,758評論 4 46
  • scrapy是python最有名的爬蟲框架之一,可以很方便的進行web抓取,并且提供了很強的定制型,這里記錄簡單學...
    bomo閱讀 2,157評論 1 11
  • 文|小閔 這里是五月之夏,初秋漸涼,讓我們越來越喜歡賴在被窩里,這樣的天氣適合睡懶覺,也適合回憶過去。 撥一通電話...
    五月之夏電臺閱讀 378評論 0 3
  • 太值得思考的一段話! 1、送醫院的人沒死,治幾個月人死了,你說是治好了,還是治死了? 2、糖尿?。洪_始一個...
    佳人_在水一方18閱讀 182評論 0 0