scrapy框架之CrawlSpider全站自动爬取
全站数据爬取的方式
1.通过递归的方式进行深度和广度爬取全站数据,可参考相关博文(全站图片爬取),手动借助scrapy.Request模块发起请求。
2.对于一定规则网站的全站数据爬取,可以使用CrawlSpider实现自动爬取。
CrawlSpider是基于Spider的一个子类。和蜘蛛一样,都是scrapy里面的一个爬虫类,但 CrawlSpider是蜘蛛的子类,子类要比父类功能多,它有自己的都有功能------ 提取链接的功能LinkExtractor(链接提取器)。Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适。
项目创建
#创建工程项目:项目名CrawlSpiderPro可自定义
scrapy startproject CrawlSpiderPro
#切换到当前工程目录下
cd CrawlSpiderPro
#创建爬虫文件,比普通的爬虫文件多了参数“-t crawl”
scrapy genspider -t crawl crawlSpiderTest www.xxx.com
#开启爬虫项目
scrapy crawl crawlSpiderTest
初始化爬虫文件解析
class CrawlspidertestSpider(CrawlSpider):
name = 'crawlSpiderTest'
allowed_domains = ['www.xxx.com']
start_urls = ['http://www.xxx.com/']
#爬虫规则rules指定不同的规则解析器,一个Rule就是一个解析规则,可以定义多个
rules = (
#Rule是规则解析器;
# LinkExtractor是连接提取器,提取符合allow规则的完整的url;
#callback指定当前规则解析器的回调解析函数;
#follow指定是否将链接提取器继续作用到链接提取器提取出的链接网页;
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', 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
东莞阳光网(http://wz.sun0769.com/index.php/question/report?page=)全站爬取案例:
1.爬虫脚本crawlSpiderTest.py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from CrawlSpiderPro.items import CrawlspiderproItem class CrawlspidertestSpider(CrawlSpider):
name = 'crawlSpiderTest'
# allowed_domains = ['www.xxx.com'] start_urls = ['http://wz.sun0769.com/index.php/question/report?page=']
#爬虫规则rules指定不同的规则解析器,一个Rule就是一个解析规则,可以定义多个
rules = (
#Rule是规则解析器;
# LinkExtractor是连接提取器,提取符合allow规则的完整的url;
#callback指定当前规则解析器的回调解析函数;
#follow指定是否将链接提取器继续作用到链接提取器提取出的链接网页;
#follow不指定默认False;
Rule(LinkExtractor(allow=r'page=\d+'), callback='parse_item', follow=False),#提取页码
Rule(LinkExtractor(allow=r'question/\d+/\d+.shtml'), callback='parse_detail'),#提取详细信息页面
) def parse_item(self, response):
print(response)
item = CrawlspiderproItem()
tr_list=response.xpath('//*[@id="morelist"]/div/table[2]/tbody/tr/td/table/tbody/tr') for tr in tr_list:
item['identifier']=tr.xpath('./td[1]/text()').extract_first()#解析编号
item['title']=tr.xpath('/td[2]/a[2]/text()').extract_first()#解析标题
yield item def parse_detail(self, response):
print(12345678765)
item = CrawlspiderproItem()
#xpath解析不识别tbody
item['identifier']=response.xpath('/html/body/div[9]/table[1]/tr/td[2]/span[2]/text()').extract_first().split(':')[-1]
item['content']="".join(response.xpath('/html/body/div[9]/table[2]//text()').extract()) yield item
crawlSpiderTest.py
2.itmes.py字段属性定义
import scrapy #也可以定义两个类分别存储,最后在和管道通过编号字段进行汇总对应,然后持久化存储
class CrawlspiderproItem(scrapy.Item): #编号
identifier=scrapy.Field()
#标题
title=scrapy.Field()
#内容
content=scrapy.Field()
pass
itmes.py
3.pipelines.py管道配置
#自定义持久化处理
class CrawlspiderproPipeline(object):
def process_item(self, item, spider):
print(item)
return item
pipelines.py
4.settings.py配置
#UA伪装
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
#robots协议
ROBOTSTXT_OBEY = False
#日志输出等级
LOG_LEVEL='ERROR' #开启管道
ITEM_PIPELINES = {
'CrawlSpiderPro.pipelines.CrawlspiderproPipeline': 300,
}
scrapy框架之CrawlSpider全站自动爬取的更多相关文章
- Scrapy 框架 CrawlSpider 全站数据爬取
CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...
- Crawlspider的自动爬取
引子 : 如果想要爬取 糗事百科 的全栈数据的方法 ? 方法一 : 基于scrapy框架中的scrapy的递归爬取进行实现(requests模块递归回调parse方法) . 方法二 : 基于Crawl ...
- scrapy进阶(CrawlSpider爬虫__爬取整站小说)
# -*- coding: utf-8 -*- import scrapy,re from scrapy.linkextractors import LinkExtractor from scrapy ...
- (4)分布式下的爬虫Scrapy应该如何做-规则自动爬取及命令行下传参
本次探讨的主题是规则爬取的实现及命令行下的自定义参数的传递,规则下的爬虫在我看来才是真正意义上的爬虫. 我们选从逻辑上来看,这种爬虫是如何工作的: 我们给定一个起点的url link ,进入页面之后提 ...
- Scrapy框架学习(四)爬取360摄影美图
我们要爬取的网站为http://image.so.com/z?ch=photography,打开开发者工具,页面往下拉,观察到出现了如图所示Ajax请求, 其中list就是图片的详细信息,接着观察到每 ...
- scrapy框架基于CrawlSpider的全站数据爬取
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- Scrapy框架之CrawlSpider
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...
- 16.Python网络爬虫之Scrapy框架(CrawlSpider)
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- scrapy框架之CrawlSpider操作
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...
随机推荐
- 替换字符串sql
update [表名] set 字段名 = replace(与前面一样的字段名,'原本内容','想要替换成什么') UPDATE `zjl_III_hei_zlj_20151111`.`ctrl_ne ...
- CentOS 7 + Win 双系统的安装遇到的重要问题
前言:对于刚学linux的朋友们,多多小小因为各种原因需要装双系统,亦或者爱好使然.多数是问题解决,第一次装系统者不推荐看-. 那么现在内德在此就说说在本本上装双系统会遇到的问题及其解决方法. 环境准 ...
- Linux利用udev提权
友老催我写个webshell+udev localroot的文章.这周末有点空闲时间,捣鼓了一下.公开的udev exploit有两个.一个是kcope写的SHELL版本,一个是jon写的C版本. s ...
- P1518 两只塔姆沃斯牛 The Tamworth Two(简单的搜索题)
题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它们总 ...
- 图论--2-SAT--暴力染色法模板(字典序最小解) RQ的板子
//暴力DFS,求字典序最小的解,也是求字典序唯一的方法 #include<cstdio> #include<cstring> #include<vector> u ...
- postman(环境设置)
1.点击小齿轮进入到环境变量添加页面,点击add添加环境变量 2.新增环境输入变量名称和变量值 3.添加成功 4.接口中设置变量,切换环境进行传参 5.调用环境变量断言 调用环境变量中的phone变量 ...
- 软件——IDEA 超实用使用技巧分享
前言 工欲善其事 必先利其器 最近受部门的邀请,给入职新人统一培训IDEA,发现有很多新人虽然日常开发使用的是IDEA,但是还是很多好用的技巧没有用到,只是用到一些基本的功能,蛮浪费IDEA这个优秀 ...
- C. Okabe and Boxes 思维 模拟 or 线段树
C. Okabe and Boxes 这个题目是一个有点思维的模拟,当时没有想到, 思维就是这个栈的排序这里,因为每次直接排序肯定会t的,所以不可以这么写,那怎么表示排序呢? 就是直接把栈清空,如果栈 ...
- SpringBoot:模板引擎 thymeleaf、ContentNegotiatingViewResolver、格式化转换器
目录 模板引擎 thymeleaf ContentNegotiatingViewResolver 格式化转换器 模板引擎 thymeleaf.ContentNegotiatingViewResolve ...
- Spring源码阅读 之 bean的注册
在前面我们已经学习了配置的加载,读取,解析.现在我们已经能够将一份配置转变成对应的一个个beandefinition了,我们知道Spring是一个IOC的容器,那么我们如何将这个一个个beandefi ...