更多课程 选择中心


Python培训

400-111-8989

Python 爬虫之模拟登录


最近应朋友要求,帮忙爬取了小红书创作平台的数据,感觉整个过程很有意思,因此记录一下。在这之前自己没怎么爬过需要账户登录的网站数据,所以刚开始去看小红书的登录认证时一头雾水,等到一步步走下来,最终成功,思路通了感觉其实还是很简单。

解决思路

一开始我就只有这么一个网址小红书创作平台,和登录账号、密码,然后经过数次试错分析,最终拿出了解决方案。要爬取这个平台的数据,最核心的就是使用 python 模拟浏览器登录进去。探索过程:

1、在登陆界面点击用密码登录,输入账号密码验证码,通过 chrome 调试工具查看请求的 header 会发现,登录时是通过 POST 方式,请求的实际地址是:#/web_api/sns/v1/homerus/user/login_with_passwd,登录需要的参数有五个,分别是账号、密码、token、captcha(图片验证码)、zone 值,其中 zone 是指你所在的国家的区号,例如中国为+86,因此值为 86。那么这里处理比较困难的就是 token 和 captcha。


2、token 哪里来的?是什么值?captcha 是图片验证码,怎么处理?我发现进行在登陆界面点击用密码登录这个操作时,实际进行了一次 GET 请求,请求的地址#/api/homerus/login/captcha,并且返回了两个数据:一个是 token,还有一个是验证码图片链接。怎么样?有没有很开心,需要什么就来什么。

3、因为每次登录 token 和 captcha 都会刷新,因此代码里面不能写死。那么对于 captcha 我的处理方式就是把图片下载下来,手动在程序中输入验证码作为参数;那 token 呢?token 我已经获取了啊,直接作为参数即可!

因此解决该模拟登录过程一共三步:

一、通过 get 请求登陆界面获取 token 和图片验证码;

二、token 直接作为参数,验证码手动输入,加上账号、密码、区号作为post 请求登录的参数;

三、登陆成功后的 response header 里有我们需要的 cookie,将其取出拼到新的 request header 里,请求要爬取数据的页面,成功获取数据!

实现过程

具体代码实现就是按照上述思路的,我进行了注释,不再多做说明。

''' 第一步 ''' cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
r=requests.get('#/api/homerus/login/captcha')
token = json.loads(r.text)['data']['token']     # get请求到的token #print token img_url=json.loads(r.text)['data']['url']
picture = opener.open(img_url).read()
local = open('F:/code.jpg', 'wb')               # 保存验证码到本地 local.write(picture)
local.close() ''' 第二步 ''' secret_code = raw_input('输入验证码: ')
login_data = {
    'phone': '136****0000',
    'passwd': 'XXXXXXXXXXXX',
    'token': token,                             # 获取的token    'captcha': secret_code,                     # 手动输入的验证码    'zone': '86' }
headers = {'content-type': 'application/json'}  # payload请求方式 res = requests.post('#/web_api/sns/v1/homerus/user/login_with_passwd'                    ,data=json.dumps(login_data),headers=headers)                                                      # 模拟登录 header={ ''' 第三步 '''    'Accept': 'application / json, text / plain',
    'Connection': 'keep - alive',
    'Cookie': res.headers['Set-Cookie'].replace(' Path=/','')+'xhs_spid.6d29=21fa0111a09b6c3c'                         '1516671392.1.15166716811516671392.6d3c3921-2e47-4cbe-b695-698499ac4636; xhs_spses.6d29=*',   # 登录成功的cookie拼装在header    'Referer': 'http: // # /',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' }
resp = requests.get('#/web_api/sns/v1/homerus/note/list?page=1&page_size=200',headers=header)
data = json.loads(resp.text)

最终,我成功获取到如下所示的数据集。


网上有很多模拟登录微博豆瓣等网站的教程和代码,但小红书这个平台貌似不太受用,这个思路对于很多需要登陆才能查看数据的网站都应该有帮助,因此分享在这里供参考。

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:利用Python制作全国春晚关注度热力图
下一篇:5个提升效率的 Python 开发和配置的小技巧

Python IDE推荐7个你可能会错过的Python IDE

Python面试题之Python中爬虫框架或模块的区别

2021年Python面试题及答案汇总详解

python数据分析,你需要这些工具

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省