准备
IDE:pycharm/sublime_text
浏览器:谷歌/火狐
从登录页面出发
截图20181111163829.png 截图20181111163909.png可以发现要实现豆瓣的登录,需要向'https://www.accounts.douban.com/login'
该网址提交7个参数,其中最重要的参数有4个:
form_email(账号),form_password(密码)以及和验证码相关的两个参数captcha-solution,captcha-id ,另外3个加不加不重要
所以问题的关键就是怎么获取验证码的参数,而且我们知道验证码是会改变的。
验证码的解决方案
对验证码右击检查 截图20181111165003.png点击src中的网址,可以发现正是验证码那张图片,同时captcha-id也在src的网址中,那么问题就解决了
对登录页面进行请求,通过正则匹配到验证码图片的地址
(PS:要获取验证码的地址除了正则还有很多方法)
response = requests.get('https://accounts.douban.com/login',headers=headers)
result = response.text
reg = r'<img id="captcha_image" src="(.*?)"'
codeImgUrl = re.findall(reg,result)[0]
print(codeImgUrl)
#https://www.douban.com/misc/captcha?id=BjrEZRf9kvzdO4vZ8jjjXChT:en&size=s
紧接着对图片地址进行请求,将验证码图片保存在桌面
response = requests.get(codeImgUrl,headers=headers)
codeImg = response.content
fn = open('C:\\Users\Administrator\Desktop\code.png','wb')
fn.write(codeImg)
fn.close()
模拟登录的实现
import requests
import re
#请求头,相当于伪造身份,原来是python程序,加上这个请求头之后服务器会认为你是浏览器
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
response = requests.get('https://accounts.douban.com/login',headers=headers)
result = response.text
reg = r'<input type="hidden" name="captcha-id" value="(.*?)"'
captchaId = re.findall(reg,result)[0]
reg = r'<img id="captcha_image" src="(.*?)"'
codeImgUrl = re.findall(reg,result)[0]
response = requests.get(codeImgUrl,headers=headers)
codeImg = response.content
fn = open('C:\\Users\Administrator\Desktop\code.png','wb')
fn.write(codeImg)
fn.close()
data = {
'form_email': '填你的帐号',
'form_password': '填你的密码',
'captcha-solution': input('请输入验证码:'),
'captcha-id': captchaId
}
response =requests.post(url=' https://accounts.douban.com/login', data=data, headers=headers)
if response.url == 'https://www.douban.com/':#如果登录成功,网页会自动跳转到豆瓣首页
print('登录成功')
else:
print('登录失败')
将上面的复制下来,修改帐号和密码,就可以实现豆瓣的登录了
保持登录状态
很重要的一步,我们在使用浏览器的时候,比如通过帐号密码登录上豆瓣网站之后,再继续访问豆瓣里的任何网页都是不需要再登录的,因为Cookie始终保留着,如果要退出登录状态,除了点击退出,在浏览器的历史记录里清除Cookie之后,登录状态也会消失.
首先我们看一下之前我们写的程序,看它能否保持登录状态
请求一下个人主页,打印看一下页面内容
print(requests.get('https://www.douban.com/people/Colsniper/',headers=headers).text)
可以发现连最基本的昵称都没有,也就是你请求个人主页这个页面时,你并没有登录,自然也就没有权限获得个人主页的内容了
那么python 又是如何做到使我们一直保持着登录的状态的呢?
这里就要用到requests下的Session,具体大家可自行百度
我们只需要在headers下面加上这么一句
session = requests.Session()
PS:不一定非要在headers下面加,这里只是为方便说明
然后将底下的代码里的用到requests的地方换成session即可,一共是3处
这时候我们再请求一下个人主页,打印看页面内容
print(session.get('https://www.douban.com/people/Colsniper/',headers=headers).text)
可以看到出现了昵称,说明我们的登录状态是一直保持着的
发表短评
首先看一下当我们在浏览器中发表短评的时候究竟做了哪些事情,以柯南剧场版为例,发表短评,在点击保存的前打开开发者工具,点击保存
截图20181111192248.png 截图20181111192259.png可以看到发表短评,就是向下面的网址https://movie.douban.com/j/subject/27110363/interest
传递了6个参数
data = {
'ck' :'MDS8',
'interest':'wish'
'rating':'',
'foldcollect':'U',
'tags':'剧场版 动漫 悬疑',
'comment':'柯南的滑板,安室透的车,上天的节奏......'
}#这里我们将评论内容稍微修改一下
response = session.post('https://movie.douban.com/j/subject/27110363/int
erest',data=data,headers=headers,)
这里代码不是很难,主要是能不能抓到这个网址,
在我们点击保存的时候,当我们看到interest的时候就要按住暂停
普通完整版
import requests
import re
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
session = requests.Session()
response = session.get('https://accounts.douban.com/login',headers=headers)
result = response.text
reg = r'<input type="hidden" name="captcha-id" value="(.*?)"'
captchaId = re.findall(reg,result)[0]
reg = r'<img id="captcha_image" src="(.*?)"'
codeImgUrl = re.findall(reg,result)[0]
response = session.get(codeImgUrl,headers=headers)
codeImg = response.content
fn = open('C:\\Users\Administrator\Desktop\code.png','wb')
fn.write(codeImg)
fn.close()
data = {
'form_email': 'XXXXX',
'form_password': 'XXXXXX',
'captcha-solution': input('请输入验证码:'),
'captcha-id': captchaId
}
response = session.post(url=' https://accounts.douban.com/login', data=data, headers=headers)
if response.url == 'https://www.douban.com/':#如果登录成功,网页会自动跳转到豆瓣首页
print('登录成功')
else:
print('登录失败')
data={
'ck' :'MDS8',#第一次需要修改
'rating':'3',
'foldcollect':'U',
'tags':'',
'comment':'这是来自python脚本的一条评论'
}
response = session.post(url = 'https://movie.douban.com/j/subject/27110363/interest',data=data,headers=headers,)
这里没有用到函数也没有用到类。
复制代码之后,帐号和密码要修改,另外发表评论的参数中的ck第一次需要修改,之后评论任何电影都不需要再改动了,只要把subject后的数字改成相应对应的电影的序号就行。
网友评论