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

爬取结果

爬取步骤

创建爬虫文件

进入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以及filesfiles _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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值