前言
题解
第一反应是,写个爬虫跑一千次。
延迟2s+每10次再延迟10s都会429 真的烦。
最高记录:
而且很奇怪,明明是同一个session,先get再post答案是错的,要想跑脚本只能不停的post结果。没法重试。
百度看了下别人的wp,延迟0.1s都没问题,为什么?????
想了很久,突然发现一行检测429的代码
if r.status_code == 429 or '429' in r.text:
无语啊无语,真就画蛇添足作茧自缚。如果表达式有429三个字符不就完了吗!!
怎么这么无语啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊。
又试了试,在一开始的get,不设置cookie,然后接post就没问题。但如果设置了cookie,那后面的第一个post必错。
payload:
import time
import requests
from bs4 import BeautifulSoup
def solve(r):
soup = BeautifulSoup(r.text, 'lxml')
exp = [i for i in soup.body.center.stripped_strings][-1]
return eval(exp)
session = requests.session()
url = "http://51f4e728-7df5-4989-8800-a1576ec0fdce.node4.buuoj.cn:81/index.php"
r = session.get(url)
r.encoding = 'utf8'
result = solve(r)
for n in range(1, 1002):
data = {"answer": result}
r = session.post(url, data=data)
r.encoding = 'utf8'
result = solve(r)
if r.status_code == 429:
print("429了")
exit()
if n > 999:
print(r.text)
elif 'bingo' in r.text:
print(n)
elif '算错' in r.text:
print("算错了")
exit()
time.sleep(0.1)
关于session的cookie问题
这cookie让我感觉很奇怪,写点代码测试下
测试1
2.php
<?php
session_start();
echo $_COOKIE["PHPSESSID"];
import requests
s = requests.session()
url = 'http://127.0.0.1/2.php'
r = s.get(url)
print("第1次get:" + r.text)
print("第1次的cookies:" + str(r.cookies))
print("第1次的session的cookies :" + str(s.cookies))
print('------------------------------------')
r = s.get(url)
print("第2次get:" + r.text)
print("第2次的cookies:" + str(r.cookies))
print("第2次的session的cookies :" + str(s.cookies))
print('------------------------------------')
cookies = {'PHPSESSID': 'vepn9g7r3lqfc23skjn06te693'}
r = s.get(url, cookies=cookies)
print("第3次get:" + r.text)
print("第3次的cookies:" + str(r.cookies))
print("第3次的session的cookies :" + str(s.cookies))
print('------------------------------------')
s.cookies.update(cookies)
r = s.get(url, cookies=cookies)
print("第4次get:" + r.text)
print("第4次的cookies:" + str(r.cookies))
print("第4次的session的cookies :" + str(s.cookies))
第1次get:
第1次的cookies:<RequestsCookieJar[<Cookie PHPSESSID=pm841ptlo3hcg90n4frjkgpufo for 127.0.0.1/>]>
第1次的session的cookies :<RequestsCookieJar[<Cookie PHPSESSID=pm841ptlo3hcg90n4frjkgpufo for 127.0.0.1/>]>
------------------------------------
第2次get:pm841ptlo3hcg90n4frjkgpufo
第2次的cookies:<RequestsCookieJar[]>
第2次的session的cookies :<RequestsCookieJar[<Cookie PHPSESSID=pm841ptlo3hcg90n4frjkgpufo for 127.0.0.1/>]>
------------------------------------
第3次get:pm841ptlo3hcg90n4frjkgpufo
第3次的cookies:<RequestsCookieJar[]>
第3次的session的cookies :<RequestsCookieJar[<Cookie PHPSESSID=pm841ptlo3hcg90n4frjkgpufo for 127.0.0.1/>]>
------------------------------------
第4次get:vepn9g7r3lqfc23skjn06te693
第4次的cookies:<RequestsCookieJar[]>
第4次的session的cookies :<RequestsCookieJar[<Cookie PHPSESSID=vepn9g7r3lqfc23skjn06te693 for />, <Cookie PHPSESSID=pm841ptlo3hcg90n4frjkgpufo for 127.0.0.1/>]>
也就是说,session的第一次get,实际上还处于设置cookie的阶段,cookie会放到返回包,之后的连接就会放到session里面了。
测试2
百度有些文章说得把dict转化为cookiejar才能传,
看了下官方文档,dict直接传也是可以的,但仅限第一次。
<?php
session_start();
echo $_COOKIE["PHPSESSID"];
var_dump($_COOKIE);
import requests
s = requests.session()
url = 'http://127.0.0.1/2.php'
cookies = {'a': 'aaa'}
r = s.get(url, cookies=cookies)
print(r.text)
array(1) {
["a"]=>
string(3) "aaa"
}
测试3
<?php
session_start();
setcookie('TEST', 'TEST');
echo $_COOKIE["PHPSESSID"] . ' ' . $_COOKIE['TEST'];
import requests
s = requests.session()
cookies = {'PHPSESSID': 'vepn9g7r3lqfc23skjn06te693', 'TEST': 'FIX'}
url = 'http://127.0.0.1/1.php'
r = s.get(url, cookies=cookies)
print("第1次get:" + r.text)
print("第1次的cookies:" + str(r.cookies))
print("第1次的session的cookies :" + str(s.cookies))
print('------------------------------------')
r = s.get(url)
print("第2次get:" + r.text)
print("第2次的cookies:" + str(r.cookies))
print("第2次的session的cookies :" + str(s.cookies))
print('------------------------------------')
r = s.get(url, cookies=cookies)
print("第3次get:" + r.text)
print("第3次的cookies:" + str(r.cookies))
print("第3次的session的cookies :" + str(s.cookies))
print('------------------------------------')
r = s.get(url)
print("第4次get:" + r.text)
print("第4次的cookies:" + str(r.cookies))
print("第4次的session的cookies :" + str(s.cookies))
第1次get:vepn9g7r3lqfc23skjn06te693 FIX
第1次的cookies:<RequestsCookieJar[<Cookie TEST=TEST for 127.0.0.1/>]>
第1次的session的cookies :<RequestsCookieJar[<Cookie TEST=TEST for 127.0.0.1/>]>
------------------------------------
第2次get: TEST
第2次的cookies:<RequestsCookieJar[<Cookie PHPSESSID=5r5fbk2ljn1n7jo1so7s5qjjuc for 127.0.0.1/>, <Cookie TEST=TEST for 127.0.0.1/>]>
第2次的session的cookies :<RequestsCookieJar[<Cookie PHPSESSID=5r5fbk2ljn1n7jo1so7s5qjjuc for 127.0.0.1/>, <Cookie TEST=TEST for 127.0.0.1/>]>
------------------------------------
第3次get:5r5fbk2ljn1n7jo1so7s5qjjuc TEST
第3次的cookies:<RequestsCookieJar[<Cookie TEST=TEST for 127.0.0.1/>]>
第3次的session的cookies :<RequestsCookieJar[<Cookie PHPSESSID=5r5fbk2ljn1n7jo1so7s5qjjuc for 127.0.0.1/>, <Cookie TEST=TEST for 127.0.0.1/>]>
------------------------------------
第4次get:5r5fbk2ljn1n7jo1so7s5qjjuc TEST
第4次的cookies:<RequestsCookieJar[<Cookie TEST=TEST for 127.0.0.1/>]>
第4次的session的cookies :<RequestsCookieJar[<Cookie PHPSESSID=5r5fbk2ljn1n7jo1so7s5qjjuc for 127.0.0.1/>, <Cookie TEST=TEST for 127.0.0.1/>]>
结论
无论是常规get还是session,流程都是:
HTTP请求->Server设置COOKIES->把COOKIES传回Client->Client第二次请求->Server获取对应Cookies。
第一次请求的时候Client还没有Cookies所以不会打印cookies。
经过测试,发现PHPSESSID
这个Cookie很特殊,用Session的话只有在第一次客户端设定session并返回的时候才会出现在r
的cookies
里(因为需要把cookies返回),之后就会交给s
进行管理。
而且在session成型之后,就无法直接添加到get/post里的cookies参数进行传值了,需要添加到session里。
所以方便起见,session就老老实实用cookies.update()