问题遇到的现象和发生背景
在使用python爬虫模拟登陆糖果vr网站时,出现了discuz!错误:您当前的访问请求当中含有非法字符,已经被系统拒绝。
(headers和data除了cookie以外已经尽量使用我自己访问的数据了)
用代码块功能插入代码,请勿粘贴截图
import requests
import ddddocr
import re
from lxml import etree
if __name__ == "__main__":
session = requests.Session()
url = 'https://www.tangguo2.com/member.php?mod=logging&action=login'
loginUrl = 'https://www.tangguo2.com/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LgS81&inajax=1'
mainUrl = 'https://www.tangguo2.com/plugin.php?id=dsu_paulsign:sign'
headers = {
'User-Agent':此处本来为我的UA(保密一下)
}
mainResponce = requests.get(url, headers=headers).text
# print(mainResponce)
tree = etree.HTML(mainResponce)
formHash = tree.xpath('/html/body/div[5]/div[1]/div/div[3]/div/form/input[2]/@value')[0]
jpgUrl = tree.xpath('/html/body/div[7]/div/div[2]/div/div[2]/div[1]/div[1]/form/div/span/@id')[0]
jpgName = re.findall('seccode_(.*)', jpgUrl)[0]
headers1 = {
'User-Agent':我的UA,
'referer': 'https://www.tangguo2.com/member.php?mod=logging&action=login',
'sec-fetch-dest': 'image',
'sec-fetch-mode': 'no-cors',
'sec-fetch-site': 'same-origin',
'authority': 'www.tangguo2.com',
'method': 'GET',
'scheme': 'https',
'accept': 'image/webp,image/apng,image/*,*/*;q = 0.8',
'accept-encoding': 'gzip,deflate,br',
'accept-language': 'zh-CN,zh;q=0.9',
}
jpgUrl = 'https://www.tangguo2.com/misc.php?mod=seccode&update=76180&idhash=' + jpgName
jpgResponce = requests.get(jpgUrl, headers=headers1).content
ocr = ddddocr.DdddOcr(old=True)
with open('seccode.jpg', 'wb') as fp:
fp.write(jpgResponce)
image = jpgResponce
image_result = ocr.classification(image)
loginHeaders = {
'authority': 'www.tangguo2.com',
'method': 'POST',
'path': '/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LmzaO&inajax=1',
'scheme':'https',
'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding':'gzip,deflate,br',
'accept-language':'zh-CN,zh;q=0.9',
'cache-control': 'max-age=0',
'content-length': '222',
'content-type': 'application/x-www-form-urlencoded',
'origin': 'https://www.tangguo2.com',
'referer': 'https://www.tangguo2.com/member.php?mod=logging&action=login',
'sec-fetch-dest': 'iframe',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'User-Agent': 我的UA
}
data = {
'formhash': formHash,
'referer': 'https://www.tangguo2.com/forum.php',
'loginfield': 'username',
'username':原来为我的账户,
'password':原来为我的密码,
'questionid': '0',
'answer':'',
'seccodehash': jpgName,
'seccodemodid': 'member::logging',
'seccodeverify': image_result
}
loginResponce = session.post(loginUrl, headers=headers, data=data).text
print(loginResponce)
testXpath = '//*[@id="deanmembercontent"]/dl/dd[1]/a/text()'
print(jpgName)
print(image_result)
最后还有一些没写完,因为这个报错所以卡在这里了
运行结果及报错内容
验证码能够正确输出,账户和密码都是正确的。header和data也已经核对过了。
但是还是会出现错误:
Discuz! System Error
- 您当前的访问请求当中含有非法字符,已经被系统拒绝
我的解答思路和尝试过的方法
验证码获取用了带带弟弟ocr,数据聚焦用了xpath,并用了正则做了一下数据解析
尝试过的方法就是让header和data尽量和我自己的一样,但还是没有
好像是discuz的防护机制,不知道还有没有什么办法
我想要达到的结果
希望能找到解决这个的办法(不觉得爬虫连个论坛都不能模拟登陆)