在前面的文章我们已经了解到了web端页面中存在的常见反爬手段,以及几个常见的加密算法,那么本篇文章主要就是以一个入门级别的网站作为案例带领大家去分析如何定位到我们所需的参数,以及将其改写为Python中的可执行代码。
一、需求定义
目标网站:aHR0cHM6Ly96aG9uZ2Nob3UubW9kaWFuLmNvbS9hbGwvdG9wX3RpbWUvYWxsLw==
目标数据:任意详情页中的评论信息。
二、页面结构分析
分析页面结构时不要管页面复杂还是简单,直接打开开发者工具然后刷新页面抓包进行分析。
2.1 主页分析
要进入到详情页获取目标数据,那么在主页就需要我们的代码能够提取出详情页的url再进行访问,所以,对于主页来说就要知道详情页的URL在主页是静态存在于页面中还是以异步加载的方式加载在主页。判断方式很多,但是最准确的我们直接抓包之后在开发者工具network中的DOC下找到当前访问页面的HTML文档,如果目标数据存在于该数据包中则证明目标数据在当前页面是静态存在于html文档之中的。如下:
从上图中明显可以看到详情页的url是静态存在于主页,那么我们直接对主页的URL发起请求则能够直接获取到详情页的url。
2.2 详情页分析
以页面中《古蜀华章》为例,点击进入其详情页,待页面加载结束之后再打开开发者工具,然后刷新页面进行抓包。
获取到数据包之后,以同样的方式先判断目标数据的加载方式。也可以通过预览的方式来进行判断。
如图,通过预览发现当前页面中并不存在评论,但是实际上是有8条评论的。这也就意味着评论数据是以异步加载的方式加载于当前页面。所以我们便可以直接定位到XHR进行分析,如下:
定位过来之后,可以发现数据包存在多个,所以要找到目标数据所在的包的话,就需要我们一个一个去打开查看,那如果数据包有几百个上千个呢?所以我们不用逐个查看,直接点击Name然后按CTRL+F从抓到的包中去进行搜索关键字。如下图所示:
点击打开数据包后进一步分析,如下:
然后再看目标输入所在的这个数据包的url
到这里其实就已经很明显了,此处的api便是评论信息的接口,而响应的内容则由携带的参数进行控制,那么在这个url中携带了这么多个参数哪一个才是控制不同的物件的评论呢?此时就需要我们去逐个尝试了,由于在前面的文章已经讲解过如何判断参数的必要性,所以本篇文章中不再详细分析,此处我们需要的正是pro_id,而pro_id的值便可以从详情页的url中进行提取。
如下所示:
到这里,结构分析结束,接下来实现代码。
三、代码实现
3.1 提取详情页url
要提取详情页url,那么我们就需要先对详情页url所在的地址发起访问才能够获取到响应内容从而提取出详情页的url,那么这部分的代码就可以如下进行编写。注意:刚刚已经对网站进行过分析,此处一些常规性的信息就不再截图展示,例如:主页的url获取。
...
def indexDeal(indexurl, headers):
response = requests.get(indexurl, headers=headers) # 访问主页
print(response.content.decode()) # 输出响应内容,是一个HTML
...
那么,要从HTML文档中提取出目标详情页的url的话,便可以使用到xpath来进行提取了,代码如下:
...
def indexDeal(indexurl, headers):
"""主页处理函数"""
response = requests.get(indexurl, headers=headers) # 访问主页
tree = etree.HTML(response.content.decode())
detail_url = tree.xpath('/html/body/div/div[2]/ul/li[2]/div/a/@href')[0] # 解析出详情页的url,此处为古蜀华章,请根据实际情况修改
pro_id = detail_url.split('/')[-1].split('.')[0] # 经过两次分割提取出pro_id,当然也可以直接以切片的形式提取
print(pro_id)
return pro_id
...
现在,详情页url有了,那么就可以直接获取参数pro_id了,当然,不要提取到参数之后要将其携带再去请求。
3.2 请求评论url
在获取到pro_id之后,将其余其他固定参数同时构造然后再去发起请求,代码如下所示。
...
comment_url = 'https://apim.modian.com/apis/mdcomment/get_reply_list'