爬虫实战:解析数据与翻页的那些事儿
作为一名代码基础薄弱的学生,最近在学习爬虫技术时,遇到了一些问题。不过,经过一番折腾,我终于总结出了一些实用的经验,今天就来和大家分享一下。
一、解析字典或者数据
在爬取网页数据时,我们常常会遇到响应内容格式为字典或者列表的情况。这种情况下,我们可以直接使用 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
列表是否为空来决定是否退出循环。如果列表为空,说明已经没有更多数据了,就可以退出循环了。(具体网页可能会有不同的空数据表达格式,需根据实际情况更改)
五、总结
通过以上的学习和实践,我总结出了以下几点经验:
在解析数据时,一定要先查看响应的内容格式,确保是 JSON 格式后再调用
.json()
方法。爬取分页数据时,要分析页码的传递方式,并在循环中正确地修改页码参数。
爬取全部页数时,要设置合适的退出条件,避免无限循环。
爬虫技术虽然很有趣,但也需要我们仔细分析和处理各种情况。希望我的经验能对大家有所帮助,让我们一起在爬虫的世界里不断探索吧!