scrapy 抓取墙纸

scrapy 抓取墙纸

郑重声明

郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。

首先抓包分析

在这里插入图片描述

url:aHR0cDovL3d3dy5uZXRiaWFuLmNvbS9pbmRleF8yLmh0bQ==

请求方式:get

查询参数:没有

请求头和cookie:没有加密参数

总结:没有反爬

使用scrapy shell 调试接口

  • 启动scrapy shell调试命令:scrapy shell url

测试获取页面所有图片链接
在这里插入图片描述

测试获取页面所有图片名称
在这里插入图片描述

测试获取下一页链接

在这里插入图片描述

爬虫源码

  • 启动爬虫 scrapy runspider 爬虫文件名.py
import os
import scrapy
from itemadapter import ItemAdapter
from scrapy.pipelines.images import ImagesPipeline


class ImageItem(scrapy.Item):
    '''item'''
    title = scrapy.Field()
    image_urls = scrapy.Field()


class ImgPipeline(ImagesPipeline):
    '''继承图片管道,方便自定义图片名称'''

    def get_media_requests(self, item, info):
        urls = ItemAdapter(item).get(self.images_urls_field, [])
        title = ItemAdapter(item).get('title')
        return [scrapy.Request(urls[u], meta={'item': title[u]}) for u in range(len(urls))]

    def file_path(self, request, response=None, info=None, *, item=None):
        # 自定义图片名称
        item = request.meta['item']
        return item['title'] + '.jpg'

    def item_completed(self, results, item, info):
        # 返回给下一个管道处理
        return item


class ImageSpider(scrapy.Spider):
    name = 'image'
    start_urls = ['aHR0cDovL3d3dy5uZXRiaWFuLmNvbS9pbmRleF8yLmh0bQ==']
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    # 设置
    custom_settings = {
        'ITEM_PIPELINES': {
            # 开启图片管道
            ImgPipeline: 301
        },
        # 图片保存地址
        'IMAGES_STORE': os.path.join(BASE_DIR, 'images'),
        # 图片的下载地址 根据item中的字段来设置哪一个内容需要被下载
        'IMAGES_URLS_FIELD': 'image_urls',
        # 下载延时,不要动他,避免对网站服务器造成压力,做一个礼貌的爬虫
        'DOWNLOAD_DELAY': 3
    }

    def parse(self, response):
        item = ImageItem()
        # 提取图片链接
        item['image_urls'] = response.xpath('//div[@class="list"]//img/@src').getall()
        # 提取图片名称
        item['title'] = response.xpath('//div[@class="list"]//img/@alt').getall()
        # 有一些图片链接是相对路径的,需要使用urljoin将其拼接完整
        item['image_urls'] = list(map(lambda x: response.urljoin(x), item['image_urls']))
        # 交给图片管道下载保存图片
        yield item
        # 翻页,follow_all是比scrapy.Request更为强大的请求构建方式
        yield from response.follow_all(
            xpath='//a[text()="下一页>"]', callback=self.parse)
            

完结撒花

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值