crawlSpider

  • 创建CrawlSpider模板 scrapy genspider -t crawl <爬虫名字> <域名>

  • 模板代码示例:

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule

    class XxxSpider(CrawlSpider):
       name = 'xxx'
       allowed_domains = ['www.baidu.com']
       start_urls = ['http://www.baidu.com']    rules = (
           Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
      )

       def parse_item(self, response):
           i = {}
           #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
           #i['name'] = response.xpath('//div[@id="name"]').extract()
           #i['description'] = response.xpath('//div[@id="description"]').extract()
           return i
  • CrawlSpider 继承自Spider 类,除了(name, allowed_domains, start_urls)之外,还定义了rules

rules

  • CrawlSpider使用rules来定义爬虫的爬取规则,并将匹配后的url自动拼接完整构造成请求提交给引擎。所以在正常情况下,CrawlSpider不需要单独手动返回请求了。

  • 在rules中包含一个或多个Rule对象,每个Rule对爬取网站的动作定义了某种特定操作,比如提取当前相应内容里的特定链接,是否对提取的链接跟进爬取,对提交的请求设置回调函数等。

  • 如果多个rule匹配了相同的链接,则根据规则在本集合中被定义的顺序,第一个会被使用。

  • Rule对象的参数

    • LinkExtracto 链接提取器,用于提取需要爬取的链接

    • callback 回调函数,提取的url请求对应的响应的处理函数,函数名是一个字符型

      • 注意:当编写爬虫规则时,避免使用parse作为回调函数。由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了 parse方法,crawl spider将会运行失败。

    • follow 是否跟进链接,True表示跟进,就是在请求的url页面,有满足这个规则的url会被继续提取,然后组成Request发送跟调度器排队继续请求

    • process_links:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。

    • process_request:指定该spider中哪个的函数将会被调用, 该规则提取到每个request时都会调用该函数。 (用来过滤request)

  • LinkExtractor

    • allow:满足括号中正则表达式的URL会被提取,如果为空,则全部匹配。

    • deny:满足括号中正则表达式的URL一定不提取(优先级高于allow)。

    • allow_domains:会被提取的链接的domains。

    • deny_domains:一定不会被提取链接的domains。

    • restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。

案例

  • crawlSpider爬取腾讯招聘

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from craw_spider.items import PositionItem, DetailItem

class HrSpider(CrawlSpider):
   name = 'hr'
   allowed_domains = ['hr.tencent.com']
   start_urls = ['https://hr.tencent.com/position.php?start=0']

   rules = (
       # 提起职位基本信息规则
       Rule(LinkExtractor(allow=r'position\.php\?&start=\d+#a'),
            callback='parse_item',
            follow=True),

       # 提取职位详情页规则
       Rule(LinkExtractor(allow=r'position_detail\.php\?id=\d+'),
            callback='parse_detail',
            follow=False),
  )

   def parse_item(self, response):
       item = PositionItem()
       trs = response.xpath(
           '//table[@class="tablelist"]/tr[@class="even"] | //table[@class="tablelist"]/tr[@class="odd"]')
       for tr in trs:
           item['position_name'] = tr.xpath('./td/a/text()').extract_first()
           item['position_type'] = tr.xpath('./td[2]/text()').extract_first()
           item['position_num'] = tr.xpath('./td[3]/text()').extract_first()
           item['position_addr'] = tr.xpath('./td[4]/text()').extract_first()
           item['publish_data'] = tr.xpath('./td[5]/text()').extract_first()
           yield item

   def parse_detail(self, response):
       item = DetailItem()
       item['position_require'] = response.xpath('//table[@class="tablelist textl"]/tr[3]/td/ul/li//text()').extract()
       item['position_duty'] = response.xpath('//table[@class="tablelist textl"]/tr[4]/td/ul/li//text()').extract()
       yield item
  • 其他组件的使用和Spider是一样的

