http/https协议特性:无状态。
没有请求到对应页面数据的原因:
发起的第二次基于个人主页页面请求的时候,服务器端并不知道该此请求是基于登录状态下的请求。
Cookie:用来让服务器端记录客户端的相关状态。
-手动处理:通过抓包工具获取cookie值,将该值封装到headers中。(不建议)
-自动处理:
-cookie值的来源是哪里?
-模拟登录post请求后,由服务器创建。
session会话对象:
-作用:
1、可以进行请求的发送。
2、如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中
-创建一个session对象:session=requests.Session()
-使用session对象进行模拟登录post请求的发送(Cookie就会被存储在session中)
-session对象对个人主页对应的get请求进行发送(携带了cookie)
1 import requests 2 from lxml import etree 3 4 class Login(object): 5 def __init__(self): 6 self.headers={ 7 'Referer':'https://accounts.douban.com/passport/login_popup?login_source=anony', 8 'User-Agent':'tMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36', 9 } 10 self.post_url='https://accounts.douban.com/j/mobile/login/basic' 11 self.logined_url='https://www.douban.com/' 12 self.session=requests.Session() #创建Session对象 13 14 def login(self,username,password): 15 post_data={ 16 'ck':'', 17 'remember':'true', 18 'name': username, 19 'password': password, 20 } 21 22 response=self.session.post(url=self.post_url,data=post_data,headers=self.headers) 23 24 if response.status_code==200: 25 print("登录成功") 26 27 28 response =self.session.get(self.logined_url,headers=self.headers) 29 if response.status_code==200:#获取登录成功后的页面的HTML代码 30 print(response.text) 31 32 if __name__=="__main__": 33 34 login=Login() 35 login.login(username='username',password='password')
登录后获取动态可见的电影名称 评论 和 链接
多次访问后,会出现跳出验证码让我们验证,之后才能解封,被封IP了。
1 import requests 2 from lxml import etree 3 4 class Login(object): 5 def __init__(self): 6 self.headers={ 7 'Referer':'https://accounts.douban.com/passport/login_popup?login_source=anony', 8 'User-Agent':'tMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36', 9 } 10 self.post_url='https://accounts.douban.com/j/mobile/login/basic' 11 self.logined_url='https://www.douban.com/' 12 self.session=requests.Session() #创建Session对象 13 14 def login(self,username,password): 15 post_data={ 16 'ck':'', 17 'remember':'true', 18 'name': username, 19 'password': password 20 } 21 22 23 response=self.session.post(url=self.post_url,data=post_data,headers=self.headers) 24 25 if response.status_code==200: 26 print("登录成功") 27 28 29 response =self.session.get(self.logined_url,headers=self.headers) 30 if response.status_code==200:#获取已经观看的电影名称和影评 31 #print(response.text) 32 tree=etree.HTML(response.text) 33 movies_review=tree.xpath('//*[@id="statuses"]/div[2]/div[1]/div/div/div[1]/div[2]/blockquote/p/text()')[0] 34 movies_href=tree.xpath('//*[@id="statuses"]/div[2]/div[1]/div/div/div[2]/div[1]/div[2]/div[1]/a/@href')[0] 35 movies_name=tree.xpath('//*[@id="statuses"]/div[2]/div[1]/div/div/div[2]/div[1]/div[2]/div[1]/a/text()')[0] 36 37 38 print(movies_name,'\n',movies_href,'\n',movies_review) 39 40 41 if __name__=="__main__": 42 43 login=Login() 44 login.login(username='username',password='password')