返回信息流应该是构造请求头的问题,是这样的:
我要访问的一个网站,需要获取弹窗的内容,类似于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)
```
这是一条镜像帖。来源:北邮人论坛 / python / #25943同步于 2021/12/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
求助一个爬虫的问题
xiaoguiwk
2021/12/22镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这个我也不懂,我做么做是因为网站是这么做的,当然强行改成get也不会得到返回的,以下为图片参考
https://s2.loli.net/2021/12/22/lIYcuivkxfj23UV.png
【 在 Jaysonfather 的大作中提到: 】
: 为啥第一个要用post请求
我的李姐是:模拟点击也是发送请求,包括get post delete send等等,点击是一个动作,但背后的逻辑是向服务器发送一个请求。而我这里正好碰到的就是这样的问题:点击了一次,向服务器分别发送了一个post和一个get请求。
【 在 Jaysonfather 的大作中提到: 】
: 那不应该模拟点击再爬取吗
不对的
【 在 xiaoguiwk 的大作中提到: 】
: 我的李姐是:模拟点击也是发送请求,包括get post delete send等等,点击是一个动作,但背后的逻辑是向服务器发送一个请求。而我这里正好碰到的就是这样的问题:点击了一次,向服务器分别发送了一个post和一个get请求。
有排查为什么会话强制关闭吗?
你现在描述的问题,不论你get还是post,都是要建立在用户成功登陆了后的请求,你确保你在post时,用户信息是登陆状态了吗
还有请求接口的返回值打印一下看看,是30x 40x 还是什么状态码
```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'))
```
登录的,都是在同一个session中完成的
这里的会话准确来讲应该是被abort,没有response,而是直接报错了,所以状态码也没有,完整的报错信息贴在楼上了
【 在 suping 的大作中提到: 】
: 有排查为什么会话强制关闭吗?
: 你现在描述的问题,不论你get还是post,都是要建立在用户成功登陆了后的请求,你确保你在post时,用户信息是登陆状态了吗
还有请求接口的返回值打印一下看看,是30x 40x 还是什么状态码
那正确的过程应该是怎样呢?如果点击后不是发起http请求的话,为什么会出现两个请求呢?还有就是点击产生的过程及响应为何?谢谢。
【 在 Jaysonfather 的大作中提到: 】
: 不对的