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实现dnspod自动更新dns解析的方法
Feb 14 Python
python中的reduce内建函数使用方法指南
Aug 31 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
Python中sort和sorted函数代码解析
Jan 25 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
使用Python制作一个打字训练小工具
Oct 01 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
解决keras backend 越跑越慢问题
Jun 18 Python
Python 用户输入和while循环的操作
May 23 Python
详解Python中的进程和线程
Jun 23 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下MYSQL limit的优化
2008/01/10 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
php广告加载类用法实例
2014/09/23 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
学习ExtJS table布局
2009/10/08 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
解决python删除文件的权限错误问题
2018/04/24 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
python 6行代码制作月历生成器
2020/09/18 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
暑假实习求职信范文
2013/09/22 职场文书
计算机大学生的自我评价
2013/10/15 职场文书
校园安全检查制度
2014/02/03 职场文书
教师自我反思材料
2014/02/14 职场文书
课程改革实施方案
2014/03/16 职场文书
函授生自我鉴定
2014/03/25 职场文书
生物工程专业求职信
2014/09/03 职场文书
2014年信贷员工作总结
2014/11/18 职场文书