鱼C论坛

 找回密码
 立即注册
查看: 1936|回复: 5

[已解决]爬虫求助

[复制链接]
发表于 2023-2-6 17:16:14 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 fc5igm 于 2023-2-6 17:27 编辑

目标是爬取下图中的网页信息
屏幕截图 2023-02-06 170317.png

网址链接:https://www.csindex.com.cn/#/indices/family/list?index_series=5

为此,写了如下代码
  1. import urllib
  2. import json

  3. headers={'Accept': r'application/json, text/plain, */*', 'User-Agent': r'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.78'}
  4. url=r'https://www.csindex.com.cn/csindex-home/index-list/query-index-item'
  5. data='{"sorter":{"sortField":"null","sortOrder":null},"pager":{"pageNum":1,"pageSize":10},"indexFilter":{"ifCustomized":null,"ifTracked":null,"ifWeightCapped":null,"indexCompliance":null,"hotSpot":null,"indexClassify":["16","18"],"currency":null,"region":["china_mainland"],"indexSeries":["6","1","2","3"],"undefined":null}}'
  6. data = urllib.parse.urlencode(json.loads(data)).encode('utf-8')
  7. opener = urllib.request.build_opener()
  8. request = urllib.request.Request(url, headers=headers,data=data)
  9. response = opener.open(request,timeout=10).read().decode('utf-8', 'ignore')
复制代码



然后获得的反馈是
'{"code":"500","msg":"服务器异常,请联系管理员","data":null,"success":false}'

尝试在headers中加入cookie也毫无变化。请问这种情况下应该怎么办?
最佳答案
2023-2-6 17:16:15
本帖最后由 isdkz 于 2023-2-6 17:51 编辑

我试了一下,这个接口并没有反爬机制,所以 UA、Referer、Cookie 都不需要

data你直接原始数据用字符串编码就好,然后 headers 通过 Content-Type 告诉他 data 里面的是什么类型

  1. import urllib.request
  2. import json

  3. headers={'Content-Type': 'application/json;charset=UTF-8'}
  4. url=r'https://www.csindex.com.cn/csindex-home/index-list/query-index-item'
  5. data='{"sorter":{"sortField":"null","sortOrder":null},"pager":{"pageNum":1,"pageSize":10},"indexFilter":{"ifCustomized":null,"ifTracked":null,"ifWeightCapped":null,"indexCompliance":null,"hotSpot":null,"indexClassify":null,"currency":null,"region":null,"indexSeries":["5"],"undefined":null}}'
  6. data = data.encode('utf-8')
  7. opener = urllib.request.build_opener()
  8. request = urllib.request.Request(url, headers=headers,data=data)
  9. response = opener.open(request,timeout=10).read().decode('utf-8', 'ignore')
  10. print(response)
复制代码

最佳答案

查看完整内容

我试了一下,这个接口并没有反爬机制,所以 UA、Referer、Cookie 都不需要 data你直接原始数据用字符串编码就好,然后 headers 通过 Content-Type 告诉他 data 里面的是什么类型

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2023-2-6 17:16:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-2-6 17:51 编辑

我试了一下,这个接口并没有反爬机制,所以 UA、Referer、Cookie 都不需要

data你直接原始数据用字符串编码就好,然后 headers 通过 Content-Type 告诉他 data 里面的是什么类型

  1. import urllib.request
  2. import json

  3. headers={'Content-Type': 'application/json;charset=UTF-8'}
  4. url=r'https://www.csindex.com.cn/csindex-home/index-list/query-index-item'
  5. data='{"sorter":{"sortField":"null","sortOrder":null},"pager":{"pageNum":1,"pageSize":10},"indexFilter":{"ifCustomized":null,"ifTracked":null,"ifWeightCapped":null,"indexCompliance":null,"hotSpot":null,"indexClassify":null,"currency":null,"region":null,"indexSeries":["5"],"undefined":null}}'
  6. data = data.encode('utf-8')
  7. opener = urllib.request.build_opener()
  8. request = urllib.request.Request(url, headers=headers,data=data)
  9. response = opener.open(request,timeout=10).read().decode('utf-8', 'ignore')
  10. print(response)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-6 18:01:41 | 显示全部楼层
isdkz 发表于 2023-2-6 17:46
我试了一下,这个接口并没有反爬机制,所以 UA、Referer、Cookie 都不需要

data你直接原始数据用字符串 ...

我试了一下,问题好像出在了
  1. data = urllib.parse.urlencode(json.loads(data)).encode('utf-8')
复制代码

这行代码上。

你用的
  1. data = data.encode('utf-8')
复制代码

返回的数据是
  1. b'{"sorter":{"sortField":"null","sortOrder":null},"pager":{"pageNum":1,"pageSize":10},"indexFilter":{"ifCustomized":null,"ifTracked":null,"ifWeightCapped":null,"indexCompliance":null,"hotSpot":null,"indexClassify":["16","18"],"currency":null,"region":["china_mainland"],"indexSeries":["6","1","2","3"],"undefined":null}}'
复制代码


而如果用我原文写的那个,返回的则是
  1. b'sorter=%7B%27sortField%27%3A+%27null%27%2C+%27sortOrder%27%3A+None%7D&pager=%7B%27pageNum%27%3A+1%2C+%27pageSize%27%3A+10%7D&indexFilter=%7B%27ifCustomized%27%3A+None%2C+%27ifTracked%27%3A+None%2C+%27ifWeightCapped%27%3A+None%2C+%27indexCompliance%27%3A+None%2C+%27hotSpot%27%3A+None%2C+%27indexClassify%27%3A+%5B%2716%27%2C+%2718%27%5D%2C+%27currency%27%3A+None%2C+%27region%27%3A+%5B%27china_mainland%27%5D%2C+%27indexSeries%27%3A+%5B%276%27%2C+%271%27%2C+%272%27%2C+%273%27%5D%2C+%27undefined%27%3A+None%7D'
复制代码


可是我看网上都是用的
  1. data = urllib.parse.urlencode(data).encode('utf-8')
复制代码

这样的代码。为什么在这里用反而会错误了呢?
什么时候应该用
  1. data = data.encode('utf-8')
复制代码

又什么时候应该用parse呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-6 18:13:51 | 显示全部楼层
fc5igm 发表于 2023-2-6 18:01
我试了一下,问题好像出在了

这行代码上。


首先,用 urllib 这个库是基于字节来操作的,所以不管怎样都要编码成字节码

然后就是数据的类型了,urllib.parse.urlencode 是将一个字典变成一个 url 参数的格式(a=1&b=2这种格式),数据类型也就是 application/x-www-form-urlencoded

而通过开发者工具看到的post数据的原始格式(raw)就是一个类似于字典的数据,也就是 json,而 json 数据对应的 Content-Type 就是 application/json,因为 Content-Type 的默认值不是这个,所以要自己在 headers 中指出,不然也是会出错的

总而言之,在开发者工具中看 payload 的时候看 raw 格式,raw 是怎样的就要保持不变,然后通过 Content-Type 告诉服务器传的 payload 的格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-6 18:20:05 | 显示全部楼层
isdkz 发表于 2023-2-6 18:13
首先,用 urllib 这个库是基于字节来操作的,所以不管怎样都要编码成字节码

然后就是数据的类型了, ...

十分感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-20 17:22:41 | 显示全部楼层
isdkz 发表于 2023-2-6 17:16
我试了一下,这个接口并没有反爬机制,所以 UA、Referer、Cookie 都不需要

data你直接原始数据用字符串 ...

6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 18:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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