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

 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 True else: 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
<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
<https://github.com/onelittlecoder/python/tree/master/cmd/mmAutoComment>看看。

想了下,如果感兴趣的可以继续做下延伸的工作:

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()
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信