python3.x - requets模拟带验证码登录豆瓣不成功,求帮忙。。
问题描述
import urllib.request
from bs4 import BeautifulSoup
import urllib.parse
import requests
url = 'http://accounts.douban.com/login'
def loginin(url):
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0",
}
data = {
"redir": "http://movie.douban.com/mine?status=collect",
"form_email": 'monsterxmonster@163.com',
"form_password": '123123qq',
"login": u'登录'
}
r = requests.post(url,data,headers)
#获取验证码图片,并且保存到本地
soup = BeautifulSoup(r.text,'lxml')
imgurl = soup.select('#captcha_image')[0]['src']
img = urllib.request.urlopen(imgurl).read()
with open(soup.select('#captcha_image')[0]['src'].split('?')[1][3:7]+'.jpg','wb') as f:
f.write(img)
#输入验证码
yanzhengma = input("yanzhengma:")
data['captcha-solution'] = yanzhengma
data['captcha-id'] = soup.select('#captcha_image')[0]['src'].split('?')[1][3:]
data = urllib.parse.urlencode(data)
r = requests.post(url,data,headers)
print(r.url)
loginin(url)
打印出来的一直是登录界面。。。
另外有个问题想问问,我这样模拟登录的话,第一个post得到一个验证码id和图片,第二个post不是也会得到另外的验证码图片吗?那id不是变了??我再拿上一个的验证码和id去post是不是会出错??
但是我又想到,我打开豆瓣的时候,验证码和id已经下载好了,服务器并不知道是谁要使用这个id,是不是我只要提交的 验证码id 和 验证码是相对应的 我就能成功登录呢??
不好意思,问的问题比较低级。。。
你的requests用错啦~ 登陆之后你要保持回话啊!!!
# 直接这样请求,每次调用都是一个新的会话
requests.get(url)
requests.get(url)
# 这样就可以保持会话啦
s = requests.Session()
s.get(url)
s.get(url)
详情看看这里requests保持会话
来说一下你的问题哈~
1.先说http服务器中说的cookie是个什么
cookie就是你每次请求的时候http header上的一个value。
当你在浏览器第一次访问这个网页的时候,服务器会给你这个请求加一个长长的字符串,作为你的身份标识,然后浏览器会存储这个标识。以后你的每次访问这个网站下的网页就会加上这个标识一起请求对方的服务器。而这个标识就是cookie,放在请求头(header)上。
而服务器怎么做呢,他会用一种方式(先不管什么方式),把你的信息存到某个地方,把你的cookie当作这个信息的唯一标识,形成一个key-value对。这样你每次访问服务器就知道你到底是谁啦~
2.验证码咋工作的呢
当你需要登录的时候,服务器生成一个知道图片内容的验证码返回给你并把验证码的真实值存起来,当你查看验证码并带着请求登录时,服务器通过你的cookie找到和你对应的那个验证码的真实值来判断你的验证码是不是输入正确,如果验证码正确账号密码也正确服务器就把你登录成功的信息存起来~ 当你下次访问的时候,他也通过你的cookie来判断你是否登录啦。这样如果你登录了自然就不会返回验证码给你咯~
是不是有点迷糊,所以啊,写爬虫之前最好学习一下简单的web后端开发的知识,这样你才能知道你的爬虫到底做了什么到底改怎么做。爬虫就像攻击者,后端开发就像防守者,知己知彼方能百战百胜~
这篇关于python3.x - requets模拟带验证码登录豆瓣不成功,求帮忙。。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!