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

 

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

 

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值