Scrapy框架总结

一、Scrapy框架的使用步骤:

    1. 创建项目:
      scrapy startproject project_name
    1. cd进项目目录:
      cd project_name
    1. 创建项目应用程序:
      scrapy genspider app_name start_url
    1. 编写爬虫文件代码、settings配置:
      codes........
    1. 执行爬虫程序:
      scrapy crawl app_name

二、Scrapy初始Url的两种写法:

  • 一种是常量start_urls,并且需要定义一个方法parse()
import scrapy
class simpleUrl(scrapy.Spider):
    name = "simpleUrl"
    start_urls = [  #另外一种写法,无需定义start_requests方法
        'http://lab.scrapyd.cn/page/1/',
        'http://lab.scrapyd.cn/page/2/',
    ]
    # 此方法名必须为:parse
    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'mingyan-%s.html' % page
        with open(filename, 'wb') as f:
          f.write(response.body)
        self.log('保存文件: %s' % filename)
  • 另一种是直接定义一个方法:star_requests()
import scrapy
class simpleUrl(scrapy.Spider):
     name = "simpleUrl"

     def start_requests(self):
         urls = [ 
            #爬取的链接由此方法通过下面链接爬取页面
            'http://lab.scrapyd.cn/page/1/',
             'http://lab.scrapyd.cn/page/2/',
         ]
         for url in urls:
             yield scrapy.Request(url=url, callback=self.parse)

三、Scrapy调试工具之scrapy shell使用方法:

调试就是验证scrapy到底有木有提取到数据的工具,如果木有它你根本不知道你写的规则到底有木有提取到数据,所以这个工具是个刚需!其实也很简单,就是在命令行输入下面一行代码而已:
scrapy shell start_url:注意:执行此命令时需先cd到项目目录下

屏幕快照 2018-11-19 下午8.03.38.png

比如我们想提取 http://lab.scrapyd.cntitle,我们可以在[s]: 后面输入:response.css('title') ,然后回车, 立马就得到如下结果:
response

似不似很直观的验证了你提取的数据对不对?如果正确了,我们再把上面的代码放到我们蜘蛛里面,那这样就会正确的得到你想要的数据,而不会出现意外了,这就是scrapy调试工具的应用!

四、Scrapy 爬取下一页,scrapy整站爬取

接下来,还是继续爬取:http://lab.scrapyd.cn (链接独白:为神马受伤的总是我?)!我们既然要爬取下一页,那我们首先要分析链接格式,找到下一页的链接,那爬取就简单了

image.png

主要代码实现

next_page = response.css('li.next a::attr(href)').extract_first() 
    if next_page is not None:
        next_page = response.urljoin(next_page)
        yield scrapy.Request(next_page, callback=self.parse)

五、Scrapy arguments:指定蜘蛛参数爬取

Using spider arguments,这个东西对于许多朋友来说,简直是雪中送炭,因为有了参数配置爬取,就能加大我们爬取的灵活性,而不必重复修改、编写爬虫代码了。
  比如我们要爬取http://lab.scrapyd.cn里面的数据,原先我们需要全站的,过了几天需求变了,我们只需要:“人生”这个标签下面的内容,那我们又需要更改爬虫代码,又过了几天,需求又变,我们又需要标签:“励志”下面的内容,那我们又得改爬虫……
  如果爬虫量少还好,那如果有十个、一百个……那一天到晚我们只能不断的修改、不断的伺候这些爬虫了!
  那怎样才能让我们的爬虫更灵活呢?scrapy给我提供了可传参的爬虫,有了这么个功能,那人生就更加美丽了,上面不断变化的爬虫我们就可以这样来玩,首先按scrapy 参数格式定义好参数,如下:

import scrapy


class ArgsspiderSpider(scrapy.Spider):
    name = "argsSpider"

    def start_requests(self):
        url = 'http://lab.scrapyd.cn/'
        # 获取tag值,也就是爬取时传过来的参数
        tag = getattr(self, 'tag', None)
        # 判断是否存在tag,若存在,重新构造url
        if tag is not None:
            # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
            url = url + 'tag/' + tag
            # 发送请求爬取参数内容
            yield scrapy.Request(url, self.parse)

    def parse(self, response):
        mingyan = response.css('div.quote')
        
        for v in mingyan:
            text = v.css('.text::text').extract_first()
            tags = v.css('.tags .tag::text').extract()
            tags = ','.join(tags)
            fileName = '%s-语录.txt' % tags
            with open(fileName, "a+") as f:
                f.write(text)
                f.write('\n')
                f.write('标签:' + tags)
                f.write('\n-------\n')
                f.close()

        next_page = response.css('li.next a::attr(href)').extract_first()
        
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

