可狱可囚的爬虫系列课程 10:在网站中寻找 API 接口

上一篇文章我们讲述了爬虫中一个比较重要的知识点,如何从 API 接口中获取数据,本篇文章我们继续讲述,如何在网站中寻找 API 接口,我们以"今日头条"网站 https://www.toutiao.com/ 为例。

如上图所示,如果要获取页面新闻数据,可能大部分同学的想法就是直接 Requests 结合 BeautifulSoup4 库进行数据的爬取,但是我们不妨先来找找看有没有 API 接口能够让我们更快速的得到数据。所以在未来大家写爬虫时,可以先试试能否找到 API 接口,再来决定要不要使用 BeautifulSoup4 库。

一、抓包工具的使用

1. 文件的监听

我们在要爬取的页面上打开开发者工具,如下图所示,按照箭头顺序先切换到 Network 选项卡,再点击 Fetch/XHR,然后重新刷新下页面,就能看到红色椭圆框中监听到很多的资源文件。

这里使用的 Network 选项卡就是开发者工具自带的监听功能,监听网页在加载过程中涉及的一些相关数据文件,另外网页加载过程涉及很多文件,像 JS 文件、CSS 文件、Font 文件、图像文件、音视频文件等,大家先简单理解我们切换到的 Fetch/XHR 就是找 API 接口文件的位置。但是这些文件中有可能存在我们需要的 API 数据接口,有些网站的数据接口做的很隐蔽,正常手段不一定找得到,需要结合更高级的抓包工具(Wireshark、Charles 等)才有可能找到,这里我们暂时先来讲解一般的 API 接口寻找方式,后续再单独说明抓包工具的使用。

2. API 接口的判断

如何判断哪个资源文件是我们想要的数据接口呢?最简单的方法是一个个的点开看,不过这样太麻烦,我们结合一些提示性的信息给这些资源文件排个序,最高效的寻找 API 接口。

首先观察这样几个字段:Name、Status、Size、Time。

  • Name:文件名,我们依旧是遵循见名知义的原则,通过文件名猜测文件中包含的数据;
  • Status:状态码,我们需要的是状态码为200 或者 304 的文件;
  • Size:文件大小,数据量大的文件,文件大小都相对较大;
  • Time:加载时间,数据量大的文件加载速度相对慢一些。

我们结合这四个字段的特征,给监听到的文件做筛选和排序,择优选取文件查看。例如,我大胆猜测 Name 列名为 hot-board...的文件为头条热榜所涉及数据。

3. 查看文件

有了猜测目标以后,我们可以点击此文件的文件名位置,在弹出来的窗口切换到 Preview 预览选项卡,发现加载出来的数据和我们所猜测的一致,确实为头条热榜所示数据,这就证明 API 接口找对了,此时便可以从此文件上右键,复制其在线地址,用爬虫来抓取其中的数据。当然前面说了,有些 API 接口比较隐蔽,如果找不到就暂且选择老方法进行数据的爬取。

二、代码编写

1. API 接口请求

python 复制代码
import requests

API_URL = 'https://www.toutiao.com/hot-event/hot-board/?origin=toutiao_pc&_signature=_02B4Z6wo00f01TIgxfQAAIDCpvae--DE-40yBMFAAC9V19pn3J.1AFd.u3TRK0tR1rbObxwJ7qLFJCGXBd0Z35J32hVZFJbsVx4puKKLsSDQInjDwZpK4c6DlvBFgCuz3EkKw6APt9jwKbeG36'
Headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
response = requests.get(url=API_URL, headers=Headers)
result = response.text if response.status_code == 200 else '状态码异常'
print(result)

结果如下:

API 接口中数据是以 JSON 格式传输的,但是经过爬虫以后拿出来的结果就变成了 Python 的字符串,如上图所示,看起来像字典,但是整体结果是字符串。有同学问了,不是 JSON 吗,怎么又成了字典?你说巧不巧,JSON 格式的数据呀与 Python 的字典很像,所以 Python 提供了将字符串类型的 JSON 数据转为字典的方法,就是使用 Python 的内置 JSON 库。

2. JSON 库的使用

我们这里使用 JSON 库中的 loads 方法将字符串类型的 JSON 数据转为字典,同时仔细观察结果,通过字典的键将我们所需要的新闻准确无误的筛选出来。

python 复制代码
import json

NewsInfo = json.loads(result)
for news_dict in NewsInfo['data']:
    newsTitle = news_dict['Title']
    print(newsTitle)

结果如下:

3. 完整代码

python 复制代码
import requests
import json

API_URL = 'https://www.toutiao.com/hot-event/hot-board/?origin=toutiao_pc&_signature=_02B4Z6wo00f01TIgxfQAAIDCpvae--DE-40yBMFAAC9V19pn3J.1AFd.u3TRK0tR1rbObxwJ7qLFJCGXBd0Z35J32hVZFJbsVx4puKKLsSDQInjDwZpK4c6DlvBFgCuz3EkKw6APt9jwKbeG36'
Headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
response = requests.get(url=API_URL, headers=Headers)
result = response.text if response.status_code == 200 else '状态码异常'

NewsInfo = json.loads(result)
for news_dict in NewsInfo['data']:
    newsTitle = news_dict['Title']
    print(newsTitle)
相关推荐
Caco_D2 小时前
一行代码抓遍全网 20 个热榜!Aneiang.Pa 4.0 发布 — 极简 .NET 爬虫库
爬虫·.net
曲幽3 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码4 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱13 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵15 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio18 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636720 小时前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户556918817531 天前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维