您的位置:首页 > 移动开发 > 微信开发

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

2017-04-25 14:11 603 查看

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

  近期我司接到任务抓取省内各个大学及教育局的微信公众号传播力度排名,根据调研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'>(.*?)</span>').findall(str(strs[0]))[0]
if temp == '您的访问出错了':

910a
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: