scrapy.spiders.crawl.CrawlSpider类的使用

  这个类比较适用于对网站爬取批量网页,相比于Spider类,CrawlSpider主要使用规则(rules)来提取链接

  rules = (

    Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/\d+/')), callback="parse_item1"),

    Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/.+')), callback="parse_item2"),

    )

  如果接触过django,那么可以发现这个规则与django的路由系统十分相似,CrawlSpider的rules属性是直接从response对象的文本中提取url,然后自动创建新的请求。与Spider不同的是,CrawlSpider已经重写了parse函数,因此我们可以看到,scrapy的官网文档的例子中并没有重写parse。

这一切是scrapy自动实现的,具体过程是:

  scrapy crawl spidername开始运行,程序自动使用start_urls构造Request并发送请求,然后调用parse函数对其进行解析,在这个解析过程中使用rules中的规则从html(或xml)文本中提取匹配的链接,通过这个链接再次生成Request,如此不断循环,直到返回的文本中再也没有匹配的链接,或调度器中的Request对象用尽,程序才停止。

  rules中的规则如果callback没有指定,则使用默认的parse函数进行解析,如果指定了,那么使用自定义的解析函数。

  如果起始的url解析方式有所不同,那么可以重写CrawlSpider中的另一个函数parse_start_url(self, response)用来解析第一个url返回的Response,但这不是必须的。

  Rule对象的follow参数的作用是:指定了根据该规则从response提取的链接是否需要跟进。

参考: http://scrapy-chs.readthedocs.io/zh_CN/stable/topics/spiders.html#crawling-rules

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import scrapy
  5. from tutorial01.items import MovieItem
  6. from scrapy.spiders.crawl import Rule, CrawlSpider
  7. from scrapy.linkextractors import LinkExtractor
  8.  
  9. class DoubanmoviesSpider(CrawlSpider):
  10. name = "doubanmovies"
  11. allowed_domains = ["douban.com"]
  12. start_urls = ['https://movie.douban.com/tag/']
  13. # http_user='username' #http协议的基本认证功能 ;http_user和http_pass
  14. # http_pass='password'
  15. rules = ( #自动从response中根据正则表达式提取url,再根据这个url再次发起请求,并用callback解析返回的结果
  16. Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/\d+/')), callback="parse_item"),
  17. #Rule(LinkExtractor(allow=(r'https://movie.douban.com/tag/\[wW]+'))), # 从网页中提取http链接
  18.  
  19. )
  20.  
  21. def parse_item(self, response):
  22. movie = MovieItem()
  23. movie['name'] = response.xpath('//*[@id="content"]/h1/span[1]/text()').extract()[0]
  24. movie['director'] = '/'.join(response.xpath('//a[@rel="v:directedBy"]/text()').extract())
  25. movie['writer'] = '/'.join(response.xpath('//*[@id="info"]/span[2]/span[2]/a/text()').extract())
  26. movie['url'] = response.url
  27. movie['score'] = response.xpath('//*[@class="ll rating_num"]/text()').extract()[0]
  28. movie['collections'] = response.xpath('//span[@property="v:votes"]/text()').extract()[0] #评价人数
  29. movie['pub_date'] = response.xpath('//span[@property="v:initialReleaseDate"]/text()').extract()[0]
  30. movie['actor'] = '/'.join(response.css('span.actor span.attrs').xpath('.//a[@href]/text()').extract())
  31. movie['classification'] = '/'.join(response.xpath('//span[@property="v:genre"]/text()').extract())
  32. print('movie:%s |url:%s'%(movie['name'],movie['url']))
  33. return movie
  34.  
  35. def parse_start_url(self, response):
  36. urls = response.xpath('//div[@class="article"]//a/@href').extract()
  37. for url in urls:
  38. if 'https' not in url: # 去除多余的链接
  39. url = response.urljoin(url) # 补全
  40. print(url)
  41. print('*'*30)
  42. yield scrapy.Request(url)

