bobby老师,Content-Length如何伪造

来源:10-4 scrapy-redis编写分布式爬虫代码

卡卡奇

2017-08-19

在爬知乎,被限制ip,要输入验证码,就用Requests来POST表单

接口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

还有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 协议。

0
0

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5795 学习 · 6290 问题

查看课程