本帖最后由 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() |