本文来源吾爱破解论坛
本帖最后由 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 谢谢。