鱼C论坛

 找回密码
 立即注册
查看: 164|回复: 26

[已解决]使用python的requests库遇到url不变的网页如何爬取

[复制链接]
发表于 2024-4-27 13:44:06 | 显示全部楼层 |阅读模式
50鱼币
问题简述:爬取一个一万条数据的网页内容,该内容分为30页,每页300条数据。
在使用requests的post请求爬取数据是发现只能爬第一页的数据,并且,第一页切换第二页时网页url完全没变,只更新了3个数据包(1个get,2个post,其中一个具有网页内容),应该是ajax动态网页,并且在post包中的data数据没有page之类的数据变换,只有get包中的set_xxxx_key 字段这里有数据变化,而且是对于的值是每页不同的加密的数据。对于这种情况应该如何解决,这种前后端分离的情况如何通过requests访问数据接口。
最佳答案
2024-4-27 13:44:07
关键是得找到这个变化的字段是怎么来的,根据什么规则来生成,然而你没有给出具体的网站,所以就只能靠自己了,大概思路就是 js 逆向

最佳答案

查看完整内容

关键是得找到这个变化的字段是怎么来的,根据什么规则来生成,然而你没有给出具体的网站,所以就只能靠自己了,大概思路就是 js 逆向
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-27 13:44:07 | 显示全部楼层    本楼为最佳答案   
关键是得找到这个变化的字段是怎么来的,根据什么规则来生成,然而你没有给出具体的网站,所以就只能靠自己了,大概思路就是 js 逆向
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-27 13:44:37 | 显示全部楼层
对于这种前后端分离的情况,可以通过模拟请求头或者参数来实现请求不同页的数据。以下是一个示例代码:

  1. import requests

  2. headers = {
  3.     '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'
  4. }

  5. # 构造 POST 请求的数据
  6. data = {
  7.     'set_xxxx_key': 'xxx',  # 这里填写对应的加密数据
  8.     'page': 1  # 第一页的数据
  9. }

  10. url = 'http://example.com/data_api'  # 替换为实际的数据接口地址

  11. result = []  # 存储所有数据

  12. for i in range(1, 31):  # 爬取30页数据
  13.     data['page'] = i  # 更新页码数据
  14.     response = requests.post(url, headers=headers, data=data)
  15.     data_list = response.json()  # 假设返回的数据是JSON格式
  16.    
  17.     # 处理返回的数据,将数据存储到result中
  18.     for item in data_list:
  19.         result.append(item)
  20.    
  21. print(result)
复制代码


在上述代码中,首先定义了一个请求头`headers`和POST请求的数据`data`,然后通过循环构造不同页码的请求,每次更改`data['page']`的值,发送POST请求并获取返回的数据。最后将所有数据存储到`result`列表中。

请注意,该示例仅适用于POST请求,如果有其他类型的请求(如GET请求),则需要根据实际情况进行相应的修改。同时,如果返回的数据不是JSON格式,还需根据实际情况进行处理。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-27 13:46:51 | 显示全部楼层
FishC 发表于 2024-4-27 13:44
对于这种前后端分离的情况,可以通过模拟请求头或者参数来实现请求不同页的数据。以下是一个示例代码:

...

关键就在于没有传递翻页的参数page
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-27 13:47:10 | 显示全部楼层
15779327169 发表于 2024-04-27 13:46
关键就在于没有传递翻页的参数page


非常抱歉之前没有看到您提到的没有传递翻页参数的问题。对于这种情况,您可以尝试通过分析网页请求的方式来获取正确的参数,并使用requests库进行模拟请求。以下是一个示例代码:

import requests

url = '[url=http://example.com/data_api']http://example.com/data_api'[/url]  # 替换为实际的数据接口地址
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-27 16:04:16 From FishC Mobile | 显示全部楼层
isdkz 发表于 2024-4-27 13:56
关键是得找到这个变化的字段是怎么来的,根据什么规则来生成,然而你没有给出具体的网站,所以就只能靠自己 ...

因为是在单位的系统做的一些数据爬取,不方便展示截图,不访问网页直接访问接口可以吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-28 16:06:48 | 显示全部楼层
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)都不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-28 16:12:52 | 显示全部楼层
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)都不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-28 16:13:07 | 显示全部楼层
15779327169 发表于 2024-04-28 16:12
res=requests.post(url,headers=headers,data=data) ...


如果返回的内容不是JSON格式,而是一段包含HTML标签和JavaScript代码的网页内容,那么就需要使用其他方法来解析和提取数据了。以下是一个示例代码,使用BeautifulSoup库来解析HTML并提取数据:

  1. import requests
  2. from bs4 import BeautifulSoup

  3. url = 'http://example.com/data_api'  # 替换为实际的数据接口地址
  4. headers = {
  5.     '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'
  6. }

  7. result = []  # 存储所有数据

  8. for page in range(1, 31):  # 爬取30页数据
  9.     params = {
  10.         'page': page  # 设置翻页参数
  11.     }
  12.     response = requests.get(url, headers=headers, params=params)
  13.     html = response.text
  14.    
  15.     # 使用BeautifulSoup解析HTML
  16.     soup = BeautifulSoup(html, 'html.parser')
  17.    
  18.     # 根据具体的网页结构,提取数据
  19.     data_divs = soup.find_all('div', class_='data-item')
  20.    
  21.     for div in data_divs:
  22.         # 提取数据,根据实际情况进行处理
  23.         data = {
  24.             'title': div.find('span', class_='title').text,
  25.             'content': div.find('span', class_='content').text
  26.         }
  27.         result.append(data)
  28.    
  29. print(result)
复制代码


在上述代码中,我们通过使用BeautifulSoup库,将返回的HTML内容进行解析,并使用相应的方法(如`find()`和`find_all()`)来提取数据。您需要根据实际的网页结构,修改代码中的选择器,并获取所需的数据。最后将提取到的数据存储在`result`列表中。

希望这对您有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-28 16:22:29 | 显示全部楼层
15779327169 发表于 2024-4-28 16:06
大神你好,我仔细看了一下网页,发现是有page的跳转关键字,可以实现对网页数据的批量爬取,但是在使用po ...

可以用正则
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-28 16:30:58 | 显示全部楼层

好的,我试试,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-28 16:52:22 | 显示全部楼层
FishC 发表于 2024-4-28 16:13
如果返回的内容不是JSON格式,而是一段包含HTML标签和JavaScript代码的网页内容,那么就需要使用其他方 ...

如何要匹配{"actname":"XXX","al":"中文"} 这样一个结构的文本,用正则表达式怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-28 16:52:37 | 显示全部楼层
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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-28 16:55:25 | 显示全部楼层
FishC 发表于 2024-4-28 16:52
要匹配形如`{"actname":"XXX","al":"中文"}`的文本结构,可以使用正则表达式来实现。以下是一个示例代 ...

如何要匹配{"actname":"XXX"} 这样一个结构的文本,用正则表达式怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-28 16:55:40 | 显示全部楼层
15779327169 发表于 2024-04-28 16:55
如何要匹配{"actname":"XXX"} 这样一个结构的文本,用 ...


要匹配形如`{"actname":"XXX"}`的文本结构,可以使用正则表达式来实现。以下是一个示例代码:

  1. import re

  2. text = '{"actname":"XXX"}'
  3. pattern = r'\{"actname":"(.*?)"\}'

  4. result = re.findall(pattern, text)
  5. print(result)
复制代码


在上述代码中,我们使用了正则表达式的`findall()`方法来查找所有符合模式的结果。其中,模式`r'\{"actname":"(.*?)"\}'`表示:首先匹配一个`{`字符,后跟`"actname":"`,接着使用`(.*?)`来匹配任意字符(非贪婪模式),直到遇到`"`字符,最后匹配`}`字符。

运行这段代码会输出`['XXX']`作为结果,表示成功匹配到了`XXX`。

需要注意的是,正则表达式是一种强大的文本处理工具,但也有其局限性。如果你面对的是更复杂的文本结构,可能需要考虑其他的解析方法,如JSON解析库等。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-28 17:02:08 | 显示全部楼层
FishC 发表于 2024-4-28 16:55
要匹配形如`{"actname":"XXX"}`的文本结构,可以使用正则表达式来实现。以下是一个示例代码:

如何把正则表达式匹配到的一个字典中的数据遍历出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-28 17:02:27 | 显示全部楼层
15779327169 发表于 2024-04-28 17:02
如何把正则表达式匹配到的一个字典中的数据遍历出来


如果您使用正则表达式匹配到了一个字典中的数据,并想要遍历这个字典中的数据,可以使用Python的for循环来实现。以下是一个示例代码:

  1. import re

  2. text = '{"actname":"XXX", "al":"中文"}'
  3. pattern = r'\{"actname":"(.*?)","al":"(.*?)"\}'

  4. result = re.findall(pattern, text)
  5. if result:
  6.     data = result[0]  # 假设只有一个匹配结果
  7.     for key, value in data.items():
  8.         print(key, value)
复制代码


在上述代码中,我们首先使用正则表达式`findall()`方法找到匹配的结果,并假设只有一个匹配结果,将其存储在`data`变量中。然后,通过`items()`方法遍历字典中的键值对,并打印出每个键和对应的值。

运行这段代码会输出:

  1. actname XXX
  2. al 中文
复制代码


表示成功遍历出了字典中的数据。

需要注意的是,如果匹配到多个结果,您可能需要使用循环来遍历每个结果,并分别进行处理。另外,如果您的匹配结果中包含了嵌套的字典或其他数据结构,您可能需要递归地遍历这些嵌套的数据。

希望这能帮到您!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-28 17:11:47 | 显示全部楼层
FishC 发表于 2024-4-28 17:02
如果您使用正则表达式匹配到了一个字典中的数据,并想要遍历这个字典中的数据,可以使用Python的for循 ...

a= ['[{1:3},{2:13}]']
如何把{1:3}和{2:13} 两个字典取出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-28 17:12:02 | 显示全部楼层
15779327169 发表于 2024-04-28 17:11
a= ['']
如何把{1:3}和{2:13} 两个字典取出来


要从列表 `a` 中取出 `{1:3}` 和 `{2:13}` 两个字典,可以使用索引来实现。以下是一个示例代码:

  1. a = ['{1:3}', '{2:13}']

  2. dict1 = eval(a[0])
  3. dict2 = eval(a[1])

  4. print(dict1)  # 输出:{1: 3}
  5. print(dict2)  # 输出:{2: 13}
复制代码


在上述代码中,我们通过 `eval()` 函数将字符串 `{1:3}` 和 `{2:13}` 转换为字典类型,然后将其分别赋值给 `dict1` 和 `dict2` 变量。最后,通过打印这两个变量来验证结果。

需要注意的是,使用 `eval()` 函数需要谨慎,因为它会执行字符串中包含的表达式。在这个特定的场景中,我们假设列表中的每个字符串都是安全的,并且可以被安全地执行为字典。如果您的列表中包含不受信任的字符串或者无法保证安全性,建议使用其他方法来解析字符串并转换为字典。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-4-28 17:15:03 | 显示全部楼层
FishC 发表于 2024-4-28 17:12
要从列表 `a` 中取出 `{1:3}` 和 `{2:13}` 两个字典,可以使用索引来实现。以下是一个示例代码:

如果a =[['{1:3}', '{2:13}']],如何把{1:3}和{2:13} 两个字典取出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-24 08:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表