手把手教你用python模拟登录豆瓣

最近想使用python在豆瓣电影上爬一下电影《教父》的影评,但非登录游客只能查看前10页的影评内容,如果想爬取更多影评,需要先模拟登录豆瓣。

我搜索了很多模拟登录的文章,但我由于欠缺网页方面的知识基础,并没有能够按照其步骤成功模拟登录,后来发现,是模拟登录需要提交的个人信息对应的关键字变了(后面会具体解释)。因此,我整理了一下自己模拟登录成功的详细步骤。

步骤一:安装爬虫所需的requests库

直接在命令行中输入 pip install requests,安装成功后import requests

步骤二:初始化变量

模拟登录时,我们需要先获得目标网站的网址;为了防止被识别出是爬虫,我们需要伪装自己的用户信息;我们还需要向目标网站提交个人信息(账号密码等)。

这三部分信息,我们可以用以下方式获取。

1.打开豆瓣网站,进入其登录界面,选择密码登录,输入账号和密码,注意:先不要点登录豆瓣!!!

2. 在豆瓣网登录界面,按F12打开Developer Tools,选择Network,选中Previous log,这样就可以查看我们的操作所对应的网页源代码,从而找到所需信息了。

2. 点击登录豆瓣,因为我的账号和密码是随便写的,所以登录不成功,但不影响我们查看信息。在Developer Tools界面,选择查看basicHeaders,在里面找到General下面的Request URL并复制,这才是我们模拟登录时的目标网址,而非我们平时认为的网页上的网址。

再找到Request Headers下面的User-Agent并复制,里面包含我们电脑的信息。

最后,在Form Data中找到我们的个人信息,并复制。

这样一来,需要向网站提交的信息,就搞定了。需要注意的是,豆瓣个人信息所对应的关键字不是一成不变的。在我查找资料的过程中,很多文章都说Form Data包含的信息是这样的:

这跟我们现在查看到的内容显然不同,如果使用旧的关键字提交信息肯定无法成功,因此,大家在模拟登录的过程中,最好先自己查看一下信息

步骤三:提交登录请求

先将需要提交的请求写成代码:

url = 'https://accounts.douban.com/j/mobile/login/basic'
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
              (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
data = {
        'ck': '',
        "name":'123456789',#用户名123456789,我瞎写的,大家填真实的就好
        "password":'123456',#密码123456,我瞎写的,大家填真实的就好
        'remember': 'false',
        'ticket': '',
    }

为了在之后爬取网页的过程中能一直保持登录状态,我们要用到requests库中的session来维持会话状态,对应的代码是:

s = requests.Session()
html = s.post(url,headers=headers,data=data)

步骤四:在登录状态下,访问豆瓣其他页面。

大家可以通过访问豆瓣个人主页,来保证自己已经成功登录。代码如下:

url = 'https://www.douban.com/people/57443010/'#这个网址是我的个人主页,大家换成自己的即可
html = s.get(url).text
print(html)

通过print(html),可以查看网页源代码,其中“个人主页”“我的订单”等都是登录后个人主页会显示的信息。当我们在网页源代码中看到如下信息的时候,就说明我们登录成功了。

步骤五:全部代码

import requests

# 用于维持登录会话,requests高级用法
s = requests.Session()

# 登录
def login():
    
    #url ='https://accounts.douban.com/passport/login'
    url = 'https://accounts.douban.com/j/mobile/login/basic'
    headers={
				'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 
                (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
								}
    
    data = {
        'ck': '',
        "name":'123456789',
        "password":'123456',
        'remember': 'false',
        'ticket': '',
    }
    
    html = s.post(url,headers=headers,data=data)
    return s,html
  

# 获取个人信息
def get_user_data(s):
    url = 'https://www.douban.com/people/57443010/'
    html = s.get(url).text
    #print(html)
    return html

if __name__ == '__main__':
    s,html1 = login()
    html2 = get_user_data(s)

总结:用requests库模拟登录十分方便,主要需要注意两个问题,一是使用session来维持会话,二是自己通过Developer Tools找到网页待提交信息。

在模拟登录时还会遇到验证码等比较高级的反爬虫机制,但豆瓣暂时还不需要每次登录时提交验证码,只在登录太频繁时才需要用验证码验证,如果大家在保证代码无误的情况下登录失败,可以考虑等待一段时间再尝试。

发布于 2019-06-24 22:35