python+selenium实现脉脉网站爬取用户朋友圈,自动评论
这次尝试的网站是脉脉,实现的效果是,自动登录后,爬取“发现”页面返回的其他人发的状态。然后自动评论。评论的时候,先看看有没有最热评论,如果有最热评论,就复制内容,自己也发一条一样的。如果没有,就随便发,比如“支持下”。
1. 自动登录:
这里就是用的selenium接口,找到用户号和密码的input框,自动填入后点击登录,如果自动登录失败,可以手动登录,然后控制台,回车下。
def Login(self):self.driver.get("https://acc.maimai.cn/login")self.driver.implicitly_wait(5)self.driver.find_element_by_class_name("loginPhoneInput").send_keys(self.getConfig("mobile"))self.driver.find_element_by_id("login_pw").send_keys(self.getConfig("pwd"))self.driver.find_element_by_class_name("loginBtn").click()self.driver.implicitly_wait(5)if u"登录" in self.driver.page_source:input("click when logined")time.sleep(2)return Trueelse:return True
手机号和密码这些信息,我存到了mm.json文件中,getConfig获取:
def getConfig(self, k):with open(self.configFile, 'r') as f:ct = f.read()data = json.loads(ct)return data.get(k, None)
mm.json:
2. 登录成功后,需要获取到用户的一些认证信息,后续接口都需要用到。
url: https://maimai.cn/contact/visit_history?jsononly=1&limit=9
def getAuth(self):url = "https://maimai.cn/contact/visit_history?jsononly=1&limit=9"script = '''function test(){var ret; $.ajaxSetup({async:false}); $.getJSON("''' + url + ''''", {}, function (data) {ret=JSON.stringify(data);});return ret;}return ( test());'''ret = self.driver.execute_script(script=script)self.auth = json.loads(ret)self.cookies = self.auth["auth_info"]self.cookies["uid"]=self.cookies["uid"].replace("\"","").strip()self.cookies["token"]=self.cookies["token"].replace("\"","").strip()
这里我自己拼了个jquery的getJSON来让浏览器后台执行,但是发现前端是用react写的,没有加载jquery.js,需要先手动加载:
def loadJquery(self):script = '''var headID =document.getElementsByTagName("head")[0];var newScript = document.createElement('script');newScript.type = 'text/javascript';newScript.src ='https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js';headID.appendChild(newScript);'''self.driver.execute_script(script=script)time.sleep(2)
这样我们就能调用jquery了,是不是很爽。
3. 接下来就是如何获取这些朋友圈列表呢?
在发现这个页面,一直滚动到最下面就自动触发,加载下一页。
请求地址:
"https://maimai.cn/sdk/web/feed_list?u={u}&channel=www&version=4.0.0&_csrf={_csrf}&access_token={access_token}&uid={uid}&token={token}&page={page}&hash=feed_explore&jsononly=1"
返回数据:
这个Object里面真是什么都有,发状态的人的信息都非常详细。(不太安全,这一个接口就啥信息都带过来了)
我封装了下,传入page,获取这一页的内容。测试了下,这个page可以遍历,可以从1往上扫走,速度不要太快,会被ban一会儿,提示操作频繁。我是间隔10秒,获取一次。正常用户的行为吧。
def getUsers(self, page):baseUrl = "https://maimai.cn/sdk/web/feed_list?u={u}&channel=www&version=4.0.0&_csrf={_csrf}&access_token={access_token}&uid={uid}&token={token}&page={page}&hash=feed_explore&jsononly=1"url = baseUrl.format(page=page, uid=self.cookies["uid"],u=self.cookies["u"], token=self.cookies["token"],_csrf=self.cookies["_csrf"],access_token=self.cookies["access_token"])script = '''function test(){var ret; $.ajaxSetup({async:false}); $.getJSON("''' + url + ''''", {}, function (data) {ret=JSON.stringify(data);});return ret;}return ( test());'''return self.driver.execute_script(script=script)
4. 提交评论:
我想的是,先爬取这个状态下,有没有热门评论,有的话,就我也回这个,如果没有,随机挑一个。
cmts = [u'支持下',u'感谢分享',u'哈哈',u'好',u'太棒了'
]
resp = random.choice(cmts)
获取热门评论:
def getHotComment(self, feed):baseUrl = "https://maimai.cn/sdk/web/feed/getcmts?fid={fid}&page=1&count=20&u=-1&channel=&version=0.0.0&_csrf={_csrf}&access_token={access_token}&uid=&token="url = baseUrl.format(fid=feed["id"],_csrf=self.cookies["_csrf"],access_token=self.cookies["access_token"])script = '''function test(){var ret; $.ajaxSetup({async:false}); $.getJSON("''' + url + '''", {}, function (data) {ret=JSON.stringify(data);});return ret;}return ( test());'''return self.driver.execute_script(script=script)
提交评论:
def postComment(self, feed, resp):baseUrl = 'https://open.taou.com/maimai/feed/v3/addcmt?fr=&u={u}&channel=www&version=4.0.0&_csrf={_csrf}&access_token={access_token}&uid="{uid}"&token="{token}"'url = baseUrl.format(u=self.cookies["u"],uid=self.cookies["uid"], token=self.cookies["token"],_csrf=self.cookies["_csrf"],access_token=self.cookies["access_token"])data = json.dumps({"fid": "{}".format(feed["id"]),"u2": "{}".format(self.cookies["u"]),"text": resp,"at_user_info": {},"reply_to": 0})script = '''function test(){var ret="nok"; $.ajax({contentType: "application/x-www-form-urlencoded",cache: false, async: false, type: 'POST',data:''' + data + ''',url: \'''' + url + '''\',success: function (data, status) {ret= "ok";}}); return ret}return ( test());'''return self.driver.execute_script(script=script)
几个关键的接口,都实现了。所有代码我就不再发了,感兴趣的可以在github看看。
想了下,如果感兴趣的可以继续做下延伸的工作:
1. 自动点赞
2. 自动加好友(测试了,有上限,买了VIP会员一年也才能关注800个,意义不大)
3. 从feed_list中爬取出用户的具体信息,再从每个用户的主页继续爬,把这些信息存到数据库,供以后挖掘。
4. 可以把脚本放到阿里云上去跑,用Display模拟一个桌面就可以了。
def main():ENV_HOME = os.environ.get("HOME", "")if ENV_HOME == "/root":display = Display(visible=0, size=(2000, 2000))display.start()start()if ENV_HOME == "/root":display.stop()if __name__ == '__main__':main()
python+selenium实现脉脉网站爬取用户朋友圈,自动评论相关推荐
- Python爬虫实战项目案例——爬取微信朋友圈
项目实战 Appium爬取微信朋友圈 自动化爬取App数据 基于移动端的自动化测试工具Appium的自动化爬取程序. 步骤 1.JDK - Download JDK,Appium要求用户必须配 ...
- Python模拟登陆新浪微博,爬取用户数据
目标 爬取新浪微博用户数据,包括以下字段:id,昵称,粉丝数,关注数,微博数,每一篇微博的内容,转发数,评论数,点赞数,发布时间,来源,以及是原创还是转发.(本文以GUCCI(古驰)为例) 方法 + ...
- Python爬虫——大众点评,爬取用户电影评论,CSS字体加密
导航 爬取网址 字体加密原理分析 代码 获取3个字体加密文件 提取用户信息和评论 解密评论 结果 总结 最近一直在学习爬虫,刚好到了反爬这一块,听朋友说大众点评的反爬挺厉害,分析了一下发现还是老熟人, ...
- python爬取快手粉丝榜_[Python] 【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...
分享 写在前面代码功能如题,根据快手用户的id来爬取用户所有公开作品,包括图集和视频. 原理:其实就是利用基于chromium内核的浏览器自带的devtools对所有请求进行排查找出包含作品链接的请求 ...
- Python高级特性与网络爬虫(一):使用Ajax请求爬取用户微博内容和python多进程爬取用户图片
最近阅读了崔庆才写的<Python3网络爬虫开发实战>,系统地学习一下利用Python写网络爬虫.由于这本书出版时间是2018年,很多书中案例涉及的网站已经改版,基本上每个案例都需要自己再 ...
- python批量爬取图片_【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...
更新日志 所有版本更新日志会记录在这里 v0.4.0(2020-03-23) 修复id转eid的一些bug 从该版本开始,爬取视频均为无水印 v0.3.0(2020-03-10) 修复一些因为用户昵称 ...
- Scrapy豆瓣爬虫 爬取用户以及用户关注关系
文章目录 明确任务 1.新建mysql数据库以及数据表 1.1 创建数据库 1.2 创建用户信息表users 1.3 创建用户关注表user_follows 笔记一: mysql中utf8与utf8m ...
- python抓取朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)...
原标题:如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下) 前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往 ...
- Python爬虫爬取微信朋友圈的方法,感兴趣的朋友可以了解下
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 小雨 | 作者 python教程 | 来源 接下来,我们将实现微信朋友圈的 ...
最新文章
- python函数模块概念_python中模块和包的概念
- Github 高赞的 YOLOv5 引发争议?Roboflow 和开发者这样说...
- 维基链锚定行业缺口,定位发展一体化DeFi,持续开发出各类产品应用,包括去中心化抵押借贷系统Wayki-CDP(含稳定币WUSD)、去中心化交易所Wayki-DEX、去中心化合成资产协议Wayki-X
- 马斯克的脑机接口公司Neuralink否认研究人员虐待猴子
- 单链表快速排序算法实现
- Win2000域控制器+Exchange2000迁移至Win2003域控制器+Exchange2003
- 实现 JavaScript 异步方法 Promise.all
- MySQL高级 - 锁 - InnoDB行锁 - 间隙锁危害
- 1.8. subshell
- MySQL生产库开发规范
- jQuery缓存操作-cache数据
- 达内python就业班视频_达内python入门到精通全套视频教程
- python求曲线拐点_使用Python检测新冠肺炎疫情拐点
- apk逆向思路_逆向练手——从一个apk简单逆向看消息摘要算法
- JavaScript使用手册
- 大学计算机基础超详细知识点(高手总结),大学计算机基础超详细知识点(高手总结)免费-...
- 计算机win10开机音乐,Windows10系统更改开关机声音的两种方法
- luogu 1757 分组背包
- poi 启用保护后取消_保护模式禁用怎么解除
- 深度学习——GAN(生成网络)损失函数解析
热门文章
- Python 中的len()函数
- sqlplus 登录报 Message file UTILITY_MSG\spwlang.msb not found!
- Flex 子元素高度塌陷
- 非科班程序员与科班程序员的区别在哪里?
- 可行性研究报告【最终版】——学生成绩查询系统
- 5G终端部分AT命令相关说明
- 一级建造师-经济公共课-口诀
- C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter应该怎么用?
- 一文理解OpenStack网络
- whmcs对接cdn系统_使用WHMCS套用了CDN加速后,WHMCS后台无限登录的解决方法