irpas技术客

利用Scrapy框架爬取汽车之家图片(详细)_sereasuesue

网络 5142

爬取结果

爬取步骤 创建爬虫文件

进入cmd命令模式下,进入想要存取爬虫代码的文件,我这里是进入e盘下的E:\pystudy\scraping文件夹内

C:\Users\wei>E: E:\>cd E:\pystudy\scraping E:\pystudy\scraping>scrapy startproject Bmw5 New Scrapy project 'Bmw5', using template directory 'f:\anaconda3\lib\site-packages\scrapy\templates\project', created in: E:\pystudy\scraping\Bmw5 You can start your first spider with: cd Bmw5 scrapy genspider example example.com E:\pystudy\scraping>cd Bmw5 E:\pystudy\scraping\Bmw5> scrapy genspider Bmw5_spider autohome.com Created spider 'Bmw5_spider' using template 'basic' in module: Bmw5.spiders.Bmw5_spider

2)打开pycharm,导入文件,效果如下

3)创建start.py文件,为了更好的运行爬虫

from scrapy import cmdline cmdline.execute("scrapy crawl Bmw5_spider".split()) #至此,start文件建立好

4)修改settings.py

ROBOTSTXT_OBEY = False

打开头文件并加入'User-Agent',修改如下

DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', }

取消注释 ITEM_PIPELINES

ITEM_PIPELINES = { 'Bmw5.pipelines.Bmw5Pipeline': 300, } ?主要程序 1 Bmw5Spider文件 import scrapy from Bmw5.items import Bmw5Item class Bmw5SpiderSpider(scrapy.Spider): name = 'Bmw5_spider' allowed_domains = ['autohome.com'] start_urls = ['https://car.autohome.com.cn/pic/series/65.html#pvareaid=2042194'] # 其中start_urls需要我们修改,打开汽车之家官网,按品牌找车--> 宝马 --> 宝马--> 图片 # 然后复制其地址,与原来的start_urls的参数替换即可 def parse(self, response): uiboxs = response.xpath("//div[@class='uibox']")[1:] for uibox in uiboxs: title = uibox.xpath(".//div[@class='uibox-title']/a/text()").get() urls = uibox.xpath(".//ul/li/a/img/@src").getall() urls = list(map(lambda url: response.urljoin(url), urls)) #print(urls) # # 后面这两行代码是需要编写完items.py后,才写的。 item = Bmw5Item(title=title,urls=urls) yield item 2item文件 import scrapy class Bmw5Item(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() urls = scrapy.Field() 3 pipelines.py处理数据 # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html import os from urllib import request # useful for handling different item types with a single interface from itemadapter import ItemAdapter class Bmw5Pipeline: def __init__(self): self.path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'images') if not os.path.exists(self.path): os.mkdir(self.path) def process_item(self, item, spider): title = item['title'] urls = item['urls'] title_path = os.path.join(self.path, title) if not os.path.exists(title_path): os.mkdir(title_path) for url in urls: # 这行代码是给每一种图片以它的地址命名,你仔细分析每一张图的图片地址前面的都一样,所以以下划线分割,取到最后一位字符就是名字。 image_name = url.split("_")[-1] # 利用request库的urlretrieve将图片下载到title_path绝对路径。 request.urlretrieve(url, os.path.join(title_path, image_name)) return item

———————————————— 参考链接:https://blog.csdn.net/weixin_44730235/article/details/104431208?

改进 为什么要选择使用scrapy内置的下载文件的方法:

1.避免重新下载最近已经下载过的文件。 2.可以方便的指定文件存储的路径。 3.可以将下载的图片转换成通用的搭式。比如png.

4.可以方便的生成缩略图。 5.可以方便的检测图片的宽和高,确保他们满足最小限制。

6.异步下载,效率非常高。

下载文件的Files Pipeline :?

当使用Files Pipeline下就文件的时候,按照以下步骤来完成: 1.定义好一个 Item,然后在这个item中定义两个属性,分别为files _url以及files 。files _url是用来存储需要下戟的文件的url链接,需要给一个列表 2.当文件下载完成后,会把文件下簇的相关信息存储到 item的4fil1es 属性中。比如下载路径、下载的ur和文件的校验码等。

3,在配置文件 settimgs.py中配器 FILES_STORE,这个配置是用来设置文件下航下来的路径。 4.启动pipelime :在ITEM_PIPELINES中设嚣 'scrapy.pipelines.files.FilesPipeline':1?。

下载图片的Images Pipeline : 当使用images Pipeline下载文件的时候,按照以下步婆来完成: 1.定义好一个Item ,然后在这个 item中定义两个属性,分别为 image_url 以及images . image_url是用来存诸需要下载的阻片的url随接,需要给一个列表。 ⒉.当配置下载完或后,会把文件下载的相关信息存储到 item的 images 属性中。比如下载路径、下载的url和图片的校验码等。

3.在配置文件 settings.py中配置工IMAGES_STORE,这个配置是用来设置图片下载下来的路径。 4.启动 pipeline :在ITEM_PIPELINES中设置

'scrapy.pipelines.images.ImagesPipeline': 1 按上面步骤修改后代码如下 ?

导入OS

下载结果如图

?

若实现下载分类设置,期初实现的功能:

重写Pipeline方法,设置下载路径

class Bmw5ImangePipeline(ImagesPipeline): from scrapy.pipelines.images import ImagesPipeline from Bmw5 import settings class Bmw5ImangePipeline( ImagesPipeline ): def get_media_requests(self, item, info): request_objs = super(Bmw5ImangePipeline, self).get_media_requests(item, info) for request_obj in request_objs: request_obj.item=item return request_objs #发送下载请求 def file_path(self, request, response=None, info=None, *, item=None): path = super(Bmw5ImangePipeline,self).file_path(request, response,info) title=request.item.get("title") images_store =settings.IMAGES_STORE category_path = os.path.join(images_store, title) if not os.path.exists(category_path): os.mkdir(category_path) image_name=path.replace("full/","") image_path=os.path .join(category_path,image_name) return image_path

修改设置文件下载?

很快就下载完了


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #startproject #Bmw5New #Scrapy #Project #Bmw5