CrawlSpider模板的更多相关文章

  1. python爬虫入门(八)Scrapy框架之CrawlSpider类

    CrawlSpider类 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com CrawSpid ...

  2. Scrapy框架-CrawlSpider

    目录 1.CrawlSpider介绍 2.CrawlSpider源代码 3. LinkExtractors:提取Response中的链接 4. Rules 5.重写Tencent爬虫 6. Spide ...

  3. Scrapy 使用CrawlSpider整站抓取文章内容实现

    刚接触Scrapy框架,不是很熟悉,之前用webdriver+selenium实现过头条的抓取,但是感觉对于整站抓取,之前的这种用无GUI的浏览器方式,效率不够高,所以尝试用CrawlSpider来实 ...

  4. Scrapy框架——使用CrawlSpider爬取数据

    引言 本篇介绍Crawlspider,相比于Spider,Crawlspider更适用于批量爬取网页 Crawlspider Crawlspider适用于对网站爬取批量网页,相对比Spider类,Cr ...

  5. scrapy爬取微信小程序社区教程(crawlspider)

    爬取的目标网站是: http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1 目的是爬取每一个教程的标题,作者,时间和 ...

  6. CrawlSpiders

    1.用 scrapy 新建一个 tencent 项目 2.在 items.py 中确定要爬去的内容 # -*- coding: utf-8 -*- # Define here the models f ...

  7. 三、scrapy后续

    CrawlSpiders 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com 我们通过正则表达 ...

  8. scrapy入门与进阶

    Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...

  9. scrapy框架整理

    0.安装scrapy框架 pip install scrapy 注:找不到的库,或者安装部分库报错,去python第三方库中找,很详细 https://www.lfd.uci.edu/~gohlke/ ...

随机推荐

  1. python修炼第七天

    第七天面向对象进阶,面向对象编程理解还是有些难度的,但是我觉得如果弄明白了,要比函数编程过程编程省事多了.继续努力! 1.面向对象补充: 封装 广义上的封装:把变量和函数都放在类中狭义上的封装:把一些 ...

  2. Binary Search 二分法方法总结

    Binary Search 二分法方法总结 code教你做人:二分法核心思想是把一个大的问题拆成若干个小问题,最重要的是去掉一半或者选择一半. 二分法模板: public int BinarySear ...

  3. 北航OO第一单元总结

    我本着公平公开公正的态度作出以下评价: 1.面向对象真的很修身养性 2.有一个好的身体非常重要 3.互相hack可以暴露人的阴暗面 好了,步入正题. 一.作业分析 1.第一次作业分析 1.1类图 1. ...

  4. Android 面试100问- 0序0

    准备找android方面的工作,现收集面试题,打算收集100个并记录

  5. css flex布局,小程序flex布局,垂直居中完美解决

    flex弹性布局,很好的解决了垂直居中的问题,上代码: wxml: <view class='container'> <view class='item item1'>item ...

  6. python基础(字符串常用方法)

    字符串不常用方法: 字符串常用的方法: #看源代码 按住ctrl点击方法名 用户注册的小程序 import datetimeusers = []passwds = []for i in range(3 ...

  7. 安装oracle数据库的操作步骤

    1. vnc启动之后,进入数据库安装包所在目录,此处是/home/DB/backup/database 2. 输入命令 ./runInstaller 3. 弹出linux图形化界面,同时弹出Oracl ...

  8. NVCC src/caffe/util/math_functions.cu

    解决办法:由于安装的cuda版本是7.5,当前下载的caffe版本比较新,需要修改里面的makefile文件,屏蔽下面的代码,cuda<8.0 In the Makefile.example, ...

  9. FBV和CBV装饰器

    FBV装饰器: def cook(request): err_msg="" if request.method == "GET": return render( ...

  10. Java中的静态方法和实例方法的调用的理解(不同的类下的方法调用)

    public class MethodCall { public static void main(String[] args) { Test.sayStatic(); Test test = new ...