必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-10-06 12:15:38来源:IT技术作者:seo实验室小编阅读:72次「手机版」
 

惹火

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

一、踩点

哪既然我们要爬大姑娘,那我们需要去踩个点,好了,先度娘一下:大姑娘,对不起,大姑娘图片没搜到,却意外收获了关于“大姑娘”不为人知的秘密:

百度这知道,真是惊世骇俗!这里的话大家可以换一种说法,大姑娘搜不到,你不妨试试:美女、女孩、女子……我们应该学会变通,试搜一下:美女!

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

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

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

二、明确需求

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

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

三、编写代码

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

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,看一下目录结构:

接下来,编写爬虫文件:

# -*- 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编写:

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

效果:

GitHub源码:GitHub源码

注意:代理!!

原文参考:点击打开链接

肯定不是我写的!!猥琐!

相关阅读

【SEO实战经验】电商网站推广经历分享

主要是因为SEO的路非常艰辛,菠菜公司的SEO更加困难,也很少有成功者将自己的推广历程、经验拿出来分享。由于各行各业都竞争激烈,大部

python实战笔记之(4):刷博客浏览量

看着自己写的文章浏览数一点一点增加是非常开心的,但总感觉浏览数增长地太慢了,于是自然想到,为什么不能写一个小程序自动刷博客浏览

架构师如何应对复杂业务场景?领域建模的实战案例解析

云栖君导读:你还在用面向对象的语言写面向过程的代码吗?你是否正在被复杂的业务逻辑折磨?是否有时觉得应用开发

Scrapy爬取globaltimes英语新闻站点

目标站点与分析 访问http://www.globaltimes.cn 站点,可以看到目标站点分为几大新闻板块,大板块下还有其他子板块,其中还包含了视频

Web实战:如何进行视频截图

各位读者大人们好,不知道各位读者大人们近来如何。由于前段时间事情比较多,文章的更新就给耽误了,项目需要上线经常加班,再加上自己的

分享到:

栏目导航

推荐阅读

热门阅读