bobby老师,Content-Length如何伪造
来源:10-4 scrapy-redis编写分布式爬虫代码
卡卡奇
2017-08-19
在爬知乎,被限制ip,要输入验证码,就用Requests来POST表单
还有https://www.zhihu.com/api/v4/anticrawl/captcha_appeal
向https://www.zhihu.com/api/v4/anticrawl/captcha_appeal POST验证码表单{"captcha":"1234"}
但是POST过去,被返回502,感觉是Headers头没被认可
从游览器抓包看到的 POST{"captcha":"1234"} Content-Length:18 好像是知乎的JS代码伪造了Content-Length
在Pycharym中调试的时候 Content-Length小大概6
请问老师怎么解决,Content-Length能伪造吗
代码
import requests
from requests.cookies import RequestsCookieJar
from PIL import Image
from io import StringIO,BytesIO
import json
import base64
def captcha():
cap_url='https://www.zhihu.com/account/unhuman?type=unhuman&message=%E7%B3%BB%E7%BB%9F%E6%A3%80%E6%B5%8B%E5%88%B0%E6%82%A8%E7%9A%84%E5%B8%90%E5%8F%B7%E6%88%96IP%E5%AD%98%E5%9C%A8%E5%BC%82%E5%B8%B8%E6%B5%81%E9%87%8F%EF%BC%8C%E8%AF%B7%E8%BE%93%E5%85%A5%E4%BB%A5%E4%B8%8B%E5%AD%97%E7%AC%A6%E7%94%A8%E4%BA%8E%E7%A1%AE%E8%AE%A4%E8%BF%99%E4%BA%9B%E8%AF%B7%E6%B1%82%E4%B8%8D%E6%98%AF%E8%87%AA%E5%8A%A8%E7%A8%8B%E5%BA%8F%E5%8F%91%E5%87%BA%E7%9A%84'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20',
}
while True:
session=requests.Session()
session.get(cap_url,headers=HEADERS)
HEADERS['Referer']=cap_url
HEADERS['x-udid']='AECCVw_rGwyPTp7COITSriGjKlNqLIiLXsc='
captcha_appeal_url='https://www.zhihu.com/api/v4/anticrawl/captcha_appeal'
res=session.get(captcha_appeal_url,headers=HEADERS)
res_img=json.loads(res.text)
img_content=res_img.get('img_base64')
img_content=base64.b64decode(img_content)
img=Image.open(BytesIO(img_content))
# with open("captcha.png","wb") as f:
# f.write(img_content)
# f.close()
# img=Image.open("captcha.png")
img.show()
# captacha_key=input('请输入验证码')
captacha_key=1324
HEADERS['Host']='www.zhihu.com'
HEADERS['x-xsrftoken']=session.cookies.get('_xsrf')
HEADERS['Origin']='https://www.zhihu.com'
HEADERS['accept']='application/json, text/plain, */*'
HEADERS['Content-Length'] = '18'
payload = {'captcha': str(captacha_key)}
res=session.post(captcha_appeal_url,headers=HEADERS,data=payload)
if res.text!=None:
result=json.loads(res.text)
if 'error' not in result.keys():
print('验证成功')
break
print('验证失败,请重试')
captcha()
HEADERS['Content-Length'] = '18'这个运行中还是会被session覆盖成实际值
已经用selenium重写了一个,但是要慢很多。这个模拟提交知乎反的好厉害请问老师怎么解决阿....
1回答
-
逍遥明月
2017-09-16
Content-Length 这个字段你最好让 http 库自己设置,不要自己乱改。
这个字段在 http 协议中表示消息实体的长度,你得正确指明 Content-Length 服务器才可以正确获取你消息实体的内容。
具体内容请详细了解 http 协议。
00
相似问题