动态网页爬虫

动态网页爬虫网页加载数据的另一种方式——通过API(ApplicationProgrammingInterface,应用程序编程接口)加载数据网页通过API获取数据,实时更新内容,它规定了网页与服务

大家好,又见面了,我是你们的朋友全栈君。

网页加载数据的另一种方式——通过 API(Application Programming Interface,应用程序编程接口)加载数据

网页通过 API 获取数据,实时更新内容, 它规定了网页与服务器之间可以交互什么数据、通过什么样的方式进行交互。

Network

Network 记录的是从打开浏览器的开发者工具到网页加载完毕之间的所有请求。如果你在网页加载完毕后打开,里面可能就是空的,我们开着开发者工具刷新一下网页即可

<span role="heading" aria-level="2">动态网页爬虫

 

爬虫中常用的请求类型有 All、XHR、Img 和 Media,剩下的了解一下即可:

<span role="heading" aria-level="2">动态网页爬虫

 

 常用的请求信息,比如请求的名称、状态码、类型、数据大小和耗时等。这些都比较简单,我们只要能看懂,知道是什么意思就行。

<span role="heading" aria-level="2">动态网页爬虫

  

 在所有请求类型中,有一类非常重要的类型叫做 XHR。提前告诉你,完整的影评就在其中。那么 XHR 到底是什么呢?

  •  

    XHR 全称 XMLHttpRequest,是浏览器内置的对象。浏览器想要在不刷新网页前提下加载、更新局部内容时,必须通过 XHR 向存放数据的服务器发送请求。

    反过来说,XHR 类型请求里,就藏着我们需要的搜索结果。

 <span role="heading" aria-level="2">动态网页爬虫

 

 找到了获取评论数据的真正链接,以及相关的请求头参数,接下来我们就可以试着通过爬虫来爬取数据了

 

import requests

headers = {
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
  'referer': 'http://movie.mtime.com/'
}
res = requests.get('http://front-gateway.mtime.com/library/movie/comment.api?tt=1641893701852&movieId=251525&pageIndex=2&pageSize=20&orderType=1', headers=headers)
print(res.text)

 

由于查询字符串较长,requests.get() 方法提供了 params 参数,能让我们以字典的形式传递链接的查询字符串参数,使代码看上去更加的整洁明了
 

<span role="heading" aria-level="2">动态网页爬虫

也就是说,链接中的 tt=1641893701852&movieId=251525&pageIndex=2&pageSize=20&orderType=1,可以拆分成一个字典:

params = {
  "tt": "1641893701852",
  "movieId": "251525",
  "pageIndex": "2",
  "pageSize": "20",
  "orderType": "1"
}

res = requests.get(
  'http://front-gateway.mtime.com/library/movie/comment.api',
  params=params,
  headers=headers
)

<span role="heading" aria-level="2">动态网页爬虫
<span role="heading" aria-level="2">动态网页爬虫

import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
    'referer': 'http://movie.mtime.com/'
}

params = {
    "tt": "1646731402452",
    "movieId": "251525",
    "pageIndex": "1",
    "pageSize": "20",
    "orderType": "1"
}

res = requests.get(
    'http://front-gateway.mtime.com/library/movie/comment.api',
    params=params,
    headers=headers
)

print(res.text)
print(type(res.text))

爬取评论所在内容

 

res.text 并不是多层级的字典,只是长得像字典的字符串罢了.

 

 这种长得像字典的字符串,是一种名为 JSON 的数据格式。我们需要将其转换成真正的 字典/列表,才能从中提取出评论数据。所以,接下来我们学习 JSON 来将其转换成字典/列表。

 

什么是 JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。 易于人阅读和编写,同时也易于机器解析和生成。

JSON 建构于两种结构:键值对的集合 和 值的有序列表,分别对应 Python 里的字典和列表,这些都是常见的数据结构。大部分现代计算机语言都支持 JSON,所以 JSON 是在编程语言之间通用的数据格式。