Scrapy笔记:CrawSpider中rules中的使用的更多相关文章

  1. 第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    第三百六十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中 前面我们讲到的elasticsearch( ...

  2. 四十六 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    前面我们讲到的elasticsearch(搜索引擎)操作,如:增.删.改.查等操作都是用的elasticsearch的语言命令,就像sql命令一样,当然elasticsearch官方也提供了一个pyt ...

  3. Yii CModel中rules验证 获取错误信息

    在model中定义 public function rules(){ return array( array('Name,Email','required'), array('Email','uniq ...

  4. YII开发技巧分享——模型(models)中rules自定义验证规则

    YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规 ...

  5. python笔记之提取网页中的超链接

    python笔记之提取网页中的超链接 对于提取网页中的超链接,先把网页内容读取出来,然后用beautifulsoup来解析是比较方便的.但是我发现一个问题,如果直接提取a标签的href,就会包含jav ...

  6. 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href

    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...

  7. element-ui的rules中正则表达式

    <template> <el-form :model="unuseForm" label-position="top" :rules=&quo ...

  8. scrapy笔记集合

    细读http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html 目录 Scrapy介绍 安装 基本命令 项目结构以及爬虫应用介绍 简单使用示例 选 ...

  9. Scrapy笔记03- Spider详解

    Scrapy笔记03- Spider详解 Spider是爬虫框架的核心,爬取流程如下: 先初始化请求URL列表,并指定下载后处理response的回调函数.初次请求URL通过start_urls指定, ...

随机推荐

  1. 科学计算库Numpy——数组形状

    改变数组维数 给数组的shape属性赋值,改变数组的维数.数组的大小是不能改变的. 增加维度 使用np.newaxis增加维度. 删除维度 使用squeeze()删除维度是1的维度,也就是删除shap ...

  2. django之media配置

    一.没有配置Media avatar = models.FileField(upload_to='avatars/', default='/avatars/default.png') # 储存头像的m ...

  3. 12、python中的函数(高阶函数)

    一.高阶函数 函数实际上也是一个对象,所以也能由变量指向一个函数对象,实际上函数名就是一个变量名.那么函数是传入变量作为参数的,如果传入的变量指向的是函数对象,这种函数就叫高阶函数. 高阶函数就是传入 ...

  4. python资源大全2

    原文链接 网络 Scapy, Scapy3k: 发送,嗅探,分析和伪造网络数据包.可用作交互式包处理程序或单独作为一个库. pypcap, Pcapy, pylibpcap: 几个不同 libpcap ...

  5. Redis实现之对象(二)

    列表对象 列表对象的编码可以是ziplist或者linkedlist,ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry)保存了一个列表元素.举个栗子,如果我们执行RP ...

  6. redis 之相关命令

    为什么缓存数据库更要首选redis?如何使用redis? 一.使用缓存数据库为什么首选用redis? 我们都知道,把一些热数据存到缓存中可以极大的提高速度,那么问题来了,是用Redis好还是Memca ...

  7. python学习-- 在django中,执行原始sql语句

    from django.shortcuts import render, redirect from news.models import Article, Column def test(reque ...

  8. sql2005 和sql2008 同时安装

    Hkey_local_machine\Software\Wow6432Node\Microsoft\Microsoft SQL Server\90\Tools\ShellSEM 中的ShellSEM重 ...

  9. [oldboy-django][2深入django]Form组件实现生成: select下拉框, checkbox复选框,radio单选框以及如何实现自定义数据格式要求

    1 需求 - 1Form组件如何实现生成选择类标签: select,check, radio - 默认值 - 保留上次输入的值 - 2自定义验证规则 - RegexField - -

  10. [python][django学习篇][7]设计博客视图(1)

    1上网的流程: 打开浏览器,输入网址(http://zmrenwu.com/) 浏览器根据输入网址,完成以下几件事:1识别服务器地址,2将用户的浏览意图打包成一个http请求,发送给服务器,等待服务器 ...