设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 8489|回复: 6
打印 上一主题 下一主题

最近知乎的api发生了变化, 无法获得dict数据了, 求助.

[复制链接]

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

跳转到指定楼层
楼主
发表于 2022-1-25 19:23:39 |只看该作者 |正序浏览
本帖最后由 anyone 于 2022-1-25 19:24 编辑

api的地址似乎没有变化,

地址还是:
  1. https://www.zhihu.com/api/v4/questions/{问题号码}/answers
复制代码
cookies 我一直是直接拷贝 chrome network中的cookies, 做一些简单的处理, 让其变成dict, 然后传入requests

头部使用:
  1. {
  2.                         'Host': "www.zhihu.com",
  3.                 'Origin': "http://www.zhihu.com",
  4.                 'Pragma': "no-cache",
  5.                 'Referer': "http://www.zhihu.com/"
  6.                 }
复制代码
以前这样就能爬出他的答案数据了. 可是从这两天开始, 就不行了, 总是反馈:
  1. {"error":{"message":"请求参数异常,请升级客户端后重试","code":10003}}
复制代码
我在chrome的inspect中是可以看到答案数据的. 但是python中就不行.  
也尝试了将chrome的完整头部传输到requests中, 也是同样的错误提示?

似乎他们做了防爬处理? 请大神帮忙看看, 还有没有可能爬出答案?

非常感谢.



回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

7#
发表于 2022-1-27 01:43:11 |只看该作者
本帖最后由 anyone 于 2022-2-26 15:35 编辑

找到了几篇讨论这个事情的文章, 留此存档.

最新!Python爬虫爬取知乎文章内容(解决最新js反爬2021.8)_酒鬼考拉的博客-CSDN博客_爬虫爬文章
https://blog.csdn.net/weixin_51962852/article/details/119536986

有读者让我爬逼乎,是我大意了...(2021年知乎最新爬虫)_Kuls-CSDN博客
https://blog.csdn.net/qq_3654753 ... c_relevant_antiscan

新版知乎x-zse-86加密破解分析_一只不会爬的虫子-CSDN博客
https://blog.csdn.net/weixin_40352715/article/details/107546166

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2022-1-26 22:29:16 |只看该作者
你的思路挺好,包括前面对api变化的分析,看起来不像是个编程小白
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2022-1-26 22:27:20 |只看该作者
selenium,可以设置headless模式
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

地板
发表于 2022-1-26 22:22:11 |只看该作者
感谢你的回复, 其中2种可能的总结给我了一些思路. 不过我是个编程小白, 勉强用用python的浅显功能, 估计暂时还达到不了做这个事情的水平.

目前我也在想另外一个思路, 有没有headless的浏览器, 在其中模拟滚动页面, 直到页面底部. 然后在html中萃取需要的数据.

不知道 @crossin先生 有什么可以推荐的headless的爬虫方案吗? 万分感谢.
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2022-1-26 21:43:29 |只看该作者
请问这些头是怎么生成的呢?
---------
通常两种可能:
1.是根据已有的数据,通过某种规则计算出来。这个计算的代码在前端js里,理论上来说可以被找到并仿照实现
2.是每次后台提供的。这种情况也可以找到对应的数值或者请求,仿照同样的方法进行模拟
难点是如何从页面的大段代码里找到这个数据的来源。
这个需要前端,尤其是JS的经验。chrome开发者工具可以打断点的,可以搜索及学习下如何分析前端js代码(这是个技术活+辛苦活)

从实用角度来说,一般知名网站的接口,网上大多会有分析,去搜一搜可能会找到。但如果接口是刚刚改的,可能不太能找到,因为大家都还在学习中

但这种都是有赖于经验,再加上花精力去分析,没有固定的套路,每个网站用的方法都不会完全相同,所以也就没有一个可以直接照搬的教程(除非别人针对某个版本写好了)
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

沙发
发表于 2022-1-26 16:32:07 |只看该作者
我对比了一下chrome里面的request, 发现:

如果是在同一个登录窗口中, 每次不同页面的请求会有一个头产生变化:

"x-zse-96" 和  "x-zst-81":

如果是换了一个未登录知乎的窗口, 问题也能正常显示, 但请求头除了上面两个发生变化之外, 还有下面两个也变了

"x-ab-param" 和 "x-ab-pb"

上述的4个头参数的值都是类似口令似的无规律的,

请问这些头是怎么生成的呢?
如果不方便案例分析, 不知道哪里可以有相关教程我可以自己学习一下?

感谢.


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 04:19 , Processed in 0.014419 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部