因为发现网站数据结构和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'