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 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
Python编程求质数实例代码
Jan 31 Python
Django基础知识与基本应用入门教程
Jul 20 Python
python发送告警邮件脚本
Sep 17 Python
python调试神器PySnooper的使用
Jul 03 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 Python
python 求两个向量的顺时针夹角操作
Mar 04 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 eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
php实现的日历程序
2015/06/18 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
php生成HTML文件的类方法
2019/10/11 PHP
页面版文本框智能提示JS代码
2009/11/20 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
js中style.display=""无效的解决方法
2014/10/30 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
python实现图片文件批量重命名
2020/03/23 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
爱情保证书大全
2014/04/29 职场文书
宣传口号大全
2014/06/16 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
你真的会用Mysql的explain吗
2022/03/31 MySQL
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript