爬取结果
爬取步骤
创建爬虫文件
进入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文件建立好
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
修改设置文件下载
很快就下载完了