基于scrapy爬取字符串类型的数据和爬取图片类型的数据区别?
字符串:只需要基于xpath进行解析且提交管道进行持久化存储。图片:xpath解析出图片src的属性值,单独的对图片地址发起请求获取图片二进制类型的数据。只需要将img的src的属性值进行解析,提交到管道,管道就会对图片的src的属性值进行请求发送,并且获取图片的二进制类型的数据且还可以实现持久化存储。
爬取http://sc.chinaz.com/tupian/的高清图片
创建工程:scrapy startproject imgsPro 进入imgsPro创建spiders:scrapy genspider img www.xxx.com
打开抓包工具,发现图片在img的src属性中 但下方的img标签中还有src2属性
知识点: src是可视化界面可实际展示的,src2是伪属性,用于滑动滚轮时动态加载图片。由于我们在爬取该网站时,并没有可视化界面展示,因此解析数据时使用的是src2伪属性来获取图片地址。
settings.py
USER_AGENT = 'Mozilla/... ROBOTSTXT_OBEY = False ITEM_PIPELINES = { # 'imgsPro.pipelines.ImgsproPipeline': 300, 'imgsPro.pipelines.imgsPipleLine': 300, } IMAGES_STORE = './imgs_biubiu'img.py
import scrapy from imgsPro.items import ImgsproItem class ImgSpider(scrapy.Spider): name = 'img' allowed_domains = ['www.xxx.com'] start_urls = ['http://sc.chinaz.com/tupian/'] def parse(self, response): div_list = response.xpath('//*[@id="container"]/div') for div in div_list: #注意:解析时需适用伪属性 img_src = div.xpath('./div/a/img/@src2').extract_first() print(img_src) item = ImgsproItem() item['img_src'] = img_src yield itemitems.py
import scrapy class ImgsproItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() img_src = scrapy.Field()piplines.py中需要重写ImagesPipeline的类
from scrapy.pipelines.images import ImagesPipeline import scrapy class imgsPipleLine(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 def item_completed(self, results, item, info): #返回给下一个即将被执行的管道类 return item执行scrapy crawl img完成爬取