怎样抓取网页数据(做一个校园新闻小程序的时候需要获取点击量来排序)

优采云 发布时间: 2022-04-16 17:11

  怎样抓取网页数据(做一个校园新闻小程序的时候需要获取点击量来排序)

  项目场景:

  制作校园新闻小程序时,不仅要获取新闻内容,还要获取点击排序。爬取静态数据很容易,但是爬取动态数据就麻烦一些。

  问题描述

  例如,当我们抓取这个网页时

  

  打开开发者工具查看点击次数

  

  但是我们爬取的内容是这样的

  

  为什么点击不显示?

  原因分析:

  我的理解是这样的,因为点击量是随着网页的刷新而不断变化的,而新闻内容是固定的。所以点击次数会通过一个函数不断更新,所以静态网页内容不显示这个数据是合理的。

  解决方案:

  要获得此类数据,您必须首先找到数据。好在点击次数在比较中是独一无二的,是一个数字。当然,你不能直接打开开发者工具,在“元素”中搜索。找号码的来源,这个动态数据一般是在“网络”中的XHR或者JS文件中找到的,比如这个(记得刷新再找!)

  

  在这个杂乱无章的返回中,我们想要的点击是在最后几次点击中。当然不再是那个781了,不过没关系,我们很容易就找到了(大多数情况下不是,但是readClick这个词太明显了!)

  预览是我们发送请求得到的数据,点击放在这个数据的末尾。那么我们只需要发送一个请求来获取这个数据,然后使用正则表达式来提取803的点击量。

  

  然后是请求的参数。此参数有时位于标题的底部,但不在此处。其实负载就是这个请求的参数。

  

  我们来分析一下参数。如果你只是想获取这个网页的动态数据,直接复制就好了。

  from sqlite3 import Date

import requests

import random, time, sys

headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36 Edg/100.0.1185.29'

}

params = {

'callCount':'1',

'nextReverseAjaxIndex':'0',

'c0-scriptName':'Ajax',

'c0-methodName':'readClick',

'c0-id':'0',

'c0-param0':'string:1649408845878',

'batchId':'0',

'instanceId':'0',

'page':'%2Fcolumn%2Fh_26_yi%2Fcontent%2F1649408845878.shtml',

'scriptSessionId':'5eSlySH4R9SBWHfCeP6lNqg1u0JcgKn5m1o/mvq5m1o-GDTnJP$nz'

}

res = requests.post('https://news.hutb.edu.cn/dwr/call/plaincall/Ajax.readClick.dwr', headers=headers, params=params)

print(res.text)

  

  我们来分析一下这些参数。c0-param0 和 page 在不同的新闻中是不同的。不同的是它们是第一个消息,以及如何写参数。比如这个新闻网址是,那么最后8位就是这两个参数的实际参数(也许这个数字并不是新闻的条数,毕竟太大了!)

  然后是scriptSessionId。在比较不同的新闻页面时,发现他们'/'之前的字符是一样的,不同的是'/'之后的字符,所以我搜索了这个参数

  

  让我们搜索'/'之后的参数

  

  很明显,这个参数是由当前时间和一个随机数决定的,而tokenify我认为是一个编码函数。既然和随机数有关,传参数的时候可以忽略这个参数,写一个随机值吗?咱们试试吧:

  

  结果是这样的

  

  所以在抓取网页的动态数据的时候,首先是找到这个值(因为有搜索选项,大部分时候很容易找到),然后就是参数的问题,或者说是load。如果要爬取多个页面的动态数据,弄清楚这些参数的含义,或者说它们的特点是非常重要的,这样你才能传递正确的参数来获取你想要的数据。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线