作为昨天的验证码练习,手动输入
模仿的是douban
前期准备
image.pngdouban在登录的时候,如果一次成功,则没有什么关系
如果失败,或者多次请求,会出现验证码
form的url
form的结构
<input id="email" name="form_email" type="text" class="basic-input" maxlength="60" value="xxxxxxxx" tabindex="1">
<input id="password" name="form_password" type="password" class="basic-input" maxlength="20" tabindex="2">
<input type="text" id="captcha_field" name="captcha-solution" tabindex="3" placeholder="验证码">
此外,有2个hidden,意思不明,如果只是3个而不能post请求成功的话,会加入下面这2个
<input name="source" type="hidden" value="index_nav">
<input name="redir" type="hidden" value="https://www.douban.com/">
image.png
验证码的url
至此,前期调查完成
代码
新建项目
新建项目的时候选择anacoda的环境,否则不认
image.png
如果没有这个选项,可以先在file ->default settings中添加
image.png最终代码
import requests
from lxml import etree
url = "https://accounts.douban.com/login"
header ={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}
import user
data = {
"form_email":user.email,
"form_password":user.password
}
r = requests.post(url = url,headers = header, data=data)
captcha = etree.HTML(r.text).xpath("//img[@id='captcha_image']/@src")
# 开始没有加这一项,结果失败,推测跟图片的验证码是一一对应的关系,图片是问题,这个是答案
captchaId = etree.HTML(r.text).xpath("//input[@name='captcha-id']/@value")
if (len(captcha) > 0 ):
print(captcha[0])
with open("1.jpg","wb") as fn :
fn.write(requests.get(captcha[0]).content)
captchaCode = input(">>>>")
# 添加验证码后再次发起请求
data["captcha-solution"] = captchaCode
data["captcha-id"]=captchaId
print(data)
r = requests.post(url=url, headers=header, data=data)
print(r.text)
else:
print(r.text)
scrapy的参考
https://www.jianshu.com/p/1567d45b5588
网友评论