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登陆asp网站页面的实现代码
Jan 14 Python
python与php实现分割文件代码
Mar 06 Python
python3.5 tkinter实现页面跳转
Jan 30 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
django2.0扩展用户字段示例
Feb 13 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
python使用正则来处理各种匹配问题
Dec 22 Python
Python批量将csv文件转化成xml文件的实例
May 10 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 文件上传源码分析(RFC1867)
2009/10/30 PHP
PHP中的array数组类型分析说明
2010/07/27 PHP
php eval函数用法总结
2012/10/31 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
jquery tools 系列 scrollable学习
2009/09/06 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
2016/11/28 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
关于layui时间回显问题的解决方法
2019/09/24 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
利用Python实现Windows定时关机功能
2017/03/21 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
Java基础知识面试题
2014/03/25 面试题
家长寄语大全
2014/04/02 职场文书
机关办公室岗位职责
2014/04/16 职场文书
北京奥运会主题口号
2014/06/13 职场文书
婚前协议书范本两则
2014/10/16 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis