深度爬取网易Lofter的爬虫

这里的Lofter的工作是公司要的。主要目的是爬取大量用户的相册,之后做计算机视觉的训练集来用的。个人感觉这个是爬虫很常见的一个作用领域。(不过说实话,还是感觉有点low,觉得爬虫还是比较底层的工作。)

说回lofter。像这种爬取图片的一般都不难。但是Lofter这个网站,难就难在了其网页中用时间戳来做一系列的包参数,如果没有仔细研究的话,还是不好请求到包的。

下面看一下我是怎么完成整个工作的。

 

1. 爬取个人主页所有博客里面的照片

这里我借鉴了别人的工作基础。原帖见https://www.imooc.com/article/36533

如果你认真研究完这个帖子,并且写一点代码来试一下里面关键的几步。就会明白里面包请求的规律。具体规律不赘述。

这里再根据我自己需求对代码做一些改变。并且加入协程来加快图片的下载速度。

这个部分对应的脚本是 lofter_spider_NameList_Concurrency.py

 

2. 从首页获取用户ID.

在上一步工作的基础之上,我们已经可以爬取某个用户主页里面的照片。要想获取大量的数据,只需要获取大量的用户ID即可。

这里我们从lofter的精选页http://loftermrjx.lofter.com/出发。可以看到这里面有推荐的照片。

深度爬取网易Lofter的爬虫

点击进入第一个推荐照片,可以看到,下面有很多喜欢或者点赞的人。打开浏览器的调试工具(Chrome是F12),向下滑到最底部,点击底部的“查看更多”按钮,

深度爬取网易Lofter的爬虫

这个时候可以看到弹出来的包里有一个XHR触发的包。

深度爬取网易Lofter的爬虫

点进去这个包看一下响应(Response),你就可以看到这些点赞的人的信息。

关键怎么获得这个包的数据,一般来说是需要get请求加上headers的。不过先看一下这个包的请求地址

深度爬取网易Lofter的爬虫

可以看到这个url= http://loftermrjx.lofter.com/morenotes?postid=280691700&offset=50,试着直接从浏览器访问一下,你会发现可以直接访问到这个页面,然后源码里可以看到详细信息。

深度爬取网易Lofter的爬虫

红色方框里的就是我们想要的ID,就是那个" loup6 "。

到这里,我们再观察一下上面的点赞人对应的url,发现只有一个参数是未知的----postid。下面就要考虑怎么获得这个postid。其实很好理解:postid是针对每一篇发布的博客来说的,所以进入某个用户的归档页面(如果你认真研究了第一个部分中的内容就知道我在说什么),随便点击一篇博客,然后查看网页源码,搜索一下postid关键字,你就会看到其实postid就包含在源码内

所以就很简单了,在用户的主页内遍历其所有的博文的同时,就可以获得postid,也就可以获得给这篇博文点赞的用户的ID。由此辐射,这个速度是非常快的,而且基本是停不下来的。

这里有一个问题就是说用户ID去重的问题。这里我用了Redis数据库中的Set,把爬来的用户ID写入对应数据库的set,在写入的时候由于set不含重复元素的特性,数据库会自动帮你去重,所以不用考虑爬取到重复的用户Id的问题了。

 

3. 其他

理论上来说,有了上面两个部分的工作,你已经可以爬取lofter全站所有用户的相册了。听上去是不是很酷。不过这需要很多时间。而且也没有人用自己的电脑这么做(太弱智了),一般都是放在线上的服务器做这个工作。同时你也需要很大的存储来存拿到的数据。

4. 总结

在我的工作中,我在自己的电脑上用一个周末爬到了268w用户ID,然后写了脚本把数据库导出成为json数据,然后在服务器中又重新读json数据到线上服务器的数据库中。

之后在线上服务器中,用Redis的List作为任务队列,通过Lpop()命令读取数据库中的用户ID。

lofter_spider_NameList_Concurrency.py脚本通过pm2做进程守护(具体操作可以见我的其他博文)。之后就是时间和存储的问题了。

 

所有脚本和源码见以下

脚本和源码

请尊重原创!!!!!!!!

如果你要转载,请以醒目的标识著名源地址。

你也不想自己用心做的东西被剽窃。