美文网首页
模拟登录豆瓣并发表短评

模拟登录豆瓣并发表短评

作者: 江山画_孤影 | 来源:发表于2018-11-11 19:50 被阅读0次

    准备

    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的时候就要按住暂停

    截图20181111193541.png 截图20181111193700.png

    普通完整版

    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后的数字改成相应对应的电影的序号就行。

    相关文章

      网友评论

          本文标题:模拟登录豆瓣并发表短评

          本文链接:https://www.haomeiwen.com/subject/edyxfqtx.html