当前位置: 首页 > article >正文

爬虫学习第八篇-学习小总结

爬虫实战:解析数据与翻页的那些事儿

作为一名代码基础薄弱的学生,最近在学习爬虫技术时,遇到了一些问题。不过,经过一番折腾,我终于总结出了一些实用的经验,今天就来和大家分享一下。

一、解析字典或者数据

在爬取网页数据时,我们常常会遇到响应内容格式为字典或者列表的情况。这种情况下,我们可以直接使用 response.json() 方法来解析数据。然而,有时候直接调用 .json() 方法可能会报错,比如出现 requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 这样的错误。这是为什么呢?

原来,这是因为我们得到的响应内容可能并不是一个列表或者字典格式。比如,有些网页可能返回的是空内容,或者返回的是纯文本而不是 JSON 格式的数据。这种情况下,直接调用 .json() 方法就会报错。

那怎么办呢?别急,我们可以通过查看响应的文本内容来解决这个问题。在调用 .json() 方法之前,先用 response.text 查看响应内容。如果发现内容不是 JSON 格式,就需要根据实际情况进行处理了。

一般来说,目标数据通常会嵌套在某个列表中,比如 [{}, {}] 这样的格式。这种情况下,我们只需要循环遍历这个列表,就可以提取出我们需要的数据了。

二、指定页数

有些网站的数据是分页显示的,我们需要爬取指定的页数。这时候,就需要分析哪个数据代表页码。通常,页码会作为参数传递给网页的 URL,或者作为请求体的一部分发送给服务器。

在循环爬取数据的过程中,我们可以通过改变页码参数来获取不同页面的数据。比如,如果页码是通过 URL 参数传递的,我们可以修改 URL 中的页码值;如果页码是作为请求体发送的,我们可以在请求体中修改页码参数。

三、爬取全部页数

如果我们想要爬取网站的所有数据,就需要爬取全部的页数。这时候,我们可以使用无限循环来实现。

但是,无限循环可不是真的无限循环下去哦,我们需要设置一个合适的退出条件。一般来说,当没有数据时,服务器返回的响应内容会有一些特殊的特征。比如,返回的数据列表为空,或者返回的 JSON 数据中有一个字段表示没有更多数据了。

我们需要根据这些特征来编写判断条件,当满足退出条件时,就结束循环。

四、实战案例

说了这么多理论,让我们来看一个实际的例子吧。(以下示例仅作参考,需结合实际网页进行相应修改)

假设我们要爬取一个网站的商品数据,数据是分页显示的,每页有 10 条商品数据。我们先发送一个请求,看看返回的数据格式。

Python复制

import requests

url = "https://example.com/api/products"#假网址
response = requests.get(url)
print(response.text)

运行代码后,我们发现返回的数据是一个 JSON 格式,内容如下:

JSON复制

{
    "data": [
        {"id": 1, "name": "商品1", "price": 10},
        {"id": 2, "name": "商品2", "price": 20},
        ...
    ],
    "total_pages": 5
}

从返回的数据中,我们可以看到商品数据在 data 列表中,页码信息在 total_pages 字段中。

如果我们只想爬取第一页的数据,可以直接解析 data 列表:

Python复制

import requests

url = "https://example.com/api/products"
response = requests.get(url)
data = response.json()
products = data["data"]

for product in products:
    print(product["name"], product["price"])

如果要爬取指定页数的数据,比如爬取前 3 页的数据,我们可以循环发送请求,并修改页码参数:

Python复制

import requests

url = "https://example.com/api/products"
total_pages = 3

for page in range(1, total_pages + 1):
    params = {"page": page}
    response = requests.get(url, params=params)
    data = response.json()
    products = data["data"]

    for product in products:
        print(product["name"], product["price"])

如果要爬取全部页数的数据,我们可以使用无限循环,并根据返回的数据判断是否退出循环:

Python复制

import requests

url = "https://example.com/api/products"
page = 1

while True:
 params    = {"page": page}
    response = requests.get(url, params=params)
    data = response.json()
    products = data["data"]

    if not products:
        break

    for product in products:
        print(product["name"], product["price"])

    page += 1

在这个例子中,我们通过判断返回的 products 列表是否为空来决定是否退出循环。如果列表为空,说明已经没有更多数据了,就可以退出循环了。(具体网页可能会有不同的空数据表达格式,需根据实际情况更改)

五、总结

通过以上的学习和实践,我总结出了以下几点经验:

  1. 在解析数据时,一定要先查看响应的内容格式,确保是 JSON 格式后再调用 .json() 方法。

  2. 爬取分页数据时,要分析页码的传递方式,并在循环中正确地修改页码参数。

  3. 爬取全部页数时,要设置合适的退出条件,避免无限循环。

爬虫技术虽然很有趣,但也需要我们仔细分析和处理各种情况。希望我的经验能对大家有所帮助,让我们一起在爬虫的世界里不断探索吧!


http://www.kler.cn/a/557082.html

相关文章:

  • MYSQL查询优化器选错了索引怎么办
  • matlab 轮边驱动系统汽车垂向动力学分析
  • python学opencv|读取图像(七十四)人脸识别:EigenFaces算法
  • vue中将el-table导出为excel文件
  • 使用LangChain构建第一个ReAct Agent
  • C/C++ | 每日一练 (2)
  • 大模型掀起AI新浪潮,传感器成为智能升级关键
  • ABB机器人与西门子PLC、工业相机联合实现无序抓取的完整调试方案
  • ARM Linux下FFmpeg+Nginx+RTMP 视频监控
  • springboot+dubbo+zookeeper的注册服务和调用实践
  • 华为最新OD机试真题-找单词-Python-OD统一考试(E卷)
  • 【未完成】BUU20 [HCTF 2018]admin1
  • 代码随想录算法训练营day40(补0208)
  • 在Ubutu18.04下搭建nfs服务器
  • 用DeepSeek来帮助学习three.js加载3D太极模形
  • 阅读论文笔记《Translating Embeddings for Modeling Multi-relational Data》
  • Javascript使用Sodium库实现 aead_xchacha20poly1305_ietf加密解密,以及与后端的密文交互
  • HarmonyOS NEXT全栈开发深度指南(API 12+)
  • 计算机网络之物理层——基于《计算机网络》谢希仁第八版
  • oracle主库添加数据文件后备库无法按convert转换数据文件名ORA-01119,ORA-17502,ORA-15001