美文网首页python爬虫系列
利用scrapy进行八千万用户数据爬取与优化(一)

利用scrapy进行八千万用户数据爬取与优化(一)

作者: 星星在线 | 来源:发表于2018-06-07 21:54 被阅读0次

    最近准备把数据分析这块补一下,加上一直在听喜马拉雅的直播,有一个比较喜欢的主播,突然萌生了爬取喜马拉雅所有主播信息以及打赏信息,来找一找喜马拉雅上比较火的主播和有钱的大哥,看看这些有钱人是怎么挥霍的。

    爬取信息分析

    打开喜马拉雅的主播页面,查看人气主播

    第一个是喜马拉雅好声音,官方的账号,很多人的喜马拉雅账号应该会默认关注这个。我们看到粉丝关注数有八千多万,实际的喜马拉雅用户量肯定超过这个数值,我们暂且估计可爬取数量为一亿,主播页面只显示50页,每页20个用户,我的思路是爬取显示的主播信息,进入主播主页

    爬取相关信息,然后查看粉丝信息

    粉丝页只显示10页,每页10个用户。虽然看起来不多,但是我们可以进行扩展,每个粉丝点进去后又是一个用户主页,又可以爬取他的粉丝信息。就这样一直进行扩展,然后使用去重处理,过滤已经爬取过的用户数据。

    我们要爬取的数据:用户名、简介、粉丝数、关注数、声音、专辑数。

    另外还有赞赏信息需要通过APP抓取,我们先抓用户信息吧。

    爬取技术选择

    这么大量的数据爬取,优秀的框架是必不可少的,我们就使用大名鼎鼎的scrapy框架为基础来进行爬取。另外分布式爬取也是必不可少,虽然我没有那么多机器去做,但是我琢磨了一下,百度云、阿里云、腾讯云、华为云等一系列云服务器新用户都有几天试用期,这集群机器不就有了吗?嘿嘿

    数据库我们使用MongoDB,因为我们的数据并不要求多精确。Redis肯定是必选了。但是作为内存数据库,占用内存的大小这就是我们必须要考虑的。我们的去重过滤都是放在redis中的,所以必须对齐进行优化。具体原因请看:

    redis存储为什么必须优化?

    我先在自己机器上抓取了部分数据,查看redis中的请求列表和去重列表

    从请求列表中的数据量可以知道下载还是比较慢的,这就是为什么我们要用分布式进行爬取了。然后再看去重数据,七十五万条。不大的数据量,但是看下内存占用情况。

    执行删除语句flushall后,再查看内存使用情况

    在我8G内存的Mac上占用260M的内存可以忍受,但是在我那可怜的只有1G的云服务器上,卡到我都快链接不上了,我们可是以八千万数据为目标的,实际才爬取了二十多万条有效数据,去重记录都七十多万了,如果到了一亿条数据,以目前的情况来看,卡爆服务器也到不了。

    本来还有一个xmla:items结构,存储我们的抓取数据,我把它提取到了MongoDB当中。xmla:requests中是待爬取请求列表,我们爬取下载的时候这个数据量还是会逐渐减少的,至少不会无限增大。但是这个xmla:dupefilter中存取的是去重数据,每一次请求都会记录下来,所以这个数据只会随着我们的爬取一直增大。那么这就是我们要进行优化的重点。

    下面我们来规划一下下来要做的事情,按步骤来:

    1. docker环境安装部署
    2. redis集群配置操作
    3. 用户数据抓取流程分析
    4. 用户打赏信息抓取流程分析
    5. 使用BloomFilter修改scrapy-redis,减少过滤内存占用
    6. 反爬处理:IP代理池、User-Agent池
    7. 使用Gerapy和docker部署分布式环境
    8. 抓取数据清理,数据分析规划

    后面我会按照这个步骤来进行操作,如果有其他的需要额外处理,再进行增加。另外要特殊说明一下,所有的文章和分析包括源码最后都会放在我的公众号内,简书上视情况而定,尽量小范围传播,就不大范围扩散了,不能给网站增加太多负载。如果想看所有过程的,可以关注我的微信公众号,尽请期待。

    微信公众号

    相关文章

      网友评论

        本文标题:利用scrapy进行八千万用户数据爬取与优化(一)

        本文链接:https://www.haomeiwen.com/subject/ipcssftx.html