利用Requests库高效抓取TechCrunch动态加载文章:API分页教程

利用Requests库高效抓取TechCrunch动态加载文章:API分页教程

本教程详细阐述了如何在不使用selenium或beautifulsoup等浏览器自动化工具的情况下,通过python的requests库抓取techcrunch网站上动态加载的“隐藏”文章。核心方法是识别并利用网站后端的分页api,通过模拟api请求来获取多页文章数据,从而解决“加载更多”按钮限制的问题。文章将提供具体的代码示例和操作指南,帮助读者高效地获取所需文章信息。

引言:动态加载内容与传统爬取挑战

在现代网页中,许多网站为了提升用户体验,采用JavaScript动态加载内容。例如,点击“加载更多”按钮或滚动到页面底部时,新内容才会显示。对于传统的网页抓取工具(如仅基于HTML解析的BeautifulSoup),这些初始未加载的内容是“隐藏”的,无法直接获取。虽然Selenium等浏览器自动化工具可以模拟用户行为(如点击按钮),但它们通常资源消耗较大,且在某些受限环境中可能无法使用。

本文将介绍一种更高效、更轻量级的方法:直接与网站的后端API交互。当网站使用“加载更多”机制时,往往是通过向某个API端点发送请求来获取新数据,然后用JavaScript将这些数据渲染到页面上。只要我们能识别出这个API,就可以直接模拟这些请求来获取数据。

识别网站分页API

识别动态加载内容的API是解决问题的关键一步。这通常需要借助浏览器的开发者工具:

打开目标网站: 访问 https://techcrunch.com/。打开开发者工具: 在Chrome、Firefox等浏览器中,右键点击页面任意位置,选择“检查”(Inspect)或按 F12 键。切换到“网络”(Network)选项卡: 这个选项卡会显示浏览器与服务器之间所有的网络请求。过滤请求类型: 为了更容易找到API请求,可以过滤请求类型,通常选择“XHR”(XMLHttpRequest)或“Fetch/XHR”,因为API请求多通过这两种方式发送。触发“加载更多”: 在网页上找到并点击“加载更多”(Load More)按钮。观察网络请求: 点击后,在开发者工具的“网络”选项卡中会看到新的请求出现。仔细查看这些请求的URL、请求方法(GET/POST)和响应内容。通常,你会发现一个URL中包含 page= 或 offset= 等参数,并且响应内容是JSON格式的数据。对于TechCrunch,通过观察可以发现一个形如 https://techcrunch.com/wp-json/tc/v1/magazine?page={page}&_embed=true&es=true&cachePrevention=0 的URL模式,其中 {page} 参数就是控制页码的关键。

Python实现:通过Requests库获取文章数据

一旦识别出API的URL模式,我们就可以使用Python的 requests 库来模拟这些请求并获取数据。

首先,确保你已经安装了 requests 库:

pip install requests

接下来,编写Python代码来循环请求不同页码的数据:

import requestsimport json # 用于美化输出,可选# 定义API的基础URL模板# 注意:{page} 是一个占位符,用于插入页码api_url_template = "https://techcrunch.com/wp-json/tc/v1/magazine?page={page}&_embed=true&es=true&cachePrevention=0"# 定义要抓取的页数。根据需要调整这个数字。# 例如,抓取10页,每页可能包含20篇文章,总共200篇文章。num_pages_to_fetch = 10 all_articles_data = []print(f"开始抓取TechCrunch文章,预计抓取 {num_pages_to_fetch} 页...")for page_number in range(1, num_pages_to_fetch + 1):    # 构建当前页的完整API URL    current_page_url = api_url_template.format(page=page_number)    try:        print(f"正在请求第 {page_number} 页:{current_page_url}")        # 发送GET请求到API端点        response = requests.get(current_page_url)        # 检查请求是否成功(状态码200)        response.raise_for_status()         # 将JSON响应解析为Python列表或字典        page_data = response.json()        # 如果当前页没有数据,可能已经到达了末尾        if not page_data:            print(f"第 {page_number} 页没有数据,停止抓取。")            break        for article in page_data:            # 提取文章标题            title = article.get("title", {}).get("rendered", "无标题")            # 提取文章链接            link = article.get("link", "无链接")            print(f"  - 标题: {title}")            print(f"    链接: {link}")            # 将提取到的文章数据添加到总列表中            all_articles_data.append({                "title": title,                "link": link,                # 可以根据API响应结构添加更多字段,例如摘要、作者等                # "excerpt": article.get("excerpt", {}).get("rendered", ""),                # "author_name": article.get("_embedded", {}).get("author", [{}])[0].get("name", "")            })    except requests.exceptions.RequestException as e:        print(f"请求第 {page_number} 页时发生错误: {e}")        # 可以选择跳过当前页继续下一页,或者在此处停止print(f"n抓取完成!共获取到 {len(all_articles_data)} 篇文章数据。")# 可以将所有数据保存到JSON文件或进行进一步处理# with open("techcrunch_articles.json", "w", encoding="utf-8") as f:#     json.dump(all_articles_data, f, ensure_ascii=False, indent=4)# print("所有文章数据已保存到 techcrunch_articles.json")

代码解释:

api_url_template: 这是TechCrunch分页API的URL模板。{page} 是一个占位符,我们将使用 str.format() 方法在每次循环时替换为当前的页码。num_pages_to_fetch: 定义了你希望抓取的总页数。你可以根据需要获取的文章数量来调整这个值。requests.get(current_page_url): 发送HTTP GET请求到指定的API URL。response.raise_for_status(): 这是一个非常有用的方法,如果HTTP请求返回了错误状态码(如4xx或5xx),它会抛出一个 HTTPError 异常。response.json(): 将API响应的内容解析为Python字典或列表,因为API通常返回JSON格式的数据。article.get(“title”, {}).get(“rendered”, “无标题”): 从文章数据字典中安全地提取标题。使用 .get() 方法可以避免键不存在时引发 KeyError,并提供默认值。_embed=true 参数通常意味着API响应中会包含更多嵌入式数据,如完整的标题 (title”][“rendered”]) 和链接 (link)。

进一步的数据提取与处理

上述代码主要演示了如何获取文章的标题和链接。根据API响应的结构,你还可以提取更多信息:

文章摘要/内容预览: API响应中可能包含 excerpt 字段,其中有文章的简短摘要。发布日期、作者: 查找 date、author 或 _embedded 字段,这些字段可能包含发布时间、作者名称等信息。完整文章HTML内容: 如果你需要文章的完整HTML内容(而不是API提供的摘要),你需要使用从API中获取到的 link 字段,对每个文章链接再次发送 requests.get() 请求,然后使用BeautifulSoup等库解析返回的HTML。PDF获取: 获取文章的PDF版本通常更为复杂。网站通常不会直接提供PDF下载链接,可能需要将抓取到的HTML内容转换为PDF,这需要额外的库(如 weasyprint)或服务。

注意事项与最佳实践

