python网络爬虫 CrawlSpider使用详解


Posted in Python onSeptember 27, 2019

CrawlSpider

  • 作用:用于进行全站数据爬取
  • CrawlSpider就是Spider的一个子类
  • 如何新建一个基于CrawlSpider的爬虫文件
    • scrapy genspider -t crawl xxx www.xxx.com
  • 例:choutiPro

LinkExtractor连接提取器:根据指定规则(正则)进行连接的提取

Rule规则解析器:将连接提取器提取到的连接进行请求发送,然后对获取的页面进行指定规则【callback】的解析

一个链接提取器对应唯一一个规则解析器

例:crawlspider深度(全栈)爬取【sunlinecrawl例】

分布式(通常用不到,爬取数据量级巨大、时间少时用分布式)

概念:可将一组程序执行在多态机器上(分布式机群),使其进行数据的分布爬取

原生的scrapy框架是否可以实现分布式?

不能

抽屉

# spider文件

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class ChoutiSpider(CrawlSpider):
  name = 'chouti'
  # allowed_domains = ['www.xxx.com']
  start_urls = ['https://dig.chouti.com/1']

  # 连接提取器:从起始url对应的页面中提取符合规则的所有连接;allow=正则表达式
  # 正则为空的话,提取页面中所有连接
  link = LinkExtractor(allow=r'\d+')
  rules = (
    # 规则解析器:将连接提取器提取到的连接对应的页面源码进行指定规则的解析
    # Rule自动发送对应链接的请求
    Rule(link, callback='parse_item', follow=True),
    # follow:True 将连接提取器 继续 作用到 连接提取器提取出来的连接 对应的页面源码中
  )
  def parse_item(self, response):
    item = {}
    #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
    #item['name'] = response.xpath('//div[@id="name"]').get()
    #item['description'] = response.xpath('//div[@id="description"]').get()
    return item

阳光热线网

# 1.spider文件
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunLineCrawl.items import SunlinecrawlItem,ContentItem
class SunSpider(CrawlSpider):
  name = 'sun'
  # allowed_domains = ['www.xxx.com']
  start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']

  link = LinkExtractor(allow=r'type=4&page=\d+') # 提取页码连接
  link1 = LinkExtractor(allow=r'question/2019\d+/\d+\.shtml') # 提取详情页连接
  rules = (
    Rule(link, callback='parse_item', follow=False),
    Rule(link1, callback='parse_detail'),
  )
  # 解析出标题和网友名称数据
  def parse_item(self, response):
    tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
    for tr in tr_list:
      title = tr.xpath('./td[2]/a[2]/text()').extract_first()
      net_friend = tr.xpath('./td[4]/text()').extract_first()
      item = SunlinecrawlItem()
      item['title'] = title
      item['net_friend'] = net_friend

      yield item

  # 解析出新闻的内容
  def parse_detail(self,response):
    content = response.xpath('/html/body/div[9]/table[2]//tr[1]/td/div[2]//text()').extract()
    content = ''.join(content)
    item = ContentItem()
    item['content'] = content

    yield item
--------------------------------------------------------------------------------
# 2.items文件

import scrapy

class SunlinecrawlItem(scrapy.Item):
  title = scrapy.Field()
  net_friend = scrapy.Field()

class ContentItem(scrapy.Item):
  content = scrapy.Field()
--------------------------------------------------------------------------------
# 3.pipelines文件

class SunlinecrawlPipeline(object):
  def process_item(self, item, spider):
    # 确定接受到的item是什么类型(Content/Sunlinecrawl)
    if item.__class__.__name__ == 'SunlinecrawlItem':
      print(item['title'],item['net_friend'])

    else:
      print(item['content'])

    return item
--------------------------------------------------------------------------------
# 4.setting文件

BOT_NAME = 'sunLineCrawl'

SPIDER_MODULES = ['sunLineCrawl.spiders']
NEWSPIDER_MODULE = 'sunLineCrawl.spiders'

LOG_LEVEL = 'ERROR'

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

ROBOTSTXT_OBEY = False

ITEM_PIPELINES = {
  'sunLineCrawl.pipelines.SunlinecrawlPipeline': 300,
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
谈谈如何手动释放Python的内存
Dec 17 Python
python爬虫的工作原理
Mar 05 Python
Python实现图片转字符画的示例
Aug 22 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
Python语言异常处理测试过程解析
Jan 08 Python
python opencv进行图像拼接
Mar 27 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
运行Python编写的程序方法实例
Oct 21 Python
python numpy存取文件的方式
Apr 01 #Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 #Python
使用Fabric自动化部署Django项目的实现
Sep 27 #Python
Win10+GPU版Pytorch1.1安装的安装步骤
Sep 27 #Python
opencv调整图像亮度对比度的示例代码
Sep 27 #Python
详解Django将秒转换为xx天xx时xx分
Sep 27 #Python
pytorch多GPU并行运算的实现
Sep 27 #Python
You might like
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
ajax 缓存 问题 requestheader
2010/08/01 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
require.js中的define函数详解
2017/07/10 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
Python中正则表达式的详细教程
2015/04/30 Python
Python实现简易Web爬虫详解
2018/01/03 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
python绘制热力图heatmap
2020/03/23 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
python使用pandas处理大数据节省内存技巧(推荐)
2019/05/05 Python
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
幼儿园英语教学反思
2014/01/30 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
北京故宫的导游词
2015/01/31 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
党支部对转正的意见
2015/06/02 职场文书
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript