ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## soxs的网站图片都是无效的我们这次拿笔趣阁来试 * **书写一个item用于给文件下载管道传输参数** 这个主要两个参数一个图片url一个文件名 `items.py`文件 ``` import scrapy class ImgItem(scrapy.Item): src = scrapy.Field() fileName = scrapy.Field() ``` * **获取url链接和书名** 这个很简单就不细说了 `spiders/xbiquge.py` ``` import scrapy import re from ..items import ImgItem class xbiqugeSpider(scrapy.Spider): name = 'xbiquge' allowed_domains = ['www.xbiquge.la'] # 定义只爬取变量内的网站 start_urls = ["https://www.xbiquge.la/"]# 定义爬取的url, def parse(self, response): # 爬虫启动后进入parse方法 list = response.xpath("//div[@id='hotcontent']/div/div") for i in list: url = i.xpath('div/a/img/@src').extract_first() name = i.xpath('div/a/img/@alt').extract_first() fileName = name+"."+re.search(".([a-z|A-Z]*?)$",url).group(1) item = ImgItem() #实例化item item['src'] = url item['fileName'] = fileName print("进入管道。。。") yield item # 通过管道保存 ``` * **开启管道** 在`setting.py`中添加如下配置 这里demo是项目名,ImgImagesPipeline是类名,根据自己实际情况改 ``` ITEM_PIPELINES = { 'demo.pipelines.ImgImagesPipeline': 300, } ``` * **书写管道** 文件的写法是可以固定的,如果想研究原理可以细看,不想的话直接复制就能用 这个类是我自己写的,可能会有bug 【文件名不可重复,否则报错,没做细节】 ``` import scrapy from scrapy.exceptions import DropItem import json import os from scrapy.pipelines.images import ImagesPipeline IMGFILEPATH = os.path.dirname(os.path.abspath(__file__))+ "/img/" # 图片下载管道 class ImgImagesPipeline(ImagesPipeline): # 返回 图片链接对象 def get_media_requests(self, item, info): print("in Img download ...") image_url = item['src'] yield scrapy.Request(url=image_url) # 下载完成处理文件 def item_completed(self, results, item, info): global IMGFILEPATH if results[0][0] == True: url = results[0][1]['url'] strurl = "["+url+"]" print(strurl + " \n => 图片下载成功。。。") print(" => " + results[0][1]['path'] + " >>> " + item['fileName']+" \n") # 判断文件是否存在 if os.path.isfile(IMGFILEPATH + results[0][1]['path']): # 重命名 os.rename(IMGFILEPATH + results[0][1]['path'] , IMGFILEPATH + item['fileName']) # 在这里可以自定义代码,用于处理数据。 # 比如向数据库保存文件名下载状态等 return results print( "["+item['src']+"] \n => 文件url无法访问 404 ... \n") return results ``` ![](https://img.kancloud.cn/d3/93/d39318b410d2fe892475afad0bde04f1_897x516.png) ![](https://img.kancloud.cn/0e/2a/0e2ab6047bf893accdbc88d2527cc805_689x233.png)