微信行业公众号数据抓取分析

2015-11-26 blog

最近因为工作的需要,要分析下教育行业的微信大号的相关数据,以下为相关内容:
Q1:如何找到行业微信大号?
Q2:如何抓取数据?
Q3:如何处理数据?
Q4:如何分析数据?

1.行业微信大号的寻找

最开始准备问问运营人员,后来想起来之前有个网站:新榜,里面有按照行业划分的新媒体榜单,里面就包含了教育行业Top50的微信活跃数据。

2.数据抓取

2.1 urllib2抓取

找到数据源,接下来就是数据整理问题了。肯定不能手动一页页的查找,粘贴/复制到Excel里面。想起以前在python下用urllib2抓取过网页,再用BeautifulSoup进行解析出数据的经历,因此想重复此操作,以前的demo如下:

import urllib,urllib2
from bs4 import BeautifulSoup
page=urllib2.urlopen('http://www.baidu.com')
soup=BeautifulSoup(page)
print soup.title.get_text()

可是问题来了,榜单排行数据是采用的ajax发送的,如果仅仅是post方式,那么通过urllib2也能获取。但我仔细看了下,post的请求参数都是加密处理的,因此这种方式不好处理。

2.2 模拟浏览器抓取

还有一个办法去获取ajax内容,那就是用浏览器模拟用户访问,获取完整的网页内容,进而分析处理数据。在网上看了下,有很多自动化测试的工具,就能完成这项工作,在这里,用 selenium 进行此项工作。
selenium是一个自动化测试工具,能通过插件的方式调用起ie,firefox,chrome等相关浏览器并执行编写好的脚本,selenium有对应的python包,因此使用十分方便,以下为相关步骤:

  1. 安装相关包:

    pip install selenium
    
  2. 下载对应浏览器插件

    下载对应的浏览器插件,下载地址里面有部分内容叫做"Third Party Drivers, Bindings, and Plugins",在这里你可以根据个人情况选择对应的浏览器。我在这里选择的是Google Chrome Driver。并将下载的.exe文件放入到系统环境变量path所包含的目录中,比如python的安装目录,这样系统才能在程序执行时调用这个.exe文件。
    更新说明:firefox的dirver,之前的名字为wires.exe,现在的为GeckoDriver,因此你需要将下载的webdriver重新命名为wires.exe

  3. 代码实现:

    处理完以上步骤,就可以使用selenium来访问我们的网站了,相关代码如下:
    python
    from bs4 import BeautifulSoup
    from time import sleep
    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    if __name__=='__main__':
    ##使用chrome解析网页;
    driver = webdriver.Chrome()
    driver.get('http://www.newrank.cn/public/info/detail.html?account='+id)
    time.sleep(10) #休眠10秒,保证ajax数据成功返回并在网页上加载,这个细节很重要。
    page=driver.page_source #返回网页url数据
    soup=BeautifulSoup(page)
    print soup.title
    driver.quit()

    通过以上代码,就可以实现ajax数据的抓取。另外其实可以直接用selenium直接操作获取页面元素,而不用bs4进行处理。具体的文档可以见此处

  4. 补充

    以上代码在调用chrome时,会打开一个新的窗口,那么能不能不开新窗口,后台抓取了?其实selenium可以通过HtmlUnitDriver,利用java虚拟机在后台执行。要实现这种功能,你需要先安装java虚拟机,并下载Selenium-Server后台执行jar文件。

    java -jar selenium-server-standalone-x.x.x.jar

    python实现HtmlUnitDriver的代码如下:
    python
    from selenium import webdriver
    driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.HTMLUNITWITHJS)

    另外你也可以通过PhantomJS来实现,PhantomJS的使用介绍可以参考阮一峰的这篇博客。在这里,我们只需要从官网下载PhantomJS的.exe文件,放入到python安装目录中即可。再将之前的代码中的driver类型修改如下:

    driver = webdriver.PhantomJS()

3.数据处理

1.bs4处理返回的html代码,主要是获取排行、粉丝、热门内容等数据,存入字典。
2.通过pandas将字典转化为dataframe,并输出为csv文件。

4.标题切词与标签云

原始数据出来后,可以依据浏览、点赞、预估粉丝量等数据进行排名。另外就是可以对各个微信号发布的热门文章进行分析。考虑到每个微信号抓取了10篇文章标题,那么60多个微信号就是600多条,人工看比较麻烦,这个时候使用jieba切词,统计词频,再通过标签云进行展示会比较有意思。不过这个地方发现每个微信号只抓10篇内容有点少,应该多再多抓点。
另外标签云可以通过JS实现,wordcloud2.js可以实现。另外还可以参考这篇博客wordcloud项目
效果图如下:

5.聚类

另外还可以通过关键词出现的频率对微信号进行聚类。pandas+sklearn可以很方便的整理数据,并结合关键词进行聚类。下面就是我的聚类结果图:

Comments
Write a Comment