这次尝试的网站是脉脉,实现的效果是,自动登录后,爬取“发现”页面返回的其他人发的状态。然后自动评论。评论的时候,先看看有没有最热评论,如果有最热评论,就复制内容,自己也发一条一样的。如果没有,就随便发,比如“支持下”。

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实现脉脉网站爬取用户朋友圈,自动评论相关推荐

  1. Python爬虫实战项目案例——爬取微信朋友圈

    项目实战   Appium爬取微信朋友圈   自动化爬取App数据 基于移动端的自动化测试工具Appium的自动化爬取程序. 步骤 1.JDK - Download JDK,Appium要求用户必须配 ...

  2. Python模拟登陆新浪微博,爬取用户数据

    目标 爬取新浪微博用户数据,包括以下字段:id,昵称,粉丝数,关注数,微博数,每一篇微博的内容,转发数,评论数,点赞数,发布时间,来源,以及是原创还是转发.(本文以GUCCI(古驰)为例) 方法 + ...

  3. Python爬虫——大众点评,爬取用户电影评论,CSS字体加密

    导航 爬取网址 字体加密原理分析 代码 获取3个字体加密文件 提取用户信息和评论 解密评论 结果 总结 最近一直在学习爬虫,刚好到了反爬这一块,听朋友说大众点评的反爬挺厉害,分析了一下发现还是老熟人, ...

  4. python爬取快手粉丝榜_[Python] 【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...

    分享 写在前面代码功能如题,根据快手用户的id来爬取用户所有公开作品,包括图集和视频. 原理:其实就是利用基于chromium内核的浏览器自带的devtools对所有请求进行排查找出包含作品链接的请求 ...

  5. Python高级特性与网络爬虫(一):使用Ajax请求爬取用户微博内容和python多进程爬取用户图片

    最近阅读了崔庆才写的<Python3网络爬虫开发实战>,系统地学习一下利用Python写网络爬虫.由于这本书出版时间是2018年,很多书中案例涉及的网站已经改版,基本上每个案例都需要自己再 ...

  6. python批量爬取图片_【原创开源】快手爬虫,根据id批量爬取用户的所有图集和视频...

    更新日志 所有版本更新日志会记录在这里 v0.4.0(2020-03-23) 修复id转eid的一些bug 从该版本开始,爬取视频均为无水印 v0.3.0(2020-03-10) 修复一些因为用户昵称 ...

  7. Scrapy豆瓣爬虫 爬取用户以及用户关注关系

    文章目录 明确任务 1.新建mysql数据库以及数据表 1.1 创建数据库 1.2 创建用户信息表users 1.3 创建用户关注表user_follows 笔记一: mysql中utf8与utf8m ...

  8. python抓取朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)...

    原标题:如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下) 前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往 ...

  9. Python爬虫爬取微信朋友圈的方法,感兴趣的朋友可以了解下

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 小雨 | 作者 python教程 | 来源 接下来,我们将实现微信朋友圈的 ...

最新文章

  1. python函数模块概念_python中模块和包的概念
  2. Github 高赞的 YOLOv5 引发争议?Roboflow 和开发者这样说...
  3. 维基链锚定行业缺口,定位发展一体化DeFi,持续开发出各类产品应用,包括去中心化抵押借贷系统Wayki-CDP(含稳定币WUSD)、去中心化交易所Wayki-DEX、去中心化合成资产协议Wayki-X
  4. 马斯克的脑机接口公司Neuralink否认研究人员虐待猴子
  5. 单链表快速排序算法实现
  6. Win2000域控制器+Exchange2000迁移至Win2003域控制器+Exchange2003
  7. 实现 JavaScript 异步方法 Promise.all
  8. MySQL高级 - 锁 - InnoDB行锁 - 间隙锁危害
  9. 1.8. subshell
  10. MySQL生产库开发规范
  11. jQuery缓存操作-cache数据
  12. 达内python就业班视频_达内python入门到精通全套视频教程
  13. python求曲线拐点_使用Python检测新冠肺炎疫情拐点
  14. apk逆向思路_逆向练手——从一个apk简单逆向看消息摘要算法
  15. JavaScript使用手册
  16. 大学计算机基础超详细知识点(高手总结),大学计算机基础超详细知识点(高手总结)免费-...
  17. 计算机win10开机音乐,Windows10系统更改开关机声音的两种方法
  18. luogu 1757 分组背包
  19. poi 启用保护后取消_保护模式禁用怎么解除
  20. 深度学习——GAN(生成网络)损失函数解析

热门文章

  1. Python 中的len()函数
  2. sqlplus 登录报 Message file UTILITY_MSG\spwlang.msb not found!
  3. Flex 子元素高度塌陷
  4. 非科班程序员与科班程序员的区别在哪里?
  5. 可行性研究报告【最终版】——学生成绩查询系统
  6. 5G终端部分AT命令相关说明
  7. 一级建造师-经济公共课-口诀
  8. C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter应该怎么用?
  9. 一文理解OpenStack网络
  10. whmcs对接cdn系统_使用WHMCS套用了CDN加速后,WHMCS后台无限登录的解决方法