Scrapy-Redis分布式爬虫常规操作
一、X-path 的常规用法
1、/是从根节点选取,有顺序
2、//从当前节点选择文档中的节点,无顺序
3、.选取当前节点
4、..选取当前节点的父节点
5、@选取属性
6、 //div[@class='doclist']/a
选择class属性为doclist的div标签下的所有a的标签。
a[1]是选择第一个,a[last()]是选择最后一个。
a[possition()<=3]是选择前3个a标签
7、//ul[@class= "b_listul"]/li[2]/following-sibling::ul[1]
选择ul/li[2]标签的同级第一个ul标签;
preceding-silbling::li[1]是选择ul标签之前的。
8、//book/title | //book/price
选取book标签下咋所有title和price标签。
9、//div[@class = 'doclist']/a/text()
选择a标签的文本内容。
a/@href是选择a标签的href属性内容。
10、string(//ul[@class = "b_listul"])
取//ul[@class = "b_listul"]标签下的所有文本内容。
----------------------------------------------------------------------
二、redis的相关命令
1、keys aa*
查看所有的以aa开始的redis_key
2、flushdb
清空redis数据库,即清空所有的redis_key
3、redis 中存在两种数据格式 (key 指向的value是一个集合list/set)
(1)、list集合,value是以list集合存在,特点是有序,可以重复
如 lpush name age 将name作为key, age作为value存入list集合中的最左边(即list中第一位)
rpush name age 将name作为key, age作为value存入list集合中的最右边(即list中最后一位)
如 lrange name 0 10 查看key=name 指向的value集合中,下标从第0位-第10位(前10个)元素中,key=name 的value值
没有rrange
如 llen key_name 查看key_name中value存在的个数
(2)、set集合,value是以set集合存在特点是有序,去重
如 sadd name age ,将name作为key, age作为value存入set集合中
如 scard key_name 查看key_name中value存在的个数
4、del key_name
删除某个key,对应的value也会被删除
5、rename old_key_name new_key_name
重新命名key_name
----------------------------------------------------------------------
三、MongoDB常用命令(这里要看个人的习惯,平时采集到的数据我都放在了MongoDB里)
1、show collections
查看所有的集合(表)
2、db.tb_name.findOne()
查看tb_name表中的一条数据
3、db.tb_name.find().pretty().limit(100)
查看100条数据,并美化输出结果
4、db.tb_name.find({'doctor_name':'叶定伟'})
查看医生姓名为叶定伟的所有数据
5、db.tb_name.count()
查看tb_name表的数据量
6、db.tb_name.drop()
删除tb_name表
7、db.tb_name.remove({consult_time:/天/})
删除tb_name表中,字段consult_time中包括"天"的数据(这里是模糊匹配)
8、db.tb_name.find().
forEach(function(x){
db.new_tb.insert(x);
})
将tb_name表中的数据备份到new_tb表中
9、db.table_name.update({}, {$rename:{"旧键名称":"新键名称"}}, false, true)
参数提醒:
第一个false表示:"如果不存在update的记录";(可以换成)true为插入新的记录,默认是false,不插入。
第二个true表示:mongodb默认是false,只更新找到的第一天记录;如果这个参数是true,就把按条件查出来的多条记录全部更新
10、db.旧表名.renameCollection('新表名')
修改表名称
----------------------------------------------------------------------
四、小结
1、strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
2、.extract 返回一个list(就是系统自带的那个) 里面是一些你提取的内容
Scrapy-Redis分布式爬虫常规操作的更多相关文章
- 16 Scrapy之分布式爬虫
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- scrapy补充-分布式爬虫
spiders 介绍:在项目中是创建爬虫程序的py文件 #1.Spiders是由一系列类(定义了一个网址或一组网址将被爬取)组成,具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. #2.换句 ...
- Scrapy 框架 分布式 爬虫
分布式 爬虫 scrapy-redis 实现 原生scrapy 无法实现 分布式 调度器和管道无法被分布式机群共享 环境安装 - pip install scrapy_redis 导包:from sc ...
- scrapy简单分布式爬虫
经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网 ...
- scrapy进行分布式爬虫
今天,参照崔庆才老师的爬虫实战课程,实践了一下分布式爬虫,并没有之前想象的那么神秘,其实非常的简单,相信你看过这篇文章后,不出一小时,便可以动手完成一个分布式爬虫! 1.分布式爬虫原理 首先我们来看一 ...
- 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验
一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...
- 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验
一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...
- 爬虫--scrapy+redis分布式爬取58同城北京全站租房数据
作业需求: 1.基于Spider或者CrawlSpider进行租房信息的爬取 2.本机搭建分布式环境对租房信息进行爬取 3.搭建多台机器的分布式环境,多台机器同时进行租房数据爬取 建议:用Pychar ...
- 基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL
为了学习机器学习深度学习和文本挖掘方面的知识,需要获取一定的数据,新浪微博的大量数据可以作为此次研究历程的对象 一.环境准备 python 2.7 scrapy框架的部署(可以查看上一篇博客的简 ...
随机推荐
- microk8s
https://microk8s.io/ video guide: sudo snap install microk8s --classic #snap install microk8s --clas ...
- JavaWeb学习路线
一.三大组件介绍 javaweb在开发中有三大组件分别提供不同的功能,这三大组件为servlet,filter,listener 1.servlet 简单来说就是客户端请求服务器和接受服务器的响应,狭 ...
- mybatis的配置和使用
mybatis的配置和使用 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
- Hibernate4集成spring4报错----No Session found for current thread
在编写一个Hibernate4集成spring4的小demo的时候出现了该错误: org.hibernate.HibernateException: No Session found for curr ...
- ABP入门系列(3)——领域层定义仓储并实现
ABP入门系列目录--学习Abp框架之实操演练 一.先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取.仓储接口在领域层定义,而仓储的实现类应该写在基础设施层. 在ABP中 ...
- HttpClient 调用WebAPI时,传参的三种方式
public void Post() { //方法一,传json参数 var d = new { username = " ", password = " ", ...
- c++ 获取磁盘句柄
磁盘的句柄可以用CreateFile函数获得.获得句柄后,就可以配合其他函数对磁盘进行一些操作. int main() { HANDLE hFile = INVALID_HANDLE_VALUE; h ...
- 【RL-TCPnet网络教程】第4章 RL-TCPnet网络协议栈简介
第4章 RL-TCPnet网络协议栈简介 本章节介绍RL-TCPnet网络协议栈,让大家对 RL-TCPnet有一个整体的了解,RL-TCPnet是一款小型网络协议栈,适用于 ARM 内 ...
- 实战经验丨PHP反序列化漏洞总结
又到了金三银四跳槽季,很多小伙伴都开始为面试做准备,今天小编就给大家分享一个网安常见的面试问题:PHP反序列化漏洞. 虽然PHP反序列化漏洞利用的条件比较苛刻,但是一旦被利用就会产生很严重的后果,所以 ...
- JNI实战(一):JNI HelloWorld
使用最新Android Studio的Cmake,创建一个Native C++项目后,我们就可以看到JNI的Hello World的项目及示例代码了. JNI的项目代码,分为三层:Java层,C++层 ...