页数限制: 在实际应用中,你可能需要确定网站总共有多少页。如果没有明确的API参数指示总页数,你可以通过循环请求直到API返回空数据来判断。错误处理: 网络请求可能会失败(例如,网络中断、服务器错误)。在代码中加入 try-except 块来捕获 requests.exceptions.RequestException 是一个好习惯,可以提高程序的健壮性。遵守网站规则: 在进行任何网页抓取活动之前,务必查看网站的 robots.txt 文件(例如 https://techcrunch.com/robots.txt)和使用条款。遵守这些规则,避免对网站服务器造成不必要的负担。请求频率: 避免在短时间内发送大量请求,这可能导致你的IP被暂时或永久封禁。可以在每次请求之间添加 time.sleep() 来设置延时。User-Agent: 有时网站会检查请求的 User-Agent 头。在 requests.get() 中添加 headers={‘User-Agent’: ‘Your Custom User-Agent’} 可以模拟浏览器请求。API变更: 网站的API结构可能会发生变化。如果你的抓取代码突然失效,请重新检查开发者工具,确认API端点或响应结构是否有所调整。

总结

通过直接与网站的API交互,我们可以绕过前端动态加载的限制,高效地获取大量结构化数据,而无需依赖资源密集型的浏览器自动化工具。这种方法不仅速度更快,而且对服务器的负担也更小(如果合理控制请求频率)。掌握如何识别和利用网站API是现代网页数据抓取中一项非常重要的技能。

以上就是利用Requests库高效抓取TechCrunch动态加载文章:API分页教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1377841.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 18:07:46
下一篇 2025年12月14日 18:07:59

相关推荐

  • python中pdb的启用

    使用breakpoint()或pdb.set_trace()可在Python中插入断点调试。1. 在代码中插入import pdb; pdb.set_trace()可启动交互式调试,查看变量、单步执行;2. Python 3.7+推荐使用breakpoint(),语法更简洁且支持配置;3. 可通过p…

    2025年12月14日 好文分享
    000
  • Python中concurrent.futures模块如何使用

    concurrent.futures模块提供ThreadPoolExecutor和ProcessPoolExecutor两类执行器,分别用于I/O密集型和CPU密集型任务;通过submit提交任务返回Future对象,使用result获取结果,map实现并行映射,as_completed处理先完成的…

    2025年12月14日
    000
  • Tkinter/CustomTkinter中隐藏滚动条并保留鼠标滚轮滚动功能

    本文将介绍如何在tkinter和customtkinter的可滚动部件(如ctkscrollableframe)中有效隐藏滚动条,同时确保鼠标滚轮滚动功能保持完整。核心方法是避免创建滚动条部件,因为可滚动组件本身就支持鼠标滚轮事件,或者通过配置参数将内置滚动条宽度设置为零。 引言:隐藏滚动条的场景与…

    2025年12月14日
    000
  • Scikit-learn模型训练前的数据清洗:NaN值处理教程

    本教程旨在解决scikit-learn模型训练时常见的`valueerror: input y contains nan`错误。该错误通常发生在输入数据(特别是目标变量`y`)中包含缺失值(nan)时,因为scikit-learn的大多数估计器默认不支持nan。文章将详细介绍如何使用numpy库创建…

    2025年12月14日
    000
  • Pandas中处理含None值的整数数组:保持整数类型而非自动转换为浮点数

    在pandas中,当数组包含none值并加载到dataframe列时,整数通常会被自动转换为浮点数(nan)。本文将介绍如何利用pandas 1.0及更高版本引入的pd.na和int64dtype,优雅地解决这一问题,从而在包含缺失值的同时保持列的整数类型,避免不必要的类型转换。 1. 问题背景:P…

    2025年12月14日
    000
  • Tkinter/CustomTkinter中隐藏滚动条并保留滚动功能

    本文探讨了在Tkinter和CustomTkinter应用中隐藏滚动条同时保持鼠标滚轮滚动功能的实现方法。核心思想是,许多可滚动组件的滚动机制并不依赖于可见的滚动条控件。对于Tkinter,可以直接省略滚动条控件;对于CustomTkinter的`CTkScrollableFrame`,可通过配置参…

    2025年12月14日
    000
  • 深入理解Python中非确定性集合迭代引发的“幽灵”Bug

    当看似无关的代码修改导致程序在早期行中出现 AttributeError: ‘NoneType’ object has no attribute ‘down’ 错误时,这通常源于对 Python 集合(set)非确定性迭代顺序的误用。集合的元素顺序不固…

    2025年12月14日
    000
  • Pandas DataFrame:为每行动态应用不同的可调用函数

    本教程详细介绍了如何在pandas dataframe中为每一行动态应用不同的可调用函数。当函数本身作为参数存储在dataframe中时,我们面临如何高效执行行级操作的挑战。文章将通过结合相关数据帧并利用`apply(axis=1)`方法,提供一个清晰且易于维护的解决方案,避免使用效率低下的列表推导…

    2025年12月14日
    000
  • Python中字符串到日期时间转换:strptime的常见陷阱与解决方案

    本文深入探讨python中如何将字符串转换为日期时间对象,重点解析使用`time.strptime`或`datetime.strptime`时常遇到的`valueerror`。我们将详细讲解日期时间格式化代码的正确用法,以及如何处理输入字符串中可能存在的额外字符,确保转换过程顺利无误,并提供实用的代…

    2025年12月14日
    000
  • Pandas中含None值的整数数组加载为可空整数类型教程

    当Pandas DataFrame列中混合了整数和None值时,默认行为会将整列转换为浮点类型,并将None替换为NaN。本文将介绍如何利用Pandas 1.0.0及更高版本引入的pd.NA和Int64Dtype,优雅地处理此类数据,确保整数类型得以保留,同时用表示缺失值,从而实现可空整数列。 理解…

    2025年12月14日
    000
  • Pandas DataFrame中含None值整数列的类型保持策略

    本文旨在解决pandas中将含有`none`值的整数数组加载到dataframe列时,数据类型自动转换为浮点数的问题。我们将深入探讨pandas默认类型推断机制,并介绍如何利用pandas 1.0及更高版本中引入的`pd.na`和`int64dtype`(或其字符串别名`”int64&#…

    2025年12月14日
    000
  • Python多线程安全关闭:避免重写join()方法触发线程退出

    本文探讨了在python中如何安全地关闭一个无限循环运行的线程,特别是响应`keyboardinterrupt`。针对一种通过重写`threading.thread.join()`方法来触发线程退出的方案,文章分析了其潜在问题,并推荐使用分离的显式关闭机制,以提高代码的清晰性、健壮性和可维护性。 在…

    2025年12月14日
    000
  • 解决Python中supervision模块导入错误的完整指南

    本文旨在解决在python计算机视觉项目中,导入`supervision`库的`detections`和`boxannotator`等模块时遇到的`modulenotfounderror`。我们将深入分析导致此类错误的原因,并提供两种核心解决方案:纠正不正确的模块导入路径和确保`supervisio…

    2025年12月14日
    000
  • 使用Python Pandas处理多响应集交叉分析

    本文详细介绍了如何使用python的pandas库对多响应集数据进行交叉分析。针对传统交叉表难以处理多响应问题的挑战,文章通过数据重塑(melt操作)将宽格式的多响应数据转换为长格式,随后利用分组聚合和透视表功能,高效生成所需的多响应交叉表,并探讨了如何计算绝对值和列百分比,为数据分析师提供了实用的…

    2025年12月14日
    000
  • 使用 Pandas 处理多重响应数据交叉表

    本文详细介绍了如何利用 Python Pandas 库高效地处理多重响应(Multiple Response)数据,并生成交叉分析表。核心方法包括使用 `melt` 函数将宽格式数据转换为长格式,再结合 `groupby` 和 `pivot_table` 进行数据聚合与透视,最终实现多重响应变量与目…

    2025年12月14日
    000
  • Xarray数据集高级合并:基于共享坐标的灵活策略

    本教程详细阐述了如何在xarray中合并具有不同维度但共享关键坐标(如`player_id`和`opponent_id`)的两个数据集。文章首先分析了`xr.combine_nested`在非嵌套结构下的局限性,随后提供了一种基于`xr.merge`和坐标选择(`sel`)的解决方案。通过重置索引、…

    2025年12月14日
    000
  • 在SimPy中实现进程的顺序执行

    在simpy离散事件仿真中,确保一个进程完成后再启动另一个进程是常见的需求。本文将深入探讨simpy中进程顺序执行的正确方法,重点讲解如何通过`yield`语句精确控制进程的生命周期,并避免在类初始化方法中过早地创建和启动进程,从而解决进程无法按预期顺序执行或被中断的问题,确保仿真逻辑的准确性。 S…

    2025年12月14日
    000
  • Python中解析JSON字典的常见陷阱与正确实践

    本文旨在指导读者如何在python中正确解析api响应中的json数据,特别是处理`json.loads`转换后的字典类型。文章详细解释了当尝试迭代字典时,为何会出现`typeerror: string indices must be integers, not ‘str’`…

    2025年12月14日
    000
  • 动态毫秒时间转换:Python实现灵活格式化输出

    本文详细介绍了如何在python中将毫秒值转换为可读性强的动态时间格式。通过利用`datetime.timedelta`对象,结合数学运算分离出小时、分钟、秒和毫秒,并巧妙运用字符串的`strip()`和`rstrip()`方法,实现去除前导零和不必要的字符,从而根据时间长短自动调整输出格式,提升用…

    2025年12月14日
    000
  • python字典的元素访问

    Python字典通过键访问值,使用[]直接访问若键不存在会抛出KeyError,而get()方法可安全访问并返回默认值,推荐在不确定键存在时使用get()。 Python字典的元素访问主要通过键(key)来获取对应的值(value)。字典是一种无序、可变的数据结构,由键值对组成,每个键在字典中必须是…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信