scrapy爬取站长素材网中的高清图片

因为发现网站数据结构和bobo老师讲的不一样了,所以记录下代码,但是更细节的创建项目/执行爬虫文件等就不写了

主文件代码

import scrapy
from imgsPro.items import ImgsproItem

class ImgSpider(scrapy.Spider):
    name = "img"
    # allowed_domains = ["www.xxx.com"]
    start_urls = ["https://sc.chinaz.com/tupian/"]

    def detail_parse(self,response):
        img_src = 'https:'+ response.xpath('/html/body/div[3]/div[1]/div[1]/div[2]/div[2]/img/@src').extract_first()
        item = ImgsproItem()
        item['img_src'] = img_src

        yield item

        # print(img_src)
    def parse(self, response):
        # 解析图片地址
        # 通过抓包工具检查到图片地址不是动态加载的,所以可以直接解析到
        div_list = response.xpath('/html/body/div[3]/div[2]/div')
        for div in div_list:
            # 要使用伪属性
            detail_url = 'https://sc.chinaz.com' + div.xpath('./div/a/@href').extract_first()
            # print(detail_url)
            # img_src = 'https:' + div.xpath('./img/@src').extract_first()
            # 这样直接解析图片网址解析不到,输出结果是:https:../static/common/com_images/img-loding.png
            # 原因:只有在屏幕上显示出来的图片的src才是//scpic.chinaz.net/files/default/imgs/2023-09-19/f58400c3933d1a18_s.jpg,其他没有加载出来的图片的src是:../static/common/com_images/img-loding.png 但是就算是显示出来的图片,爬取到的src也是https:../static/common/com_images/img-loding.png样子
            # 现在的网站和老师演示的不一样,反爬机制好像还是懒加载,但是我找不到那个是伪属性,不过发现div下面有个标签下的网址中包含图片,因此采用先获取这个网址的url,再在这个url中获得图片的src
            # 需要手动传参
            yield scrapy.Request(detail_url,callback=self.detail_parse)




重写管道文件代码

# 我们自己封装一个图片的管道类
from scrapy.pipelines.images import ImagesPipeline
import scrapy

class imgsPlipeline(ImagesPipeline):
    # 重写父类方法
    # 可以根据图片地址进行图片的请求
    def get_media_requests(self, item, info):
        yield scrapy.Request(item['img_src'])

    # 指定图片存储的路径
    def file_path(self,request,response=None,info=None):
        imgName = request.url.split('/')[-1]
        return imgName
        # 图片存储路径要在配置文件setting中设定一下

    def item_completed(self, results, item, info):
        return item # 返回给下一个被执行的管道类

设置setting配置文件

# 指定图片存储的目录
IMAGES_STORE = './IMGS'
# 打开指定的管道
ITEM_PIPELINES = {
   "imgsPro.pipelines.imgsPlipeline": 300,
}
# 其他设置
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.36"

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

LOG_LEVEL = 'ERROR'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值