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 相关文章推荐
pytyon 带有重复的全排列
Aug 13 Python
跟老齐学Python之Import 模块
Oct 13 Python
Python中文件操作简明介绍
Apr 13 Python
python字典DICT类型合并详解
Aug 17 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
Python hashlib模块用法实例分析
Jun 12 Python
python实现逐个读取txt字符并修改
Dec 24 Python
pyttsx3实现中文文字转语音的方法
Dec 24 Python
python中的 zip函数详解及用法举例
Feb 16 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 Python
Python3中PyQt5简单实现文件打开及保存
Jun 10 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 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
CodeIgniter中实现泛域名解析
2014/07/19 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
初探jquery——表单应用范例
2007/02/20 Javascript
javascript数组的使用
2013/03/28 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
require.js中的define函数详解
2017/07/10 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
python删除文件示例分享
2014/01/28 Python
python中根据字符串调用函数的实现方法
2016/06/12 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
python实现整数的二进制循环移位
2019/03/08 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
Python Selenium参数配置方法解析
2020/01/19 Python
python性能测试工具locust的使用
2020/12/28 Python
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
有原因的手表:Flex Watches
2019/03/23 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
酒店人事专员岗位职责
2013/12/19 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
社会实践评语
2014/04/28 职场文书
人力资源管理求职信
2014/08/07 职场文书
办公室个人总结
2015/02/28 职场文书
python实现的人脸识别打卡系统
2021/05/08 Python