用程序揭露生活中的骗局!

黑马程序员上海

月薪一万只是起点

关注

事情

起因

前一阵突然收到了这样一封私信:

假约稿,真广告!!!

写文章也有一段时间了,这种私信收到了不少,基本都是打着约稿的旗号来骗关注的。

其实个人觉得主动要求别人的关注没有问题,但是应该明目张胆、大张旗鼓的才对,哪能这样鬼鬼祟祟,企图瞒天过海?

看了看这个作者,居然还是个专题编辑呢。

所以我就试探的问问她,既然想约稿,那么到底有没有看过本人的文章。

那么现在问题来了,本人的文章也有将近1500个赞了,其中到底有没有这位同志的赞呢?自己手动去看看?这可不是程序员的答案!本人使用两种方法来解决这个实际问题!

1

Python爬虫

获取用户timeline:

我们可以知道,url就是用户的timeline,但是页面默认只展示一部分,更早的timeline是浏览器下拉后获取的。用浏览器的开发者工具可以看到请求信息。

page这个参数显而易见,那么max_id是怎么来的呢?首先要看看这些请求是哪里发出来的。

再看看s函数,终于找到了max_id的获取方式

max_id可以根据最后一个li元素的id属性获得

利用requests库进行爬取:

requests库就不多介绍了,这里注意两点:

要手动设置请求的header,来模拟正常浏览器

ajax请求要设置额外的header,来模拟下拉刷新

对每次请求下载的response,使用lxml解析,然后利用xpath获取最后一个li元素,进而计算max_id。再用计算出的max_id发起新的请求。

当返回的文本中包含“加入了简书”则停止爬取。

爬取结果分析:

爬取了该用户的所有动态,存储到了一个文本文件中,在其中搜索“大神带我来搬砖”,未找到任何结果。

所以该用户根本没给我点赞过。

源码:

2

测试工具selenium

实际上对于动态加载的数据来说,用程序爬取比较困难,在这种情况下,可以使用selenium来模拟浏览器行为,达到同样目的。

安装好python之后,利用pip命令安装selenium,下载浏览器对应的driver就可以进行了。这次我们需要用selenium打开某个用户的timeline页面以后,一直页面下拉,直到页面中出现“加入了简书”。

selenium进行页面滚动:

平时我们都是用鼠标滚轮在浏览器中进行页面滚动,在selenium中,同样可以模拟鼠标操作。但是这次我们采用了javascript来进行页面滚动。滚动代码如下:

step是页面滚动的像素,step每次会增加,这样就实现了页面自动向下滚动。

关闭chrome浏览器自动加载图片:

浏览器默认是加载图片的,为了提高速度,此处要禁止chrome加载图片。

使用headless模式运行chrome:

发现加载了太多的动态之后,浏览器还是会卡死,这时可以考虑用headless模式运行chrome。headless模式下的chrome不会出现用户图形界面,因此速度更快。

删除页面上元素:

在使用了headless模式后,发现浏览器最后还是越来越慢,应该是因为页面上元素太多,渲染不过来造成的。这时想到了用javascript删除页面元素。注意,需要保留最后一个li元素,以便计算max_id。

将这段JS代码在selenium中运行即可。同时由于页面元素会被删除,页面滚动的代码也要做一些调整,需要先返回顶部,再向下滚动,以防下拉刷新没有触发。

爬取结果分析:

在爬取的动态中搜索,还是找不到“大神带我来搬砖”

这次的代码其实有几个缺陷:

selenium无法取得页面动态加载状态,因此需要设置一个较长的sleep时间,保证页面加载完成。

因为每次需要保留最后一个li元素,爬取下来的动态有重复的。

源码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180820A1COY400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动