代码写好之后,那我们要如何传参呢?如何运行呢?
比如我们要爬取标签:爱情,我们可以这样:
scrapy crawl argsSpider -a tag=爱情
要爬取标签:励志,我们可以这样:
scrapy crawl argsSpider -a tag=励志
参数:tag=爱情、tag=励志就可以在爬取的时候传进去我们蜘蛛里面,我们就可以不修改蜘蛛,愉快的爬取了!

六、scrapy命令明细:

1. Scrapy框架的命令也就十四五个,最常用的命令也就三个,即:
  scrapy startproject(创建项目)、
  scrapy crawl XX(运行XX蜘蛛)、
  scrapy shell http://www.scrapyd.cn(调试网址为http://www.scrapyd.cn的网站)

2. scrapy命令分为:全局命令、项目命令;
  很好理解,全局命令就是在哪都能用;项目命令就是只能依托你的项目

全局命令

  • startproject:
    创建项目
    scrapy startproject(创建项目)
  • genspider:
    这个命令的话是根据爬虫模板创建爬虫py文件的命令
    scrapy genspider spider_app_name start_url
  • settings:
    看字面意思,相信聪明的你已经知道它是干嘛的了!其实它就是方便你查看到你对你的scray设置了些神马参数!
    比如我们想得到爬虫项目的下载延迟,我们可以使用:
    scrapy settings --get DOWNLOAD_DELAY
    比如我们想得到爬虫项目的名字:
    scrapy settings --get BOT_NAME
  • runspider:
    这个命令有意思,之前我们运行爬虫项目除了使用:scrapy crawl XX之外,我们还能用:runspider,前者是基于项目运行,后者是基于文件运行,也就是说你按照scrapy的爬虫项目格式编写了一个py文件,那你不想创建项目,那你就可以使用runspider,比如你编写了一个:scrapyd_cn.py的爬虫文件,你要直接运行就是:
    scrapy runspider scrapy_cn.py
  • shell:
    这个命令比较重要,主要是调试用
    scrapy shell [http://www.scrapyd.cn](http://www.scrapyd.cn/)
  • fetch:
    这个命令其实也可以归结为调试命令的范畴!它的功效就是模拟我们的蜘蛛下载页面,也就是说用这个命令下载的页面就是我们蜘蛛运行时下载的页面,这样的好处就是能准确诊断出,我们的到的html结构到底是不是我们所看到的,然后能及时调整我们编写爬虫的策略!
    scrapy fetch [http://www.scrapyd.cn](http://www.scrapyd.cn/)
  • version:
    查看scrapy版本
    scrapy version

项目命令

  • crawl:
    运行爬虫文件
    scrapy crawl my_project
  • check:
    检查爬虫文件
    scrapy check my_project
  • list:
    显示有多少个爬虫文件
    scrapy list
  • edit:
    编辑文件(类似于linux系统下的vim)
    scrapy edit my_project
  • parse
    常用参数预览
    scrapy parse my_project
  • bench
    项目详细运行情况
    scrapy bench my_project

参考Scrapy中文网

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

推荐阅读更多精彩内容

  • 文件目录说明: scrapy.cfg: 项目的配置文件 tutorial/: 该项目的python模块。之后您将在...
    关键先生耶阅读 563评论 0 0
  • 类型推断 console log 如下
    点滴86阅读 445评论 0 1
  • 开始下雨了,这座城市漫长的白日看不到尽头,仿佛黑暗从不曾降临,略微寒意,让人只想穿上帽衫开瓶啤酒,独自叫一盆小龙虾...
    嘉每文阅读 260评论 2 3
  • 如果你不是官二代,富二代,不是一毕业就有早已准备好的工作让你前去入职,那么,我作为过来人,作为毕业了的,踏入过职场...
    妍兮阅读 1,158评论 51 53
  • 《权力只被某些人拥有》 知识复盘 权力之路第一步: 成为最引人注目的那一个:勇于向老板提出要求;不要谦虚,要勇于向...
    凯瑞姐姐阅读 164评论 0 0