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 list转dict示例分享
Jan 28 Python
在Django的模型中添加自定义方法的示例
Jul 21 Python
Python实现二叉搜索树
Feb 03 Python
Python实现堆排序的方法详解
May 03 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
python 重定向获取真实url的方法
May 11 Python
Python3模拟登录操作实例分析
Mar 12 Python
python如何制作缩略图
Apr 30 Python
Python 70行代码实现简单算式计算器解析
Aug 30 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
Python tkinter实现日期选择器
Feb 22 Python
Python绘制散点图之可视化神器pyecharts
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
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
php 邮件发送问题解决
2014/03/22 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
php上传图片类及用法示例
2016/05/11 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
JS中创建函数的三种方式及区别
2016/03/13 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
JS判断数组里是否有重复元素的方法小结
2019/05/21 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
python numpy库np.percentile用法说明
2020/06/08 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
渡河少年教学反思
2014/02/12 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
给老婆道歉的话
2015/01/20 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python