python模拟登录页面下载_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,# 手动输入的验证码'zone': '86'

}

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) # 成功获取数据

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot 2.3_Spring Boot 应用监控,早发现早

小Hub领读:服务都需要监控,SpringBoot项目中,你常用哪些监控模块呢?actuator?admin?作者:小小____https://segmentfault.com/a/1190000022945443当一个 Spring Boot 应用运行的时候,开发者需要对 Spring …

linux 内核 xfs ail,linux 3.10内核 xfs的一次io异常导致的hung crash

8556395.925003] XFS (sdi): xfs_log_force: error -5returned.[8556407.425047] INFO: task umount:19286 blocked for more than 1200seconds.----这个默认是120,该环境上是被人为设置1200[8556407.425653] "echo 0 > /proc/sys/kernel/hung_task_timeout…

sql statements_Postgresql监控sql模块之pg_stat_statements模块--部署篇

概述今天主要介绍一下PG一个很重要的模块--pg_stat_statements模块,对于做性能观察还是很不错的。一、pg_state_statements模块简介1、简介pg_stat_statements模块提供一种方法追踪一个服务器所执行的所有 SQL 语句的执行统计信息,可以用于统计数据库的资…

vscode 文件夹中查找_VSCode 多文件搜索和替换

本文目录结构VSCode 多文件搜索和替换虽然在“基础入门”这个部分中,我们一直都在介绍编辑器的各种功能,但是,为了把搜索这样的一个功能介绍完整,我们今天就再讲一下在 VS Code 当中如何使用多文件搜索。关于 VSCode 单文件搜索和…

linux服务配置大全 fedora 8 ftp 百度文库,Linux下VSFTP配置全攻略

Linux下VSFTP配置全攻略[日期:2007-10-05]来源:Linux公社作者:Linuxidc[字体:大 中 小]4]如果要以系统中存在的普通用户登入FTP,也没有什么可以设置的,添加一个用户就行。比如我要添加beinan这个用户&#…

collector list 多个分组_Java 8嵌套(多级)分组依据

您不能通过多个键对单个项目进行分组,除非您接受该项目可能会出现在多个组中。在这种情况下,您想要执行一种flatMap操作。实现此目的的一种方法是Stream.flatMap与临时对一起使用,以容纳和的组合,Item然后SubItem再进行收集。由于…

sqlserver 还原bak文件 查看不到_SQL server中用T-SQL语句实现(建库,分离,附加,备份,还原)...

会用图形界面创建后,今天可以学习用T-SQL来创建数据库及对数据库的操作。一. T-SQL 创建数据库--创建数据库create database MySchool--创建数据库 数据库名称MySchoolon primary(--创建主数据库文件nameMySchool_data,--主数据库文件名称fileNameD:MySchool_data.m…

win7变成linux桌面背景,教大家把Ubuntu界面改造成Windows7系统

经常使用windows7系统的用户可能比较喜欢windows7系统强大的系统界面,下面就教大家如何使Ubuntu看起来像Windows 7系统的界面,具体内容如下所述,Ubuntu自身拥有相当不错的主题系统、视觉效果和养眼的画面,但你可能喜欢windows7的A…

深交所a股证券代码_深市和沪市的股票代码应该怎么区别?

展开全部深市和沪市的股票代码的区别如下:1、沪市A股票买卖的代32313133353236313431303231363533e78988e69d8331333365666266码是以600或601打头,如:运盛实业,股票代码是600767,中国国航(7.72,0.32,4.32%)是601111。B…

怎么通过MQTT查看数据是否上云端_设备工程师们的福利来啦!JSON数据采集网关帮你实现云端对接~...

JSON数据采集网关是一种能够将各种传感器的数据采集后按照JSON格式上传服务器的网关。图 JSON数据采集网关工作原理示意图JSON(JavaScript Object Notation)是java中的数据格式。例如{“power”:”100”, “time”:”10:12:23”}这样的格式,由于它简单易用&#xff…

小爱音响调用php接口_PHP调用语音合成接口

百度TTS 语音合成//百度文件转换成语音private function toSpeech($text){define(DEMO_CURL_VERBOSE, false);$obj["status">0,"msg">"","file_name">""];//获取秘钥$apiKey Config::get(apiKey);$secretKey Con…

oracle 会话数上不去_Oracle初识

1、基本概念oracle数据库是一个物理概念,oracle实例是数据库在内存中的镜像,属于一种逻辑概念。oracle数据库与oracle实例至少是一对一的关系,也可能是一对多关系(oracle集群:RAC real application cluster&#xff09…

trace Linux and实例,traceroute在linux中的使用方法

traceroute在linux中的使用方法一、traceroute的实现原理1、IP协议利用存活时间TTL来发出探测包跟踪数据包到达目标ip主机所经历的路由网关数量,每经过一个路由器,TTL的值就减去1。当TTL值为0时,主机就取消发送数据包,并回传一份I…

js 点击闭包_学习Javascript闭包(Closure)

讲的很清楚明了,连我都懂了,要是我们大学时的老师也能这么讲课。。。他们只会放幻灯片2009年8月30日 22:29| #| 引用2009年8月30日 22:44| #| 引用呵呵,可以作为面试题了!2009年8月31日 09:30| #| 引用十三说:闭包个人…

在VS中怎么用vb画矩形_(十四)矩形和操作展示逻辑操作

时间为友,记录点滴。聊了这么多的图片运算,忽然有个想法,为什么非要用静态的图片来展示运算呢?我们可以用自己做的图片来经过运算后显示出来。说干就干。先想一下需求:整体环境非黑即白。可以用鼠标在背景上画出矩形&a…

linux文件传输到另一台linux,使用scp将文件/目录拷贝到另一台Linux主机上

如何将一台Linux主机上的文件或目录拷贝到另一台Linux主机上,scp命令可以实现该需求前提条件:两台Linux主机处于同一网段,可以互相ping通操作如下:文件拷贝①将本地文件拷贝到远端主机上scp 待拷贝的文件 远端主机用户名远端主机I…

python结构化数据_python新手入门必备—— 使用json保存结构化数据

【摘要】使用 json 保存结构化数据时,字符串可以很轻松地写入文件并从文件中读取出来。数字可能会费点劲,因为 read() 方法只能返回字符串,这些字符串必须传递给类似 int() 的函数,它会接受类似 123 这样的字符串并返回其数字值 1…

c++ 二维数组 排序_漫画:“排序算法” 大总结

​冒泡排序:漫画:什么是冒泡排序?​mp.weixin.qq.com选择排序:漫画:什么是选择排序?​mp.weixin.qq.com插入排序:漫画:什么是插入排序?​mp.weixin.qq.com此外还有冒泡排…

c语言线程经常段错误的是,由pthread_create引起的段异常

由pthread_create引起的段错误一般线程的结束是由进程内的其他线程来结束的,调用pthread_cancel.但是需要考虑到被结束线程的性质,一方面,线程是可被结束,也可无法结束,即不响应该信号;另一方面&#xff0c…

python request url编码_Python 爬虫 (requests) 发送中文编码的 HTTP POST 请求

向往常一样发送POST请求出现错误网站信息表单页面结果网页使用 gb2312 编码使用 requests 发送 post 请求In [2]: import requestsIn [3]: from bs4 import BeautifulSoup as BSIn [4]: url http://example.com/ip/search.aspIn [5]: data {...: loudong: 女生九栋,...: fang…