爬虫 - 使用Ajax爬取电影票房数据

2023-11-02 20:50

本文主要是介绍爬虫 - 使用Ajax爬取电影票房数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Ajax 是一种使用 JavaScript 发起异步请求的技术,其通过 XML 与服务后台交换数据,并在不加载整个网页的情况下改变其部分内容
因为 Ajax 灵活、易用,且更具维护性能,在许多现代网站开发中都会被使用

这里介绍怎么使用爬虫来爬取 Ajax 传递的数据

分析网页结构

我们准备爬取一个文娱数据统计的网站:http://www.endata.com.cn/
目标网页是数据榜单中的票房数据,基于年度票房的数据统计,如下图是2020年电影票房数据的统计
目标网页
图中红箭头指向的是用于选择年份的下拉列表

使用开发者模式,定位下拉列表,可以查看该标签的相关属性
在这里插入图片描述
再到网页源码文件中查找这个标签的 id
在这里插入图片描述
在这里面我们看到一个调用 Ajax 请求接口的方法,以及其参数内容

这显然是一个封装好的方法,我们可以到外部引入的脚本中去查看这个方法的具体实现
在这里插入图片描述
显然是来自这个 Common.js,我们打开这个文件,在里面进行关键字查找
在这里插入图片描述
如此,我们得到了 Ajax 请求的目标 urlPOST 的表单格式,其传递数据的形式为 Json

分析网页请求

除了分析网页结构,我们还可以通过分析网页请求信息来提取关键信息

使用开发者模式,打开 Network 标签,改变年份,观察每次年份变更后重新载入数据时浏览器发起的请求信息
在这里插入图片描述
显然,最先是加载该年份总的电影票房数据信息,后面是单独加载某个电影的数据

查看第一个请求包的详细内容
在这里插入图片描述
是我们想要的信息

模拟请求

我们前面前面获取到的信息有:

  1. Ajax 请求的 url 为:http://www.endata.com.cn/API/GetData.ashx
  2. 请求方法为 POST,表单内容为 year 和 MethodName
  3. 传递数据的形式为 Json

我们根据这些信息进行模拟请求,测试其是否可成功获取数据
在这里插入图片描述
测试成功,模拟的 POST 请求可以获取 Json 形式的数据返回
在这里插入图片描述
Json 格式化数据中,我们想要获取的信息在 Data 字段中的 Table 字段,以数组的形式存储

构建爬虫

由此,我们编写爬虫代码

# 电影票房import requests
import pandas as pddef get_boxoffices_by_year(url, headers):res_data = []for year in range(2008, 2021):data = {'year': year, 'MethodName': 'BoxOffice_GetYearInfoData'}res = requests.post(url, data=data, headers=headers)res_data += res.json()['Data']['Table']df = pd.DataFrame(res_data)df.to_excel('boxoffices_by_year.xlsx')if __name__ == '__main__':url = 'http://www.endata.com.cn/API/GetData.ashx'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36'}get_boxoffices_by_year(url, headers)

爬取结果:
在这里插入图片描述

追加(2021-01-23)

现在网站对后台返回的数据进行了加密处理,能获取到的都是密文
后台返回数据
前端在处理数据时候也是做了判断,如果不是一个Json字符串,就会调用webInstace.shell()方法进行解密处理
解密处理
解密器
大概猜测他用的是DES加密算法,DES是对称加密算法,加密密钥和解密密钥是同一个,在前端进行解密,要么是后台另外传了密钥过来,要么就是使用了约定的密钥生成方法,这里就不往下探究了(这里应该是对加密算法的js代码使用了混淆,看得头痛)。
既然网站对数据进行了加密,我们直接使用ajax就不能拿到有效的数据了,或许可以等前端渲染之后再拿数据明文,这里也不继续探究了,这篇文章就当看一乐吧。

这篇关于爬虫 - 使用Ajax爬取电影票房数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333237

相关文章

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java