Python 3 实战Scrapy爬取美女壁纸图

作者: Anomaly | 来源:发表于2017-07-12 22:28 被阅读0次

    简介

    之前写了一篇爬妹子图的文章《Python 3 实战Scrapy爬取妹子图》,但是有点粗糙,几乎都是无差别抓取页面所有图片和链接然后过滤,这篇文章优化了代码,让我们的爬虫更高效,爬取的图片质量更高,这里我选了一个妹子图非常多、质量非常高、又很正经的壁纸网站来实验,这里是爬取页面入口->,点击查看

    1.一级页面分析

    打开F12分析了这个页面,你会发现这个页面很简单,分页都给你写清楚了多少页,主体页面是一个div+css结构,列表用了ul+li标签:


    Screenshot from 2017-07-12 22-08-13.png

    用一句xpath表达式就能获取到li标签里面所有的a链接地址,高效而且无多余的链接

     # 一级页面的处理函数
        def parse(self, response):
            # 提取界面所有的符合入口条件的url
            all_urls = response.xpath('//div[@class="main"]/ul/li/a/@href').extract()
            # 遍历获得的url,继续爬取
            for url in all_urls:
                # urljoin生成完整url地址
                url = urljoin(response.url, url)
                yield Request(url, callback=self.parse_img)
    

    2.二级页面分析

    当我们点击一个美女图片之后会进去一个二级页面,这个页面的才是这个美女的所有图片合集,这个页面比较简单:


    Screenshot from 2017-07-12 22-16-35.png
    # 二级页面的处理函数
        def parse_img(self, response):
            item = PicscrapyItem()
            # 提前页面符合条件的图片地址
            item['image_urls'] = response.xpath('//img[@id="bigImg"]/@src').extract()
            yield item
            # 提取界面所有复合条件的url
            all_urls = response.xpath('//ul[@id="showImg"]/li/a/@href').extract()
            # 遍历获得的url,继续爬取
            for url in all_urls:
                url = urljoin(response.url, url)
                yield Request(url, callback=self.parse_img)
    

    通过parse和parse_img这两个函数的递归调用就可以获取所有符合条件的图片,基本上不会访问多余的链接,下载多余的图片...
    另外下载图片的时候做了一些优化,之前图片名称是随机生成,现在改成取url一部分加随机数,这样同一个妹子的图片就可以放到一起了,不会乱七八糟了,方法是重写父类函数

     # 重写函数,修改了下载图片名称的生成规则,改成了url地址的最后一个加了随机送
        def file_path(self, request, response=None, info=None):
            if not isinstance(request, Request):
                url = request
            else:
                url = request.url
            url = urlparse(url)
            img_name = url.path.split('/')[5].split('.')[0] + '-' + str(random.randint(1000, 9999))
            return '%s.jpg' % img_name
    

    总结

    经过优化后,100M宽带轻轻松松跑满,目测这个页面应该有上万张图片,童鞋,你的硬盘吃的消吗?

    Screenshot from 2017-07-12 23-34-50.png
    Github地址如下:点击获取代码

    相关文章

      网友评论

        本文标题:Python 3 实战Scrapy爬取美女壁纸图

        本文链接:https://www.haomeiwen.com/subject/gbdihxtx.html