记录爬取数据中网站的骚操作

记录爬取数据中网站的骚操作

三月 13, 2020

1.剔除方式进行请求

最近有需要爬取斯语的需求,于是找到了一个神奇的网站,但是网站发送的请求让人摸不到头脑,发送的请求的data是如下的样式

1
2
3
4
5
6
7
8
section_id: 2
exclude[]: 340753
exclude[]: 322067
exclude[]: 345753
exclude[]: 345569
exclude[]: 345723
exclude[]: 345713
exclude[]: 345667

起初脑子不动直接猜测是传数组进行页面的请求,但是返回的页面总是不对劲,因为一开始是在原网页的源文件上查找的,所以传进去的参数都能找到,查看返回的信息有一行参数也是一个数组,返回的内容如下

1
excluded: ["340753", "322067", "345753", "345569", "345723", "345713", "345667", "345701", "345705", "345703",…]

直接查找数组里面的id,在原网页上是存在的,和发送的data中的数组比较了一下发现,返回的数组明显长度比发送的长,盲猜是网页每次发送包含不同id的数组给后台来填充,然后通过填充好的数组id来发送相应网页。
期间读了一下response的数据,发送的数组中的id好像不在里面,但因为没有考虑到剔除,所以没有太在意,就是因为没有太在意就炸了,在postman中进行请求后继续对比,一直在找发送的数组和接收的数组之间的关系,突然查到exclude是不包含的意思,在postman上又搜索了一下发送的数组id,发现发送的id并没有在返回的数据中。
终于想到了正确答案,又测试了几遍发现,该网站请求方式是通过收集已经展示过的页面id回传给服务器,服务器按顺序发回剔除回传id的30个数据,按顺序是因为在post相同数据的情况下,服务器给的信息是一样的,同时给网页传送当前返回的30个数据的id加上页面上发送的id,作为页面下次请求时发送的id数组。
这种方式如果新闻看多了的话我感觉不仅会占用内存,而且还会返回大量的数组数据占用带宽,一定程度增加服务器的压力,真的是个神奇的方式,一脸懵逼。

后续:通过这种方式跑到最后并没有多少数据,因为当请求剔除数据的数组长度达到1030后返回的页面中就不再更新新的数据了,而是返回和上一个数据同样的数据,推测造成这种原因的是两点,一点是因为对方的数组没数据了,所以造成了这种情况,另一点是因为对方服务器防止请求数据长度过长做出的限制,估计他们也认为没人会看一千多条新闻吧ヽ(ー_ー)ノ,不过我还是比较倾向于第一种猜测,因为最后一个网页的图片视频资源已经被网站后台删掉了,而且前一个文章的按钮做成了当前页面和另一个页面的循环。