使用python的requests库遇到url不变的网页如何爬取
问题简述:爬取一个一万条数据的网页内容,该内容分为30页,每页300条数据。在使用requests的post请求爬取数据是发现只能爬第一页的数据,并且,第一页切换第二页时网页url完全没变,只更新了3个数据包(1个get,2个post,其中一个具有网页内容),应该是ajax动态网页,并且在post包中的data数据没有page之类的数据变换,只有get包中的set_xxxx_key 字段这里有数据变化,而且是对于的值是每页不同的加密的数据。对于这种情况应该如何解决,这种前后端分离的情况如何通过requests访问数据接口。
关键是得找到这个变化的字段是怎么来的,根据什么规则来生成,然而你没有给出具体的网站,所以就只能靠自己了,大概思路就是 js 逆向 对于这种前后端分离的情况,可以通过模拟请求头或者参数来实现请求不同页的数据。以下是一个示例代码:
import requests
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.3'
}
# 构造 POST 请求的数据
data = {
'set_xxxx_key': 'xxx',# 这里填写对应的加密数据
'page': 1# 第一页的数据
}
url = 'http://example.com/data_api'# 替换为实际的数据接口地址
result = []# 存储所有数据
for i in range(1, 31):# 爬取30页数据
data['page'] = i# 更新页码数据
response = requests.post(url, headers=headers, data=data)
data_list = response.json()# 假设返回的数据是JSON格式
# 处理返回的数据,将数据存储到result中
for item in data_list:
result.append(item)
print(result)
在上述代码中,首先定义了一个请求头`headers`和POST请求的数据`data`,然后通过循环构造不同页码的请求,每次更改`data['page']`的值,发送POST请求并获取返回的数据。最后将所有数据存储到`result`列表中。
请注意,该示例仅适用于POST请求,如果有其他类型的请求(如GET请求),则需要根据实际情况进行相应的修改。同时,如果返回的数据不是JSON格式,还需根据实际情况进行处理。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-27 13:44
对于这种前后端分离的情况,可以通过模拟请求头或者参数来实现请求不同页的数据。以下是一个示例代码:
...
关键就在于没有传递翻页的参数page 15779327169 发表于 2024-04-27 13:46
关键就在于没有传递翻页的参数page
非常抱歉之前没有看到您提到的没有传递翻页参数的问题。对于这种情况,您可以尝试通过分析网页请求的方式来获取正确的参数,并使用requests库进行模拟请求。以下是一个示例代码:
import requests
url = 'http://example.com/data_api'# 替换为实际的数据接口地址
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.3'
}
result = []# 存储所有数据
for page in range(1, 31):# 爬取30页数据
params = {
'page': page# 设置翻页参数
}
response = requests.get(url, headers=headers, params=params)
data_list = response.json()# 假设返回的数据是JSON格式
# 处理返回的数据,将数据存储到result中
for item in data_list:
result.append(item)
print(result)
在上述代码中,我们通过循环构造不同页码的请求,每次更改`params`中的`page`参数,并使用`requests.get()`方法发送GET请求。然后,我们将返回的数据存储到`result`列表中。
请注意,您需要根据实际情况修改`url`、`headers`和处理返回数据的方式。
希望这能帮到您!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 isdkz 发表于 2024-4-27 13:56
关键是得找到这个变化的字段是怎么来的,根据什么规则来生成,然而你没有给出具体的网站,所以就只能靠自己 ...
因为是在单位的系统做的一些数据爬取,不方便展示截图,不访问网页直接访问接口可以吗 isdkz 发表于 2024-4-27 13:44
关键是得找到这个变化的字段是怎么来的,根据什么规则来生成,然而你没有给出具体的网站,所以就只能靠自己 ...
大神你好,我仔细看了一下网页,发现是有page的跳转关键字,可以实现对网页数据的批量爬取,但是在使用post请求后获取内容时发现问题,res=requests.post(url,headers=headers,data=data).text, 这里打印res的时候发现不是json格式,是一个带div/span 以及fuction init函数的j类似java的网页,这让我无从下手,不知道怎么把数据拿出来,请问这种情况该如何解决呢,使用json.load(res)或dump(res)都不行 FishC 发表于 2024-4-27 13:47
非常抱歉之前没有看到您提到的没有传递翻页参数的问题。对于这种情况,您可以尝试通过分析网页请求的方 ...
res=requests.post(url,headers=headers,data=data).text, 这里打印res的时候发现不是返回的内容不是json格式,是一个带div/span 以及fuction init函数的j类似java的网页,这让我无从下手,不知道怎么把数据拿出来,请问这种情况该如何解决呢,使用json.load(res)或dump(res)都不行 15779327169 发表于 2024-04-28 16:12
res=requests.post(url,headers=headers,data=data) ...
如果返回的内容不是JSON格式,而是一段包含HTML标签和JavaScript代码的网页内容,那么就需要使用其他方法来解析和提取数据了。以下是一个示例代码,使用BeautifulSoup库来解析HTML并提取数据:
import requests
from bs4 import BeautifulSoup
url = 'http://example.com/data_api'# 替换为实际的数据接口地址
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.3'
}
result = []# 存储所有数据
for page in range(1, 31):# 爬取30页数据
params = {
'page': page# 设置翻页参数
}
response = requests.get(url, headers=headers, params=params)
html = response.text
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html, 'html.parser')
# 根据具体的网页结构,提取数据
data_divs = soup.find_all('div', class_='data-item')
for div in data_divs:
# 提取数据,根据实际情况进行处理
data = {
'title': div.find('span', class_='title').text,
'content': div.find('span', class_='content').text
}
result.append(data)
print(result)
在上述代码中,我们通过使用BeautifulSoup库,将返回的HTML内容进行解析,并使用相应的方法(如`find()`和`find_all()`)来提取数据。您需要根据实际的网页结构,修改代码中的选择器,并获取所需的数据。最后将提取到的数据存储在`result`列表中。
希望这对您有帮助!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 15779327169 发表于 2024-4-28 16:06
大神你好,我仔细看了一下网页,发现是有page的跳转关键字,可以实现对网页数据的批量爬取,但是在使用po ...
可以用正则 isdkz 发表于 2024-4-28 16:22
可以用正则
好的,我试试,感谢! FishC 发表于 2024-4-28 16:13
如果返回的内容不是JSON格式,而是一段包含HTML标签和JavaScript代码的网页内容,那么就需要使用其他方 ...
如何要匹配{"actname":"XXX","al":"中文"} 这样一个结构的文本,用正则表达式怎么写 15779327169 发表于 2024-04-28 16:52
如何要匹配{"actname":"XXX","al":"中文"} 这样一个结 ...
要匹配形如`{"actname":"XXX","al":"中文"}`的文本结构,可以使用正则表达式来实现。以下是一个示例代码:
import re
text = '{"actname":"XXX","al":"中文"}'
pattern = r'\{"actname":"(.*?)","al":"(.*?)"\}'
result = re.findall(pattern, text)
print(result)
在上述代码中,我们使用了正则表达式的findall()方法来查找所有符合模式的结果。其中,模式`r'\{"actname":"(.*?)","al":"(.*?)\"\}'`表示:首先匹配一个`{`字符,后跟`"actname":"`,接着使用`(.*?)`来匹配任意字符(非贪婪模式),直到遇到`","al":"`,再使用`(.*?)`来匹配任意字符(非贪婪模式),最后匹配`"\}`字符。
运行这段代码会输出`[('XXX', '中文')]`作为结果,表示成功匹配到一组数据。
需要注意的是,正则表达式是一种强大的文本处理工具,但也有其局限性,对于复杂结构的文本可能不太适用。如果你面对的是更复杂的文本结构,可能需要借助其他的解析库来处理。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-28 16:52
要匹配形如`{"actname":"XXX","al":"中文"}`的文本结构,可以使用正则表达式来实现。以下是一个示例代 ...
如何要匹配{"actname":"XXX"} 这样一个结构的文本,用正则表达式怎么写 15779327169 发表于 2024-04-28 16:55
如何要匹配{"actname":"XXX"} 这样一个结构的文本,用 ...
要匹配形如`{"actname":"XXX"}`的文本结构,可以使用正则表达式来实现。以下是一个示例代码:
import re
text = '{"actname":"XXX"}'
pattern = r'\{"actname":"(.*?)"\}'
result = re.findall(pattern, text)
print(result)
在上述代码中,我们使用了正则表达式的`findall()`方法来查找所有符合模式的结果。其中,模式`r'\{"actname":"(.*?)"\}'`表示:首先匹配一个`{`字符,后跟`"actname":"`,接着使用`(.*?)`来匹配任意字符(非贪婪模式),直到遇到`"`字符,最后匹配`}`字符。
运行这段代码会输出`['XXX']`作为结果,表示成功匹配到了`XXX`。
需要注意的是,正则表达式是一种强大的文本处理工具,但也有其局限性。如果你面对的是更复杂的文本结构,可能需要考虑其他的解析方法,如JSON解析库等。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-28 16:55
要匹配形如`{"actname":"XXX"}`的文本结构,可以使用正则表达式来实现。以下是一个示例代码:
如何把正则表达式匹配到的一个字典中的数据遍历出来 15779327169 发表于 2024-04-28 17:02
如何把正则表达式匹配到的一个字典中的数据遍历出来
如果您使用正则表达式匹配到了一个字典中的数据,并想要遍历这个字典中的数据,可以使用Python的for循环来实现。以下是一个示例代码:
import re
text = '{"actname":"XXX", "al":"中文"}'
pattern = r'\{"actname":"(.*?)","al":"(.*?)"\}'
result = re.findall(pattern, text)
if result:
data = result# 假设只有一个匹配结果
for key, value in data.items():
print(key, value)
在上述代码中,我们首先使用正则表达式`findall()`方法找到匹配的结果,并假设只有一个匹配结果,将其存储在`data`变量中。然后,通过`items()`方法遍历字典中的键值对,并打印出每个键和对应的值。
运行这段代码会输出:
actname XXX
al 中文
表示成功遍历出了字典中的数据。
需要注意的是,如果匹配到多个结果,您可能需要使用循环来遍历每个结果,并分别进行处理。另外,如果您的匹配结果中包含了嵌套的字典或其他数据结构,您可能需要递归地遍历这些嵌套的数据。
希望这能帮到您!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-28 17:02
如果您使用正则表达式匹配到了一个字典中的数据,并想要遍历这个字典中的数据,可以使用Python的for循 ...
a= ['[{1:3},{2:13}]']
如何把{1:3}和{2:13} 两个字典取出来 15779327169 发表于 2024-04-28 17:11
a= ['']
如何把{1:3}和{2:13} 两个字典取出来
要从列表 `a` 中取出 `{1:3}` 和 `{2:13}` 两个字典,可以使用索引来实现。以下是一个示例代码:
a = ['{1:3}', '{2:13}']
dict1 = eval(a)
dict2 = eval(a)
print(dict1)# 输出:{1: 3}
print(dict2)# 输出:{2: 13}
在上述代码中,我们通过 `eval()` 函数将字符串 `{1:3}` 和 `{2:13}` 转换为字典类型,然后将其分别赋值给 `dict1` 和 `dict2` 变量。最后,通过打印这两个变量来验证结果。
需要注意的是,使用 `eval()` 函数需要谨慎,因为它会执行字符串中包含的表达式。在这个特定的场景中,我们假设列表中的每个字符串都是安全的,并且可以被安全地执行为字典。如果您的列表中包含不受信任的字符串或者无法保证安全性,建议使用其他方法来解析字符串并转换为字典。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-28 17:12
要从列表 `a` 中取出 `{1:3}` 和 `{2:13}` 两个字典,可以使用索引来实现。以下是一个示例代码:
如果a =[['{1:3}', '{2:13}']],如何把{1:3}和{2:13} 两个字典取出来
页:
[1]
2