Python 爬虫之模拟登录
最近应朋友要求,帮忙爬取了小红书创作平台的数据,感觉整个过程很有意思,因此记录一下。在这之前自己没怎么爬过需要账户登录的网站数据,所以刚开始去看小红书的登录认证时一头雾水,等到一步步走下来,最终成功,思路通了感觉其实还是很简单。
解决思路
一开始我就只有这么一个网址小红书创作平台,和登录账号、密码,然后经过数次试错分析,最终拿出了解决方案。要爬取这个平台的数据,最核心的就是使用 python 模拟浏览器登录进去。探索过程:
1、在登陆界面点击用密码登录,输入账号密码验证码,通过 chrome 调试工具查看请求的 header 会发现,登录时是通过 POST 方式,请求的实际地址是:http://post.xiaohongshu.com/web_api/sns/v1/homerus/user/login_with_passwd,登录需要的参数有五个,分别是账号、密码、token、captcha(图片验证码)、zone 值,其中 zone 是指你所在的国家的区号,例如中国为+86,因此值为 86。那么这里处理比较困难的就是 token 和 captcha

2、token 哪里来的?是什么值?captcha 是图片验证码,怎么处理?我发现进行在登陆界面点击用密码登录这个操作时,实际进行了一次 GET 请求,请求的地址http://post.xiaohongshu.com/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('http://post.xiaohongshu.com/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, # 手动输入的验证码
'
}
headers = {'content-type': 'application/json'} # payload请求方式
res = requests.post('http://post.xiaohongshu.com/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: // post.xiaohongshu.com /',
'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('http://post.xiaohongshu.com/web_api/sns/v1/homerus/note/list?page=1&page_size=200',headers=header)
data = json.loads(resp.text)
最终,我成功获取到如下所示的数据集。

网上有很多模拟登录微博豆瓣等网站的教程和代码,但小红书这个平台貌似不太受用,这个思路对于很多需要登陆才能查看数据的网站都应该有帮助,因此分享在这里供参考。
Python学习交流群:238757010
作者:Nekyo
原文链接:https://my.oschina.net/nekyo/blog/1612055
Python 爬虫之模拟登录的更多相关文章
- Python爬虫之模拟登录微信wechat
不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一起.既然它这么重要,如果我们可以利用爬虫模拟登录,是不是就意味着我们可以获取这些信息 ...
- Python爬虫-百度模拟登录(二)
上一篇-Python爬虫-百度模拟登录(一) 接上一篇的继续 参数 codestring codestring jxG9506c1811b44e2fd0220153643013f7e6b1898075 ...
- Python爬虫-百度模拟登录(一)
千呼万唤屎出来呀,百度模拟登录终于要呈现在大家眼前了,最近比较忙,晚上又得早点休息,这篇文章写了好几天才完成.这个成功以后,我打算试试百度网盘的其他接口实现.看看能不能把服务器文件上传到网盘,好歹也有 ...
- 测试开发Python培训:模拟登录新浪微博-技术篇
测试开发Python培训:模拟登录新浪微博-技术篇 一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,poptest在做测试开发培训中更加关注技术难点,掌握技 ...
- Python爬虫常用之登录(二) 浏览器模拟登录
浏览器模拟登录的主要技术点在于: 1.如何使用python的浏览器操作工具selenium 2.简单看一下网页,找到帐号密码对应的框框,要知道python开启的浏览器如何定位到这些 一.使用selen ...
- Python post请求模拟登录淘宝并爬取商品列表
一.前言 大概是一个月前就开始做淘宝的爬虫了,从最开始的用selenium用户配置到selenium模拟登录,再到这次的post请求模拟登录.一共是三篇博客,记录了我爬取淘宝网的经历.期间也有朋友向我 ...
- Java爬虫——人人网模拟登录
人人网登录地址:http://www.renren.com/ 此处登录没有考虑验证码验证码. 首先对登录方法进行分析 有两种方法. 一)在Elements中分析源码 发现登录点击后的事件是http:/ ...
- python爬虫scrapy之登录知乎
下面我们看看用scrapy模拟登录的基本写法: 注意:我们经常调试代码的时候基本都用chrome浏览器,但是我就因为用了谷歌浏览器(它总是登录的时候不提示我用验证码,误导我以为登录时不需要验证码,其实 ...
- Python爬虫常用之登录(一) 思想
爬虫主要目的是获取数据,常见的数据可以直接访问网页或者抓包获取,然后再解析即可. 一些较为隐私的数据则不会让游客身份的访问者随便看到,这个时候便需要登录获取. 一般获取数据需要的是登录后的cookie ...
随机推荐
- ZOJ1081 Points Within
嘟嘟嘟 题面:给一个\(n\)个点的多边形和\(m\)个点,判断每一个点是否在多边形内. 解法:射线法. 就是从这个点引一条射线,如果与多边形有奇数个交点,则在多边形内部. 那么只用枚举每一条边,然后 ...
- Win2008 r2 IIS7.5出现“FastCGI进程最近常常失败。请过一会再尝试此请求”的解决方法
错误信息如图所示: 应用程序“PIAOYUN.CC”中的服务器错误Internet Information Services 7.5 错误摘要HTTP 错误 500.0 - Internal Serv ...
- 35、springboot-运行状态监控使用Actuator
Spring Boot Actuator 提供了运行状态监控的功能 Actuator 监控数据可以通过阻REST远程 shell 和JMX方式获得.我 首先来介绍通过 REST 方式查看 Actuat ...
- appium ios Demo
Appium Demo 录制图片,环境搭建完毕后根据视频基本能利用模拟器完成简单测试用例 感谢大神http://www.cnblogs.com/tobecrazy/p/4970188.html
- php redis中文手册
phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/ow ...
- ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中
我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...
- 【HTML-进阶-如何实现父级块级元素宽度自适应子元素宽度】
背景 块级元素宽度默认值为100%,而不是auto;因此其宽度不会根据子元素内容动态适应. 如何实现父级元素宽度动态适应其子元素. 方法一 display:inline; 给块级元素设置inline- ...
- Node.js 上传图片并保存
Node.js 上传图片并保存 依赖 package.json 文件 { "name": "demo", "version": " ...
- Web—10-前端性能优化
前端性能优化 从用户访问资源到资源完整的展现在用户面前的过程中,通过技术手段和优化策略,缩短每个步骤的处理时间从而提升整个资源的访问和呈现速度.网站的性能直接会影响到用户的数量,所有前端性能优化很重要 ...
- let与var的区别,为什么什么要用let?
1.var是全局声明,let是块级作用的,只适用于当前代码块 var a = 1: if(true){ let a; a=22: console.log(a);'//22 } if(){}内就是let ...