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正则表达式判断字符串是否是全部小写示例
Dec 25 Python
python如何通过protobuf实现rpc
Mar 06 Python
python算法演练_One Rule 算法(详解)
May 17 Python
python去除字符串中的换行符
Oct 11 Python
python使用magic模块进行文件类型识别方法
Dec 08 Python
对python:循环定义多个变量的实例详解
Jan 20 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
在django模板中实现超链接配置
Aug 21 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
python用类实现文章敏感词的过滤方法示例
Oct 27 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 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
短波收音机简介
2021/03/01 无线电
php GeoIP的使用教程
2011/03/09 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
php购物车实现方法
2015/01/03 PHP
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
深入理解NumPy简明教程---数组1
2016/12/17 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
深入浅析Python中的迭代器
2019/06/04 Python
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
北京振戎融通Java面试题
2015/09/03 面试题
求职自荐信的格式
2014/04/07 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
民事和解协议书格式
2014/11/29 职场文书
长江三峡导游词
2015/01/31 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
法律意见书范文
2015/06/04 职场文书
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android