BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #25943同步于 2021/12/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

求助一个爬虫的问题

xiaoguiwk
2021/12/22镜像同步14 回复
应该是构造请求头的问题,是这样的: 我要访问的一个网站,需要获取弹窗的内容,类似于byrbbs主页点击左上角“欢迎xiaoguiwk”这里显示出自己的个人信息的内容。当然byrbbs是可以直接用一个get请求获取到的,其中用到了两个请求: 1.post('https://bbs.byr.cn/user/ajax_tquery.json') 2.get('https://bbs.byr.cn/user/query/xiaoguiwk.json')但实际爬虫直接用2这个请求就可以了。 然而我要访问的目标网站的逻辑是这样的: 1.post('https://bbs.byr.cn/user/ajax_tquery.json'),response中返回一个图片的hash值,然后用这个hash值构造第二个请求; 2.get('https://bbs.byr.cn/hash值')。 因此来说,我必须要先做一个post请求拿到hash值,才能够构造第二个请求,而byrbbs直接发起第二个请求即可。 所以问题在这儿: 第二个请求我会构造,问题在于第一个请求是如何构造的?这个post请求没有携带任何数据,我将在浏览器中获取到的参数都加入到headers中,结果是会话被强制关闭。以下是我的代码: (所有cookies均已删除,如需测试请调用自己的cookies,感谢!) 模拟登录的部分 ```python s = requests.Session() headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", "Cookie":"", } url = 'https://bbs.byr.cn/' r = s.get(url,headers = headers) ``` 第一个失败的post请求 ```python h1 = { 'accept': '*/*', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,ko;q=0.8', 'content-length': '20', 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 'cookie': '', 'origin': 'https://bbs.byr.cn', 'referer': 'https://bbs.byr.cn/', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': "Windows", 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', 'x-requested-with': 'XMLHttpRequest', } r1 = s.post('https://bbs.byr.cn/user/ajax_tquery.json',headers = h1) ``` 第二个成功的get请求 ```python h2 = { 'accept': 'application/json, text/javascript, */*; q=0.01', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,ko;q=0.8', 'cookie': '', 'referer': 'https://bbs.byr.cn/', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': "Windows", 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36', 'x-requested-with': 'XMLHttpRequest', } r2 = s.get('https://bbs.byr.cn/user/query/xiaoguiwk.json',headers = h2) ```
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Jaysonfather机器人#1 · 2021/12/22
为啥第一个要用post请求
xiaoguiwk机器人#2 · 2021/12/22
这个我也不懂,我做么做是因为网站是这么做的,当然强行改成get也不会得到返回的,以下为图片参考 https://s2.loli.net/2021/12/22/lIYcuivkxfj23UV.png 【 在 Jaysonfather 的大作中提到: 】 : 为啥第一个要用post请求
Jaysonfather机器人#3 · 2021/12/22
那不应该模拟点击再爬取吗
xiaoguiwk机器人#4 · 2021/12/22
我的李姐是:模拟点击也是发送请求,包括get post delete send等等,点击是一个动作,但背后的逻辑是向服务器发送一个请求。而我这里正好碰到的就是这样的问题:点击了一次,向服务器分别发送了一个post和一个get请求。 【 在 Jaysonfather 的大作中提到: 】 : 那不应该模拟点击再爬取吗
Jaysonfather机器人#5 · 2021/12/22
不对的 【 在 xiaoguiwk 的大作中提到: 】 : 我的李姐是:模拟点击也是发送请求,包括get post delete send等等,点击是一个动作,但背后的逻辑是向服务器发送一个请求。而我这里正好碰到的就是这样的问题:点击了一次,向服务器分别发送了一个post和一个get请求。
suping机器人#6 · 2021/12/22
有排查为什么会话强制关闭吗? 你现在描述的问题,不论你get还是post,都是要建立在用户成功登陆了后的请求,你确保你在post时,用户信息是登陆状态了吗 还有请求接口的返回值打印一下看看,是30x 40x 还是什么状态码
xiaoguiwk机器人#7 · 2021/12/22
```python Traceback (most recent call last): File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 699, in urlopen httplib_response = self._make_request( File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 445, in _make_request six.raise_from(e, None) File "<string>", line 3, in raise_from File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 440, in _make_request httplib_response = conn.getresponse() File "C:\Users\15296\Anaconda3\lib\http\client.py", line 1347, in getresponse response.begin() File "C:\Users\15296\Anaconda3\lib\http\client.py", line 307, in begin version, status, reason = self._read_status() File "C:\Users\15296\Anaconda3\lib\http\client.py", line 276, in _read_status raise RemoteDisconnected("Remote end closed connection without" http.client.RemoteDisconnected: Remote end closed connection without response During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\15296\Anaconda3\lib\site-packages\requests\adapters.py", line 439, in send resp = conn.urlopen( File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 755, in urlopen retries = retries.increment( File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\util\retry.py", line 532, in increment raise six.reraise(type(error), error, _stacktrace) File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\packages\six.py", line 734, in reraise raise value.with_traceback(tb) File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 699, in urlopen httplib_response = self._make_request( File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 445, in _make_request six.raise_from(e, None) File "<string>", line 3, in raise_from File "C:\Users\15296\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 440, in _make_request httplib_response = conn.getresponse() File "C:\Users\15296\Anaconda3\lib\http\client.py", line 1347, in getresponse response.begin() File "C:\Users\15296\Anaconda3\lib\http\client.py", line 307, in begin version, status, reason = self._read_status() File "C:\Users\15296\Anaconda3\lib\http\client.py", line 276, in _read_status raise RemoteDisconnected("Remote end closed connection without" urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\15296\Anaconda3\lib\site-packages\requests\sessions.py", line 590, in post return self.request('POST', url, data=data, json=json, **kwargs) File "C:\Users\15296\Anaconda3\lib\site-packages\requests\sessions.py", line 542, in request resp = self.send(prep, **send_kwargs) File "C:\Users\15296\Anaconda3\lib\site-packages\requests\sessions.py", line 655, in send r = adapter.send(request, **kwargs) File "C:\Users\15296\Anaconda3\lib\site-packages\requests\adapters.py", line 498, in send raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')) ```
xiaoguiwk机器人#8 · 2021/12/22
登录的,都是在同一个session中完成的 这里的会话准确来讲应该是被abort,没有response,而是直接报错了,所以状态码也没有,完整的报错信息贴在楼上了 【 在 suping 的大作中提到: 】 : 有排查为什么会话强制关闭吗? : 你现在描述的问题,不论你get还是post,都是要建立在用户成功登陆了后的请求,你确保你在post时,用户信息是登陆状态了吗 还有请求接口的返回值打印一下看看,是30x 40x 还是什么状态码
xiaoguiwk机器人#9 · 2021/12/22
那正确的过程应该是怎样呢?如果点击后不是发起http请求的话,为什么会出现两个请求呢?还有就是点击产生的过程及响应为何?谢谢。 【 在 Jaysonfather 的大作中提到: 】 : 不对的