JSON 本质上就是一个字符串,只是该字符串符合特定的格式要求。也就是说,我们将字典、列表等用字符串的形式写出来就是 JSON,就像下面这样:

 1 # 字典
 2 dict = {'price': 233}
 3 
 4 # JSON
 5 json = '{"price": 233}'
 6 
 7 # 列表
 8 list = ['x', 'y', 'z']
 9 
10 # JSON
11 json = '["x", "y", "z"]'

  Tips:Python 字符串使用单引号或双引号没有区别,但 JSON 中,字符串必须使用英文的双引号来包裹。

 

如何解析 JSON

print(type(res.json()))
# 输出:<class 'dict'>

res.json() 方法的返回的是真正 dict(字典),这样我们就能从中提取数据了

 

获取前 5 页的评论为例,看一下如何实现:

import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
    'referer': 'http://movie.mtime.com/'
}

for num in range(1, 6):
    params = {
        "tt": "1646731402452",
        "movieId": "251525",
        "pageIndex": "{}".format(num),
        "pageSize": "20",
        "orderType": "1"
    }

    res = requests.get(
        'http://front-gateway.mtime.com/library/movie/comment.api',
        params=params,
        headers=headers
    )
    rest = res.json()

    comment_list = rest['data']['list']
    for i in comment_list:
        print('昵称: '+i['nickname'])
        print('评论内容: '+i['content'])

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154594.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 预测功率和电流之间的关系

    预测功率和电流之间的关系

    2021年11月19日
  • plc程序设计实例_plc简单应用实例100例

    plc程序设计实例_plc简单应用实例100例一、三相异步电动机的降压启动控制1、三相异步电动机的Y-△降压启动控制将三相异步电动机的Y-△降压启动的继电接触器控制改造为PLC控制系统.(1)确定I/O信号、画PLC的外部接线图(a)主电路(b)PLC的I/O接线图电动机的Y-△降压启动的接线图(2)设计三相异步电动机的Y-△降压启动梯形图电动机的Y-△降压启动控制的梯形图2.三相异步电动机的串自耦变压器降压启动控制将串自耦变压器降压启动的继电接触器控制改造为PLC控制系统:(1)确定I/O信号

  • ibatis中isnotnull和isnotempty的区别_typedef int Status

    ibatis中isnotnull和isnotempty的区别_typedef int StatusisPropertyAvailable和isNotEmpty这个两个属性非常有用isPropertyAvailable:入参有这个属性isNotEmpty:入参的这个属性不为空入参一般是一个封装了数据的DTO如果希望一个属性无论为何值都符合条件则使用isPropertyAvailable如果希望一个属性只是不为空的时候才符合条件就用isNotEmptyupdate例子如下:…

  • session.setAttribute报错_java string contains方法

    session.setAttribute报错_java string contains方法HTTPSession在setAttribute时,保存的对象是否需要序列化?查看StandardSession源码中,在setAttribute()中有如下代码if((manager!=null)&amp;&amp;manager.getDistributable()&amp;&amp;!isAttributeDistributable(name…

  • MyBatisCodeHelperPro 2.9.3 激活_最新在线免费激活

    (MyBatisCodeHelperPro 2.9.3 激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • 怎么看计算机的历史记录手机_科学计算器怎么查看历史记录

    怎么看计算机的历史记录手机_科学计算器怎么查看历史记录如何查看电脑历史操作记录?随便打开我的电脑或者浏览器,然后同时按下Ctrl+H组合键,窗口的左侧就会弹出浏览过的历史记录的小窗口,选择相应的日期之后下拉菜单后,会有浏览的网页记录和我的电脑(下图),双击我的电脑,出现的就是这一天你的电脑上的被浏览过的文件夹或文件(前提是,浏览者,并没有删除历史记录,因为在此,选中目标,单击右键选择删除,同样也是可以将今天的浏览记录删除以上只是简单的IE记录查看!电…

    2022年10月26日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号