首页 编程教程正文

日常作品分享------模拟登录豆瓣并根据电影名称发表评论

piaodoo 编程教程 2020-02-22 22:15:44 1452 0 python教程

本文来源吾爱破解论坛

本帖最后由 zqc8 于 2019-10-22 18:04 编辑

我又来啦,今天跟大家分享的是大家熟悉的豆瓣,主要功能是实现模拟登录,并根据电影名称发表评论,呃.......似乎就这样了,

需要说一下,
最后几次我测试只是成功登录上去,评论并没有发表成功,不知道是不是由于豆瓣对我的帐号进行了评论限制,麻烦有豆瓣帐号的朋友帮我试下代码,谢谢!(已更新解决)

另外再打个小广告,之前的作品【理论可爬全站壁纸图片(不是缩略图哦)-----https://www.52pojie.cn/thread-1037157-1-1.html】我做了些修改,修改后基本上可以实现真正的爬取全站图片(总共1800个主题,亲测试爬200+个主题,差不多1G的图片)


代码全文如下,有不懂的欢迎评论区留言,若有觉得写得不好或者还有改进的余地,欢迎提出,谢谢!


2019.10.22日更新:
1:解决评论发表失败问题
失败系因为系统设置评论请求表单中的ck值为随机值,而本人此前误将其视为固定值所致,问题已得到解决,修改代码请见:【26-32】行



[Python] 纯文本查看 复制代码

#1.在某些地方添加了若干个print(),其并无实际意义,仅用于输出美化使用.
#2.运行代码前,请在系统浏览器多次登录豆瓣帐号(需成功登录)直到登录不再出现验证码,避免代码登录需要输入验证.
#3.需要安装的第三方库: requests
import requests,json,string,re
from urllib.parse import quote

#获取电影链接id
def get_movie_id(headers):
    print()
    movie_name_prompt = "请输入电影名称:" #输入提示语
    while True:
        movie_name = input(movie_name_prompt)
        temp_url = "https://movie.douban.com/j/subject_suggest?q={}".format(movie_name)
        data_url = quote(temp_url, safe=string.printable)  # 网址转码(Python无法识别带中文符号的链接)
        html = requests.get(data_url, headers=headers).text
        data = json.loads(html)
        try: #检测电影名称的有效性
            movie_id = data[0]["id"]
            return movie_id
        except IndexError:
            movie_name_prompt = "检索失败,请重新输入电影名称:"
            continue

        
#获取ck值(发表评论表格需要)
def get_ck(session,movie_url):
    html = session.get(movie_url).text
    p_check_id = r'<input type="hidden" name="ck" value="(.+)"/>'
    check_id = re.findall(p_check_id,html)[0]

    return check_id


#登录帐号
def login(session,home_url,login_post_url,headers):
    douban_nickname = input("请输入您的豆瓣名称:") #用于判断是否登录成功
    passnmae_prompt = "请输入您的登录帐号:"
    password_prompt = "请输入您的登录密码:"
    while True:
        passname = input(passnmae_prompt)
        password = input(password_prompt)
        login_form_data = {}
        login_form_data["ck"] = " "
        login_form_data["name"] = passname
        login_form_data["password"] = password
        login_form_data["remember"] = "false"
        login_form_data["ticket"] = " "

        session.post(login_post_url, data=login_form_data, headers=headers)
        check_response_text = session.get(home_url, headers=headers).text

        if douban_nickname in check_response_text:
            print()
            print("登录成功")
            return session
        else:
            print()
            print("登录失败,请重新尝试.")
            passnmae_prompt = "请重新输入登录帐号:"
            password_prompt = "请重新输入登录密码:"
            continue

#评论发表
def make_comment(session,movie_comment_post_url,check_id,headers):
    print()
    comment = input("请输入评论内容:")
    #interest = input("请输入您的评论状态(想看/看过):")
    comment_form_data = {}
    comment_form_data["ck"] = check_id
    comment_form_data["interest"] = "wish"
    #comment_form_data["rating"] = " "  #此处为平分等级,可以添加,但是考虑到显示出来比较麻烦就让他留空了.下tags同
    comment_form_data["foldcollect"] = "F"
    #comment_form_data["tags"] = " "  #此处为便签,
    comment_form_data["comment"] = comment

    session.post(movie_comment_post_url,headers=headers,data=comment_form_data)
    check_comment_response_text = session.get(movie_comment_post_url,headers=headers).text

    if comment in check_comment_response_text:
        print()
        print("评论成功")
    else:
        print()
        print("评论失败")


def main():
    home_url = "https://www.douban.com/"
    login_post_url = "https://accounts.douban.com/j/mobile/login/basic"

    headers = {}
    headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"

    session = requests.Session()  #创建回话,以保持登录状态.
    login(session,home_url,login_post_url,headers) #登录帐号

    moive_id = get_movie_id(headers) #获取电影id
    movie_comment_post_url = "https://movie.douban.com/j/subject/{}/interest".format(moive_id)

    movie_url = "https://movie.douban.com/subject/{}/".format(moive_id)
    check_id = get_ck(session,movie_url)
    
    make_comment(session,movie_comment_post_url,check_id,headers) #发表评论


if __name__ == "__main__":
    main()

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/8020.html

搜索