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')