爬虫抓取微信公众号文章及阅读点赞总结

爬虫抓取微信公众号文章及阅读点赞总结

  近期我司接到任务抓取省内各个大学及教育局的微信公众号传播力度排名,根据调研sogou微信搜索数据还是可以的,随即采用python语言去进行抓取;过程中也遇到很多问题,由于sogou的反爬做得太恶心了总是封ip导致我需要大量的代理去抓取,这里要感谢github上的一个代理池项目。不过目前抓来的免费代理质量都不太好,大部分都被sogou封掉了。这里我也有买过一些代理,目前有发现讯代理的质量还可以。大概说一下爬虫抓sogou的步骤吧。

  • 先抓取wxid(搜索要用到)
  • 目标时间段分片 10天一次搜索(避免超过10页需要登录)
  • 获得时间片内的记录数做分页
  • 循环分页数拼接url携带代理请求
  • bs4分析网页内容 遇到验证码更换代理重新请求
  • 正则匹配出列表页中的详情页链接 多线程请求阅读点赞
  • 结果插入mysql
  • 以上操作使用多进程提升速度

获取wxid

这里用selenium去获取配置文件的公众号的wxid

class Craw_openid:
    __getWxIdApi = "http://weixin.sogou.com/weixin?zhnss=1&type=1&ie=utf8&query="
    __driver = webdriver.Chrome()
    __wechatIds = wechatIds['wxId']
    def __init__(self):
        pass
    def getWxId(self):
        for x in self.__wechatIds:
            url = self.__getWxIdApi + str(x[0])
            self.__driver.get(url)
            while (self.checkCaptcha(self.__driver.page_source) == False):
                time.sleep(0.5)
            reg = re.compile(r'"openid":"(.+?)"')
            reg2 = re.compile(r'"sourcename":"(.+?)"')
            wxId = re.findall(reg, self.__driver.page_source)[0]
            try:
                wxName = re.findall(reg2, self.__driver.page_source)[0]
            except Exception as e:
                wxName = ''
            print "['%s' , '%s' , '%s' , '%s']," % (x[0], x[1] , wxId , wxName)

    def checkCaptcha(self , content):
        soup = bs4.BeautifulSoup(content, 'html.parser', from_encoding='gb18030')
        strs = soup.select('.s1')
        if strs:
            temp = re.compile(r'>(.*?)').findall(str(strs[0]))[0]
            if temp == '您的访问出错了':
                return False
            else:
                return True
        else:
            return True

时间分段

这里我统计的是2016年的

    def getBetweenDay(self):
                for x in xrange(1, 13):
            days = calendar.monthrange(self.__year, x)[1]
            temp = str(x)
            if len(temp) == 1:
                temp = '0' + str(temp)
            ss = str(days - 20)
            if len(ss) == 1:
                ss = '0' + ss
            self.__dates.append({x: [str(self.__year) + '-' + temp + '-01', str(self.__year) + '-' + temp + '-' + ss]})
            self.__dates.append({x: [str(self.__year) + '-' + temp + '-' + str(days - 19), str(self.__year) + '-' + temp + '-' + str(days - 10)]})
            self.__dates.append({x: [str(self.__year) + '-' + temp + '-' + str(days - 9), str(self.__year) + '-' + temp + '-' + str(days)]})
        return self.__dates

文章数和阅读点赞

文章数即翻页列表数量的总数,阅读点赞可以替换详情页的前缀为getcomment

    def getSee(self):
        if self.__urlList:
            self.__totalNum = len(self.__urlList)
            for x in self.__urlList:
                url = x.replace('mp.weixin.qq.com/s?src' , 'mp.weixin.qq.com/mp/getcomment?src')
                json = self.getContent(url)
                readed = eval(json)['read_num']
                liked = eval(json)['like_num']
                if int(readed) >= 100000:
                    self.__highRead += 1
                if readed > self.__topReaded:
                    self.__topReaded = readed
                if liked > self.__topLiked:
                    self.__topLiked = liked
                self.__readed += readed
                self.__liked += liked

其他

抓取的方法有很多,重点是sogou的反爬虫做得比较严格(毕竟是专业做搜索引擎的),所以要在代理上下一些功夫,如果抓取不需要阅读点赞,可以参考github上一个go语言写的中间人攻击的方法,不需要代理,但是有可能微信号被封。
此项目的github地址我就不写了,目前改动比较大暂时没时间去维护。如需沟通交流请加我企鹅号602156652。

你可能感兴趣的:(爬虫抓取微信公众号文章及阅读点赞总结)