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 提取文件的小程序
Jul 29 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
Python用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
用pandas按列合并两个文件的实例
Apr 12 Python
python 实现selenium断言和验证的方法
Feb 13 Python
详解小白之KMP算法及python实现
Apr 04 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
如何利用Python开发一个简单的猜数字游戏
Sep 22 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
python如何正确使用yield
May 21 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+java实现自动新闻滚动窗口
2006/10/09 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
python解析html开发库pyquery使用方法
2014/02/07 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
详解Python之unittest单元测试代码
2018/01/24 Python
Python读写docx文件的方法
2018/05/08 Python
Python重新加载模块的实现方法
2018/10/16 Python
python版飞机大战代码分享
2018/11/20 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
社区居务公开实施方案
2014/03/27 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
团委工作总结2015
2015/04/02 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers