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中的CURL PycURL使用例子
Jun 01 Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
python的文件操作方法汇总
Nov 10 Python
Python实现合并两个列表的方法分析
May 28 Python
python 自动去除空行的实例
Jul 24 Python
python如果快速判断数字奇数偶数
Nov 13 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
Python单元测试及unittest框架用法实例解析
Jul 09 Python
python 利用zmail库发送邮件
Sep 11 Python
python 标准库原理与用法详解之os.path篇
Oct 24 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php5 mysql分页实例代码
2008/04/10 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
Angular工具方法学习
2016/12/26 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
python调用java的Webservice示例
2014/03/10 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
Python 函数返回值的示例代码
2019/03/11 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
实例讲解利用HTML5 Canvas API操作图形旋转的方法
2016/03/22 HTML / CSS
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
茶叶生产计划书
2014/01/10 职场文书
基层工作经历证明
2014/01/13 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python
MySQL优化及索引解析
2022/03/17 MySQL
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers