【源码】Scrapy采花大盗小爬虫实战之:勾魂、酥胸、惹火、尤物……

时间:2018-06-11 20:12:11作者:scrapy中文网阅读:

温馨提示,若看完本文,还是无法正确运行,请关注公众号(左侧):scrapy中文网,回复:妹子下载,查看小白视频教程,获得10G妹子图片

scrapy图片下载
温馨提示:本scrapy 实战,教大家爬取整个妹纸网站,妹纸4000多,图片10W多,合计10G多数据量……故取名曰:《Scrapy采花大盗小爬虫实战之:勾魂、酥胸、惹火、尤物……》!好久不见,诸君见谅!日渐稀疏的更新,大概和为人夫、为人父的原因密不可分;因为成了人夫,所以要孝敬夫人;因为成了人父,所以要扶小人、而且还要擦屎粑粑……;无论是夫人还是扶人,都需要时间和精力……饼只有一个,却被分了99.99%,那剩下的0.001%就只有今天这篇scrapy 实战,希望诸位莫嫌弃,饼虽小,但味道狠beautiful、而且十分sex,这一期我带大家去爬几个:“大、姑娘”,请注意,“大”和“姑娘”之间是有个顿号的,虽然内涵段子真的断了子,但“内涵”不该“绝孙”,那“大”希望诸君不要往邪恶的地方想,肯定是数据量大呀,难道你想的是……

一、踩点

哪既然我们要爬大姑娘,那我们需要去踩个点,好了,先度娘一下:大姑娘,对不起,大姑娘图片没搜到,却意外收获了关于“大姑娘”不为人知的秘密:
scrapy 实战
百度这知道,真是惊世骇俗!这里的话大家可以换一种说法,大姑娘搜不到,你不妨试试:美女、女孩、女子……我们应该学会变通,试搜一下:美女!


看到没?换种说法,结果能改变人生!第一条结果果断不理睬,因为是百度自家的东西,靠关系排在头条,里面没多少高质量的东西,那第二条结果:www.mm131.com 就是凭本事排名的,里面应该都有诸君想要的东东,你不优秀,是不可能出头的,这条规则不仅适用于人事,也适于互联网,那就点进去一探究竟!

scrapy项目实战

可以看到,虽然不是狠高大上、但绝对的干净,比起你看的神马:…sese.com、xxx.com……全是赌博的闪图、弹窗……是不是狠舒服?好了,那我们就向TA下手,随便点开一个图片,看看她是怎么展现的:

scrapy采花大盗小爬虫
可以看到,站长还是有点别有用心,他不是把每一个妹子放在一个页面,而是把一个妹子的多张图片放在了多个页面,这样的好处当然是SEO,不然人家怎么会排在第一呢?


二、明确需求


侦查好网站,那接下来就需要明确需求,这一部分狠重要,关乎我们代码怎么写。比如我们要把这些数据拿去再做一个类似的网站或是APP,那照片你肯定需要归类,也就是A姑娘的所有靓照,你需要把它放一个文件夹;B姑娘的你需要放在B姑娘文件夹……这样的回报就是你在二次利用的时候灰常的方便;当然,如果你不想二次利用只是想一饱眼福,那不分类也行,把所有的图片都放在一个文件里,百花齐放,未免不是一种xing福。对比起来,第二种需求比较简单,我们只需要大概的看看这个网站的最终url,就可以大致确定图片的张数,然后累加就可以把大概的图片拿下来;这种方法简单,不多说;要玩就玩点难点的,横跨过大海的人,小河小沟也就不再话下了。那我们的目的就很明确了:把每一妹子的图片放入以标题命名的文件夹内,文件夹内的图片命名方式,1、2、3、4……递增排序,先把结果拿来给诸位看看:

scrapy采花大盗小爬虫

诸君请把眼光放在目录结构和文件命名上,至于内容,请忽略,如果可以的话!


三、编写代码


接下来开始编写代码,首先创建项目:
scrapy startproject Aoisolas

item.py编写


主要是定义我们要爬取的字段,其实这里就两个文件夹名称,图片url,代码如下:
import scrapy
class AoisolasItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    ImgUrl = scrapy.Field()
    pass

至于项目名称,我是这样命名的 Aoisola + s,Aoisola是神马意思?不知道?我也不知道……想一探究竟不如百度一下;接下来在spider目录下创建蜘蛛文件:AoiSolaSpider.py,看一下目录结构:

scrapy项目实战

接下来,编写蜘蛛文件:
# -*- coding: utf-8 -*-
import scrapy
from AoiSolas.items import AoisolasItem

class AoisolaspiderSpider(scrapy.Spider):
    name = "AoiSola"
    allowed_domains = ["www.mm131.com"]
    start_urls = ['http://www.mm131.com/xinggan/',
                  'http://www.mm131.com/qingchun/',
                  'http://www.mm131.com/xiaohua/',
                  'http://www.mm131.com/chemo/',
                  'http://www.mm131.com/qipao/',
                  'http://www.mm131.com/mingxing/'
                  ]

    def parse(self, response):
        list = response.css(".list-left dd:not(.page)")
        for img in list:
            imgname = img.css("a::text").extract_first()
            imgurl = img.css("a::attr(href)").extract_first()
            imgurl2 = str(imgurl)
            print(imgurl2)
            next_url = response.css(".page-en:nth-last-child(2)::attr(href)").extract_first()
            if next_url is not None:
                # 下一页
                yield response.follow(next_url, callback=self.parse)

            yield scrapy.Request(imgurl2, callback=self.content)

    def content(self, response):
        item = AoisolasItem()
        item['name'] = response.css(".content h5::text").extract_first()
        item['ImgUrl'] = response.css(".content-pic img::attr(src)").extract()
        yield item
        # 提取图片,存入文件夹
        # print(item['ImgUrl'])
        next_url = response.css(".page-ch:last-child::attr(href)").extract_first()

        if next_url is not None:
            # 下一页
            yield response.follow(next_url, callback=self.content)


图片下载中间件:pipelines.py编写:


这是scrapy 图片下载的核心,不熟悉scrapy 图片下载的小伙伴,可以查看文章:《scrapy图片下载》、《scrapy图片重命名放入不同目录》他们已经把scrapy图片下载的一切都扒光了,若不清楚scrapy图片下载、不妨去参观哈!还是直接上代码:
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem
from scrapy.http import Request
import re


class MyImagesPipeline(ImagesPipeline):

    #
    # def file_path(self, request, response=None, info=None):
    #     """
    #     :param request: 每一个图片下载管道请求
    #     :param response:
    #     :param info:
    #     :param strip :清洗Windows系统的文件夹非法字符,避免无法创建目录
    #     :return: 每套图的分类目录
    #     """
    #     item = request.meta['item']
    #     folder = item['name']
    #
    #     folder_strip = re.sub(r'[?\\*|“<>:/]', '', str(folder))
    #     image_guid = request.url.split('/')[-1]
    #     filename = u'full/{0}/{1}'.format(folder_strip, image_guid)
    #     return filename

    def get_media_requests(self, item, info):
        for image_url in item['ImgUrl']:
            yield Request(image_url,meta={'item':item['name']})

    def file_path(self, request, response=None, info=None):
        name = request.meta['item']
        # name = filter(lambda x: x not in '()0123456789', name)
        name = re.sub(r'[?\\*|“<>:/()0123456789]', '', name)
        image_guid = request.url.split('/')[-1]
        # name2 = request.url.split('/')[-2]
        filename = u'full/{0}/{1}'.format(name, image_guid)
        return filename
        # return 'full/%s' % (image_guid)

    def item_completed(self, results, item, info):
        image_path = [x['path'] for ok, x in results if ok]
        if not image_path:
            raise DropItem('Item contains no images')
        item['image_paths'] = image_path
        return item


setting.py设置:


爬虫写好、中间件也写好、别忘了设置启动中间件,还有图片需要下载了放那,都是setting的事,接下来设置哈:
# 设置图片存储路径
IMAGES_STORE = 'D:\meizi2'
#启动pipeline中间件
ITEM_PIPELINES = {
   'AoiSolas.pipelines.MyImagesPipeline': 300,
}


啰嗦几句,中间件的MyImages……你需要设置为你命名的,若你命名的不是和我的一样而设置的一样,那恭喜你肯定出错,这是很多小伙伴没注意到的地方,希望能引起你的重视!


经过这么几个步骤,按理说启动爬虫我们的图片就能乖乖躺在我们设置的目录里面的,爱你胃,其实并没有,我们惊讶的发现,里面没有妹子,只有腾讯的logo,神马鬼?接下来才是正真展示技术的时候,这也是本scrapy 实战最值得看的看点!若你的爬虫只能欺负一些没有反爬虫限制的网站,那你就像用枪指着手无寸铁的平民一样,算神马英雄?要欺负就欺负反爬虫网站,好了接下来就开始欺负她!


要想反反爬虫,你必须明白反爬虫技术实现的要点,如现在遇到的诡异情况,我们爬A站的图片,为神马会得到B站的logo,莫非冥冥之中我们练就了隔山打牛?其实不然,如果你真正运营过优质的网站,你就会明白这其实只是一种防盗链技术,简单的说防盗链就是为了防止A站把B站的资源直接拿去用,而做的一种阻止技术;就用这妹子网站来解释,本来这些妹子图片都是在妹子网站的服务器上,另一个网站看到做的不错,也想做一个,他就想把妹子网站的图片链接直接拿过来就可以了,这样的话图片是显示在自己网站,但处理图片的服务器却是妹子网站的,典型的损人利己!防盗链就是为了防止这么一种情况,让你盗链的链接不显示,呵呵……


那肿么破解呢?这里我们就需要知道防盗链的本质,其实很简单,防盗链的核心是判断你请求的地址是不是来自本服务器,若是,则给你图片,不是则不给,知道了这么一个原则我们就可以破解了,我们每下载一张图片都先伪造一个妹子服务器的请求,然后在下载,那它肯定会给你返回图片,于是我们就能顺利拿到图片!那问题的重点就归结为如何伪造请求地址,scrapy实现起来灰常简单,就是写一个Middleware,代码如下:

class AoisolasSpiderMiddleware(object):

    def process_request(self, request, spider):
        referer = request.url
        if referer:
            request.headers['referer'] = referer

就这么几行代码,就能轻松破解她的防盗链,然后别忘了在settings里面启动middleware,如下:

DOWNLOADER_MIDDLEWARES = {
   'AoiSolas.middlewares.AoisolasSpiderMiddleware': 1,
}

最后,运行蜘蛛:

scrapy crawl AoiSola

来看一下结果:

scrapy采花大盗小爬虫



最后送诸君半首诗:小撸怡情、大撸伤身、樯橹灰飞烟灭,据说是苏轼写的,看人家文采多好……



GitHub源码



相关文章