基于CrawlSpider全栈数据爬取
- CrawlSpider就是爬虫类Spider的一个子类
使用流程
- 创建一个基于CrawlSpider的一个爬虫文件 :scrapy genspider -t crawl spider_name www.xxx.com
- 构造链接提取器和规则解析器
- 链接提取器:
- 作用:可以根据指定的规则进行指定连接的提取
- 提取的规则: allow = "正则表达式"
- 会先在全局匹配所有的url,然后根据参数allow的规则匹配需要的链接
- 规则解析器
- 作用:获取链接提取器提取到的链接,对其进行请求发送,根据指定的规则对请求道的页面源码数据进行数据解析.-
- fllow = True 参数的作用: 将链接提取器继续作用到链接提取器提取到的页码链接所对应的页面中
- 链接提取器:
- 注意事项:
- 链接提取器和规则解析器是一一对应关系
示例代码
基于CrawlSpider实现深度数据爬取
- spider文件
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunspider.items import SunspiderItem, SunspiderItemSecond class SunSpiderSpider(CrawlSpider):
name = 'sun_spider'
# 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+')
link_detail = LinkExtractor(allow=r'question/\d+/\d+\.shtml')
rules = (
# 实例化Rule(规则解析器)的对象
Rule(link, callback='parse_item', follow=True),
Rule(link_detail, callback='parse_item_content', follow=True), ) 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]/@title').extract_first()
status = tr.xpath('./td[3]/span/text()').extract_first()
num = tr.xpath('./td[1]/text()').extract_first()
item = SunspiderItem()
item['title'] = title
item['status'] = status
item['num'] = num
yield item def parse_detail(self, response):
content = response.xpath('/html/body/div[9]/table[2]/tbody/tr[1]//text()').extract()
content = ''.join(content)
num = response.xpath('/html/body/div[9]/table[1]/tbody/tr/td[2]/span[2]/text()').extract_first()
if num:
num = num.split(':')[-1]
item = SunspiderItemSecond()
item['content'] = content
item['num'] = num
yield item
items.py文件
import scrapy
# 定义两个类,并且通过某种方式(num)标识两个类之间的对应关系
class SunspiderItem(scrapy.Item):
title = scrapy.Field()
status = scrapy.Field()
num = scrapy.Field() class SunspiderItemSecond(scrapy.Item):
content = scrapy.Field()
num = scrapy.Field()
pipelines.py文件
- 存储数据
class SunspiderPipeline(object):
def process_item(self, item, spider):
# 判断item是哪一个类封装
if item.__class__.__name__ == "SunspiderItemSecond":
content = item['content']
num = item['num']
print(content, num)
else:
title = item['title']
status = item['status']
num = item['num'] print(title, status, num)
return item
基于CrawlSpider全栈数据爬取的更多相关文章
- 爬虫系列---scrapy全栈数据爬取框架(Crawlspider)
一 简介 crawlspider 是Spider的一个子类,除了继承spider的功能特性外,还派生了自己更加强大的功能. LinkExtractors链接提取器,Rule规则解析器. 二 强大的链接 ...
- scrapy框架基于CrawlSpider的全站数据爬取
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- requests模块session处理cookie 与基于线程池的数据爬取
引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/ ...
- Python网络爬虫之cookie处理、验证码识别、代理ip、基于线程池的数据爬去
本文概要 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时, ...
- Scrapy 框架 CrawlSpider 全站数据爬取
CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...
- 基于 PHP 的数据爬取(QueryList)
基于PHP的数据爬取 官方网站站点 简单. 灵活.强大的PHP采集工具,让采集更简单一点. 简介: QueryList使用jQuery选择器来做采集,让你告别复杂的正则表达式:QueryList具有j ...
- requests模块处理cookie,代理ip,基于线程池数据爬取
引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的. 一.基于requests模块 ...
- 全栈数据工程师养成攻略:Python 基本语法
全栈数据工程师养成攻略:Python 基本语法 Python简单易学,但又博大精深.许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉.学海无涯,我们先来了解一些 ...
- 人人贷网的数据爬取(利用python包selenium)
记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合网上各种相关资料,改善一下别人代码,并能实现数据代码爬取,具体请看我之前的博客:http://www.cnblogs.com/Yiutto/p/5 ...
随机推荐
- 案例四:Shell脚本生成随机密码
生成随机密码(urandom版本) #!/bin/bash #Author:丁丁历险(Jacob) #/dev/urandom文件是Linux内置的随机设备文件 #cat /dev/urandom可以 ...
- 【C#表达式树 一】Expressions 命名空间 38个类 2个接口 3个枚举
注解 抽象类 Expression 提供用于为表达式树建模的类层次结构的根. 此命名空间中派生自的类 Expression (例如 MemberExpression 和 ParameterExpres ...
- 小白学python第1问: int 占几个字节?
windows 64位机器,python3.7:后面的文章中,没有特别说明的话,都是在该环境下运行 int 占几个字节? C语言中(GCC编译器),int 占据4个字节,python呢? 我们用pyt ...
- 查询性能提升3倍!Apache Hudi 查询优化了解下?
从 Hudi 0.10.0版本开始,我们很高兴推出在数据库领域中称为 Z-Order 和 Hilbert 空间填充曲线的高级数据布局优化技术的支持. 1. 背景 Amazon EMR 团队最近发表了一 ...
- Qt:QListWidgetItem
0.说明 一个QListWidgetItem是QListWidget中的一项(一行). 每个Item都可以持有多部分的信息,并将它们在适当时候展示出来. 在构造一个Item时指明它所在的List Wi ...
- broken pipe 报错分析和解决办法
参考资料: 1.博客1:https://blog.csdn.net/qq_37535749/article/details/113781338 2.博客2:https://blog.csdn.net/ ...
- Linux网络命名空间
命名空间(Linux namespace)是linux内核针对实现虚拟化引入的一个特性.创建的每个进程都有自己的命名空间,运行在其中的进程都像是在独立的操作系统中运行一样,命名空间保证了进程之 ...
- SoapUI软件-测试Web Service接口
一.新建项目 New SOAP Project Project Name填入项目名称:Initial WSDL中填入接口地址,或后缀为.wsdl的文件:OK: 添加后可在左侧看到接口详情: 二.测试接 ...
- 我完成了10000小时开发3D引擎
为什么要开始10000小时? 我以前看过一本叫<异类>的书,书的大概意思是:只要学习10000小时,任何人都可以成为一个领域的大师.这里的"学习"是指完全专注地精进学习 ...
- k8s线上某些特殊情况强制删除 StatefulSet 的 Pod 要考虑什么隐患?
k8s线上某些特殊情况强制删除 StatefulSet 的 Pod 要考虑什么隐患? 考点之什么情况下,需要强制删除 StatefulSet 的 Pod? 考点之如果 StatefulSet 操作不当 ...