scrapy框架案例分析

作为一名爬虫爱好者,虽然requests库已经足够我们做一些简单的小爬虫,selenium能帮助我们模仿浏览器行为,但学会使用框架能帮助我们更加便捷高效的完成爬取任务。

案例分析:爬取宝马五系汽车图片

1.新建一个爬虫项目

scrapy startproject bw
cd bw
scrapy genspider bw5 "XXXXXXX域名"

2.在item.py中创建三个容器

import scrapy


class BwItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field() #装子分类名字
    image_urls = scrapy.Field() #装图片链接
    images = scrapy.Field()

3.在爬虫文件bw5.py中导入BwItem并解析网页

import scrapy
from bw.items import BwItem

class Bw5Spider(scrapy.Spider):
    name = 'bw5'
    allowed_domains = ['car.autohome.com.cn']
    start_urls = ['https://car.autohome.com.cn/pic/series/65.html']

    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(".//div[@class='uibox-con carpic-list03']/ul/li/a/img/@src").getall()
            # for x in urls:
            #     url = response.urljoin(x)
            #     print(url)
            #获取所有图片url
            urls = list(map(lambda url:response.urljoin(url),urls))
            item = BwItem(title=title,image_urls=urls)
            yield item

4.scrapy框架中帮我们写好了异步下载程序,只需按步骤打开下载器开关配置相应路径即可

当使用File Pipeline下载文件的时候,按照以下步骤来完成:
1.定义好一个Item,然后在这个item中定义两个属性,分别为file_urls以及files 。file_urls是用来存储需要下载的文件的url链接,需要一个列表
⒉.当文件下载完成后,会把文件下载的相关信息存储到item的files属性中。比如下载路径、下载的url和文件的校验码等。
3.在配置文件 settings.py中配置FILEs_STORE,这个配置是用来设置文件下载下来的路径。
4.启动pipeline在ITEN_PIPELNES中设置scrapy.pipelines.files.FilesPipeline:1.
下载图片的Images Pipeline:
1.定义好一个Item,然后在这个item中定义两个属性,分别为image_urls以及images 。image_urls是用来存储需要下载的文件的url链接,需要一个列表
⒉.当文件下载完成后,会把文件下载的相关信息存储到item的images属性中。比如下载路径、下载的url和文件的校验码等。
3.在配置文件 settings.py中配置IMAGES_STORE,这个配置是用来设置文件下载下来的路径。
4.启动pipeline在ITEN_PIPELNES中设置scrapy.pipelines.images.ImagesPipeline:1

若有下载要求,需要在pipelines.py中重写相关方法

import os
from urllib import request
from scrapy.pipelines.images import ImagesPipeline
from bw import settings

class BwImagesPipeline(ImagesPipeline):#继承父类ImagesPipeline
    def get_media_requests(self, item, info):#重写父类方法
        request_objs = super(BwImagesPipeline,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):
        path = super(BwImagesPipeline,self).file_path(request,response,info)
        title = request.item.get("title")
        images_store = settings.IMAGES_STORE
        title_path = os.path.join(images_store,title)
        if not os.path.exists(title_path):
            os.mkdir(title_path)
        image_name = path.replace("full/","")
        image_path = os.path.join(title_path,image_name)
        return image_path

5.在setting.py中开启相关设置

# Obey robots.txt rules
ROBOTSTXT_OBEY = False #关闭机器人协议
#设置默认请求头
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/84.0.4147.89 Safari/537.36',
}
#开启item_pipelines
ITEM_PIPELINES = {
   # 'bw.pipelines.BwPipeline': 300,
   #  'scrapy.pipelines.images.ImagesPipeline':1,
    'bw.pipelines.BwImagesPipeline':1,
}
#图片下载路径,供image pipelines使用
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')

6.在工程目录下创建start.py文件以启动爬虫

from scrapy import cmdline
cmdline.execute("scrapy crawl bw5".split())

效果图

总结:相比普通爬虫,scrapy框架的运行速率,下载速率都更快,效率更高,学会使用框架能提高我们的效率,特别是爬取的数据较多的情况下。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342