获取某微信公众号所有文章且进行分析 - 简书
最新文章: 获取微信公众号所有历史文章链接地址
2017.4.19
微信公众平台上面的公众号很多,里面各种文章都有,很多很杂乱。不过在这些文章中,肯定是会存在自己所认为的 精品的文章的。
所以如果我自己能够编写出一个程序,用来获取自己喜欢的 某个微信公众号上的文章,获取文章的 浏览量和 点赞量,然后加以简单的数据分析,那么最终得到的文章列表,肯定就会是比较好的文章了。
这里需要注意的是,通过编写爬虫获取 搜狗微信搜索中的微信文章,并不能得到 浏览量和 点赞量这两个关键性的数据(编程功力入门级别的我)。所以我就另辟蹊径,通过 清博指数这个网站,来获取我所想要的数据。
注:目前已经找到方法可以 获得搜狗微信中文章的浏览量和点赞量。2017.02.03
其实清博指数这个网站上面的数据都很齐全了,可以看到微信公众号的榜单,可以看到每日每周每月的热文,但是还是我上面所说的, 内容比较杂乱,那些阅读量很高的文章,有可能就是一些 家长级别的人才会喜欢的文章。
当然,我也可以在这个网站上搜索特定的微信公众号,然后看它的历史文章。清博指数做的也已经很细了,可以根据阅读数、点赞数等排序文章。但是,我所需要的可能是 点赞数除以阅读数这个很简单的指标,所以我便需要将上面的数据通过爬虫抓取下来,进行下简单的分析。顺便可以练练手,无聊的慌。
开始程序
以微信公众号 简七理财为例,我需要先打开其文章界面,下面是其url:
http://www.gsdata.cn/query/article?q=jane7ducai&post_time=0&sort=-3&date=&search_field=4&page=1
然后我通过分析发现,它总共有25页文章,也就是最后一页文章的url是下面这样,注意只有最后一个参数是不一样的:
http://www.gsdata.cn/query/article?q=jane7ducai&post_time=0&sort=-3&date=&search_field=4&page=25
所以就可以编写一个函数,重复调用25次就可以了。
BeautifulSoup抓取网页上自己所需要的数据
忘了说了,我编写程序的语言用的是 Python,其爬虫入门很简单。然后 BeautifulSoup是一个网页分析的插件,用来获取文章中的 HTML数据很方便。
接下来就是分析网页结构了:
我用红框框起来的是两篇文章,它们在网页的结构代码都是一致的。然后通过 审查元素我可以看到网页的对应代码,这时候便可以编写出爬取的规则出来,下面我直接是写成了一个函数:
# 获取网页中的数据
def get_webdata(url):
headers = {
'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
}
r = requests.get(url,headers=headers)
c = r.content
b = BeautifulSoup(c)
data_list = b.find('ul',{'class':'article-ul'})
data_li = data_list.findAll('li')
for i in data_li:
# 替换标题中的英文双引号,防止插入数据库时出现错误
title = i.find('h4').find('a').get_text().replace('"','\'\'')
link = i.find('h4').find('a').attrs['href']
source = i.find('span',{'class':'blue'}).get_text()
time = i.find('span',{'class':'blue'}).parent.next_sibling.next_sibling.get_text().replace('发布时间:'.decode('utf-8'),'')
readnum = int(i.find('i',{'class':'fa-book'}).next_sibling)
praisenum = int(i.find('i',{'class':'fa-thumbs-o-up'}).next_sibling)
insert_content(title,readnum,praisenum,time,link,source)
此函数包含了用 requests先来获取网页的内容,然后传给 BeautifulSoup用来分析提取我所需要的数据,然后在通过 insert_content函数数据库中,数据库的知识本次就不做涉及,全部代码会在下面给出,也算是怕自己之后遗忘。
个人认为,其实 BeautifulSoup的知识点只需要掌握我上面代码所用到的 find,findAll,get_text(),attrs['src']
等几个常用的语句就可以了。
循环抓取,且写入数据库中
最一开始的url还记得吗,总共需要抓取25个页面,这个25个页面的url其实就最后面的参数不一样,所以完全可以给定一个基础url,然后用 for
函数直接生成25个url就可以了:
# 生成需要爬取的网页链接且进行爬取
def get_urls_webdatas(basic_url,range_num):
for i in range(1,range_num+1):
url = basic_url + str(i)
print url
print ''
get_webdata(url)
time.sleep(round(random.random(),1))
basic_url = 'http://www.gsdata.cn/query/article?q=jane7ducai&post_time=0&sort=-3&date=&search_field=4&page='
get_urls_webdatas(basic_url,25)
如上面的代码, get_urls_webdataas
这个函数传入了两个参数,便是基础的url和需要的页面数了,可以看到我在代码的最后一行对此函数进行了调用。
此函数还调用了上面我抓取页面所编写的函数 get_webdata
,这样的话,25个页面上的文章数据都会一次写入数据库中。
然后请注意下面这个小技巧:
time.sleep(round(random.random(),1))
我每用程序爬取完一个网页,此语句便会随机生成一个1s内的时间段,然后休息这么一个很小的时间段,然后接着继续抓取下一个页面, 可以防止被ban。
拿到最终数据
先给出我此次编写程序所剩下的代码:
#coding:utf-8
import requests,MySQLdb,random,time
from bs4 import BeautifulSoup
def get_conn():
conn = MySQLdb.connect('localhost','root','0000','weixin',charset='utf8')
return conn
def insert_content(title,readnum,praisenum,time,link,source):
conn = get_conn()
cur = conn.cursor()
print title,readnum
sql = 'insert into weixin.gsdata(title,readnum,praisenum,time,link,source) values ("%s","%s","%s","%s","%s","%s")' % (title,readnum,praisenum,time,link,source)
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
包含开头的 import
一些插件,然后剩下的这两个函数便是 数据库操作相关的函数。
最终我通过在数据库中 select * from weixin.gsdata;
,便可以获取到我所抓取到的此微信公众号的文章数据,包括标题、发布日期、阅读量、点赞量、访问url等信息。
分析数据
这些数据只是最原始的数据,我可以将上面的数据导入到 Excel中,进行简单的分析处理,便可以获得我所需要的文章列表。分析思路有下:
- 我可以按照点赞量排序
- 我可以按照阅读量排序
- 我可以用点赞量除以阅读量,然后由大到小排序
- 我还可以加入时间的因素
- …
我所喜欢的微信公众号就那么几个,我完全可以通过此程序将我所喜欢的微信公众号的文章全部抓取下来,我愿意的话,可以进一步筛选出更加优质的文章。
程序很简单,但是简单的程序可以实现生活中的一些想法,难道不是一件很美妙的事情么。