scrapy,学到了redis框架后,给scrapy引入了scrapy-redis组件,分布式组件,应用了redis的特点。
scheduler是scrapy框架提供的,是内存中的结构,用来保存请求对象,去重。
现在想把相关数据放到redis中去,不再用以前的scheduler,可以用redis的set去重,从redis取出这些请求,发起下载的请求,下载之后给spider继续处理,当再次提取请求,给scheduler,实际上就是给redis。如果数据给item pipeline,可以选择将数据存入redis,redis就可以将item一条条塞到redis当中
需要一些依赖
在整个scheduler准备存储请求队列放在reids中,以前的队列在scrapy框架中存储的,现在放到了redis中
重复之后如何filter的问题,也就是说这是去重组件
最后如果拿到了一个个item,想要塞到redis里,就要写一个pipeline,这里帮我们写好了,直接调用一下即可
这个key比较重要,可以自己设定下,也可以用缺省
链接redis的地址端口
可以在配置文件给出,或者不给出,如果不给,会有动作等着你给出
scheduler本质上是普通队列,改成了redis,可以提供多爬虫多进程共享,并行能力增强。
duplication filter scrapy本质上使用ste来去重。reids里就用redis的set来去重
item pipeline,提供了一个增强的组件,可以将我们的item存入到redis中
base spiders,提供了一个基本使用的基类,我们以前使用的是crawlspider,spider,也就是scrapy提供的是spider类或者crawlspider,这里提供了redisspider,如果使用了crawlspider现在就要用redisspider,因为这样就把起始的url改了,以后就跑redis的scheduler去读数据了
这次准备爬取影评
有些公司就关注热门电影,然后可以卖卖周边
模拟找到第一个
提取链接点击进来
影评在下面
这个链接中间有3878007
两个url就是后面部分的差异
如果分析到了电影首页的url,评论的url地址就也知道了
我们就可以分析围绕这不电影的经常出现的词汇是什么
看一下后一页的地址
start类似偏移,limit类似限制
测试下来limit好像没什么用
start改成400就要求你登录了
实际上能给显示的就这么多了,有些的网站反爬就这样,不给你了
虚拟环境,指定一下虚拟环境,下一回在部署的时候到里面把一些依赖的库,install-all把requestments导入进去
用当前目录作为项目根目录
看一下有什么模版
装了scrapy-redis后,并没有提供第三个模版
还是用crawl模版,这样可以继续提取
第一页就是0
起始页作为第一页,从这开始就要分析内容,其实主要是分析后一页元素就可以搞定了
其实就是下一页下一页提取就可以了
这是官网
redis启动了,这样我们就可以使用
现在是主的状态,把数据清理掉
在配置文件里加上,scheduler到redis里去,去重也是用scrapy-redis提供的类
user-agent和遵守robots协议改一下
整个持久化是scheudler的持久化,爬完之后是否从scheduler中清除
这个pipeline比较重要
默认的pipeline是什么都不做,默认往后一扔
做一些操作,需要抢在它前面执行,在redis存贮之前,要自己写pipeline在它之前把事情做完即可
链接地址也需要改下
要什么数据需要解决掉,我们需要短评short数据
这样直接拿到了20条数据
这样更加保险点
从start_urls开始爬取第一个页面,到下面提取前一页后一页,放到redis scheduler中放到redis中
最好把item写一下
一个斜杠直接取就可以了
上面取出来是selectorlist,要把data属性抽出来,变成普通列表,普通列表一般要第一个,列表中的第一个元素拿出来
我们把数据爬过来到redis,这样别人就可以进行建模来分析,打印一下看看
现在准备爬了
现在就爬到一大堆数据
这次爬的慢点
这里就有东西了
这里是什么可以拿出来
再慢一点
在增加,有点类型md5之后的东西,有人给你去重
这里是set,不然不set,无法去重,到最后下一页都是空白,几次之后,提取不到信息,就整个程序下载结束
爬完数据就没了
之前取的名字是这个作为前缀的
这是用传统方式,只不过告诉scheduler变了,如果用的是redisspider,清用它redisspider的子类,
如果用crawlspier,在前面加redis即可
基于这个,要解决parse,还要解决回调函数的问题
现在就卡住了,告诉你数据的起始url放到一个地方去,放到redis当中去
现在这句话相当于没用了
使用这一句,把url推进去
从左推和右推都一样,会挨个将里面的url从列表里拿出来
再执行一次
敲一下
现在就开始爬了
现在强行终止,里面都来不及清理
现在是我们要往里面注入一个起始的url,从起始开始,将起始得到的数据,按照我们的处理返回
打开一下pipeline
重新爬取
再次给起始url
现在itempipeline就帮我们得到了信息
这边爬完之后,也就没有必要保留了
403代表你要登录了
现在就拿到这么点数据,item会保留下来,dupefilter爬取完之后会消失,这个item就是数据源,可以认为这个redis在这里更像是一个队列
爬取将数据一个个爬过来之后,打到redis队列里,有我们爬取的一个个item
这些item爬取之后,我们就要分析了,现在能读取到两样东西
只关心reviewer,这是个list,lrange从0,-1全部取出来,但是实际读出来的时候,最好分批读,现在读到的内容,最后返回的是一个列表
现在拿到reviewlist,看看里面打印出来是什么类型,是bytes,bytes说白了就是字符串,拿到的就是评论的字符串
打印一下评论字符串,这个里面是中括号,可以json一下
json.loads就转到我们想要的数据了
怕出错可以try一下
拿到review之后要提取出里面的数据
数据好像有些不对
这样打印就一行行整齐了
换行符,看一下文本
有些爬虫就定期的对热点电影进行爬取
进入到电影的详情页,再点进去就是评论页
用这种方式就可以提取影评了
创建一个爬虫就开始编写
按照官方的意思要换掉,换掉之后就卡着了,需要一个启动的东西
启动的东西就是这个东西,我们lpush就可以写进去了,一般启动一下让爬虫继续爬就可以了
这样就开始爬取,如果要存储到redis种,下一步我们要进行分析redis里的item数据,然后对数据进行分析
我们使用的中文,跟拉丁字母最大区别就是,他们的字不能链接在一起,连在一起没办法读了
比如按’来‘,还是‘来到’分词,中文分词是很麻烦的事情
,中文分词是很麻烦的事情,
中国煤 都是
中国 煤都 是,拉丁语系分支出来了法语,意大利语,德语,他们都是拼写的,我们中文是方块字,所以中文的分词要专门的工具,现在有一个比较好用的jieba分词
它提供了几种方式,
精确模式
全模式,把句子中所有可以成词的词语都扫描出来,但不能解决歧义
安装
主要功能就这几个
现在测试一下全模式,把几乎成词的都提取出来
精确模式,就是缺省模式
json后面是一个可迭代对象,应该是调用cut方法切出来的
generator是个生成器,cut是生成的一个生成器
这两个效果是一样的
lcut,这个l是list,就直接变成了一个list
下面也改成l的版本试试,搜索引擎的模式就尽量关键词多,竟可能 去里面提取出来常用的keyword提取出来使用。可以把keyword做成索引,以后计算,就跟这条语句有一定关系
我们使用cut版本,精确模式就够了,生成器版本更加方便点
现在到redis里进行分析,切换之后是一个个词,这边做下单词统计
取倒排前10名,不反转是升序的,所以要反转,但是前面的我们并不想要
可以建立一些词,是非必要的,放在列表里,比如的 啊,这样的冠词虚词 ,停用词,符号,全角半角字符
现在第一件事就是读取停用词
先读取停用词
可以用rstrip顺便把后面的换行符删除
前面的可能有用
做文件操作的时候,最好指明编码,这样就拿到了停用词
将这些词汇全部加到停用词里
下面就可以取消注释,读取redis数据,提取之后将单词进行统计
如果不在停用词中才有必要去记录一下
现在把空格去掉
把空格加下,反正set去重
现在才是稍微有点意义,明显感觉还往是dc电影
顺便把\n也去掉了
现在就得到了词的统计值
现在原来的文章排除掉了停用词,提取出比较有用的词做相应统计,map之后统计,然后reduce,最后排个序
有一个词云
比重大的,有些网站就用词云来展示
在这里用这种方式就可以创建了
在画图里面很有名,matplotlib,pandas,分析领域的,开始安装
最常用的方法,现在我拿到了词的统计数,没有拿到频率
这是一些参数
词以及它的频率,应该是所有统计词的count值,所以之前算一个total值,这样一遍就知道了统计多少个
打印一下频率
有了这个频率就可以用词云了
用的时候按照这种方式来用
把matplotlib引进来
wordcloud提供了一个函数
坐标系就不打印了,imgshow就是图显示在坐标系上
就这个东西
往大了调
这样就清楚点,这样商家就可以根据这些基础热点做一些商品推荐
现在redis可能在修改开源协定,因为有些云厂商太过分,这个词云也是有些是收费的
其实scrapy爬取是没什么,剩下是如何分析的问题,通用的存放数据的文件系统,stech,这些分布式文件系统可以跨物理磁盘,逻辑来组织你 存储,这样可以 把海量数据放在分布式文件系统中,到时候可以直接分析磁盘上存储的数据