试图抓取这个网站--> https://ucr.gov/enforcement/1000511 它曾经使用下面的代码,然后停止了。无法获取响应中的 json 或任何内容。
query = "1000511"
url = 'https://ucr.gov/api/enforcement/{}'.format(query)
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'en-US,en;q=0.9',
'Referer': 'https://ucr.gov/enforcement/{}'.format(query),
'Cache-Control': 'no-cache,no-store,must-revalidate,max-age=0,private',
'content-type': 'application/json;charset=UTF-8',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'UCR-UI-Version': '20.5.4',
'Origin': 'https://ucr.gov',
'Connection': 'keep-alive',
}
s = requests.Session()
params = (
('pageNumber', '0'),
('itemsPerPage', '15'),
)
response = s.get(url, headers=headers, params=params)
response.json()
可以在此处找到预期内容: https://ucr.gov/enforcement/1000511
相反,我收到此错误:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
同样,这在几周前曾经有效。请帮我找出错误。
更正 1: - 我最初将网址发布为:
url = 'https://admin.ucr.gov/api/enforcement/{}'.format(query)
,这以前是有效的。现在,我看到该网站使用相同的网址,但没有“admin”(上面的代码已更改)。但如果您访问: https://ucr.gov/enforcement/1000511,我仍然没有得到预期的任何结果/内容
该网站不向
https://ucr.gov/api/enforcement/1000511
提供 JSON 数据。在浏览器中看到的 JSON 数据实际上是嵌入在网页源代码中的 JavaScript 变量中。
要抓取数据,需要执行以下操作:
- 获取网页源代码。
- 使用正则表达式或 HTML 解析器提取 JSON 数据。
以下是如何使用 Python 和
requests
以及
BeautifulSoup
库实现此目的的方法:
import requests
from bs4 import BeautifulSoup
import json
query = "1000511"
url = f'https://ucr.gov/enforcement/{query}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 在网页源代码中找到包含 JSON 数据的脚本标签
script_tag = soup.find('script', {'id': '__NEXT_DATA__'})
# 提取 JSON 数据
json_data = json.loads(script_tag.text)
# 现在可以访问 JSON 数据
print(json_data)
此代码将:
-
使用
requests
库发送对所需页面的 GET 请求。 -
使用
BeautifulSoup
解析 HTML 内容。 -
找到包含 JSON 数据的特定脚本标签(在本例中为
id="__NEXT_DATA__"
)。 -
使用
json.loads()
将 JSON 数据字符串转换为 Python 字典。
然后,就可以在
json_data
变量中访问提取的 JSON 数据,并根据需要对其进行处理。