美文网首页爬虫相关Web Scraping
获取某微信公众号所有文章且进行分析

获取某微信公众号所有文章且进行分析

作者: 力气强 | 来源:发表于2016-07-03 23:48 被阅读13497次

在线工具:微信文章转PDF
2018.1.29

微信公众平台上面的公众号很多,里面各种文章都有,很多很杂乱。不过在这些文章中,肯定是会存在自己所认为的精品的文章的。

所以如果我自己能够编写出一个程序,用来获取自己喜欢的某个微信公众号上的文章,获取文章的浏览量点赞量,然后加以简单的数据分析,那么最终得到的文章列表,肯定就会是比较好的文章了。

这里需要注意的是,通过编写爬虫获取搜狗微信搜索中的微信文章,并不能得到浏览量点赞量这两个关键性的数据(编程功力入门级别的我)。所以我就另辟蹊径,通过清博指数这个网站,来获取我所想要的数据。

注:目前已经找到方法可以获得搜狗微信中文章的浏览量和点赞量。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中,进行简单的分析处理,便可以获得我所需要的文章列表。分析思路有下:

  • 我可以按照点赞量排序
  • 我可以按照阅读量排序
  • 我可以用点赞量除以阅读量,然后由大到小排序
  • 我还可以加入时间的因素

我所喜欢的微信公众号就那么几个,我完全可以通过此程序将我所喜欢的微信公众号的文章全部抓取下来,我愿意的话,可以进一步筛选出更加优质的文章。

程序很简单,但是简单的程序可以实现生活中的一些想法,难道不是一件很美妙的事情么。

相关文章

网友评论

  • d6a1acf693e2:有没有源代码,急求有偿,1098500187联系
  • 1bc190001469:请问有在线获得所有文章链接的方法嘛,我只需要链接就可以了
  • 67f554e32bbd:学习了,我用的PHP
  • XeBin:清博指数有验证码等反爬虫吗
    力气强:现在应该已经失效了,这个办法
  • 12e9ff6b4936:好棒 这样再也不用浪费时间去微信公众号去看文了 不仅字体小的可怜而且看了又忘没效率就是浪费时间而已 想问下作者 一个零基础的小白看不懂您上面的各种 就单纯复制您的代码 也可以成功爬取吗
    力气强:现在应该已经失效了,这个办法
  • 6de098b75a36:这个正解是手机模拟点击关注公众号,然后通过抓包获得key,之后遍历
    6de098b75a36:@即刻极客 有空了写一篇 :P
    力气强:@ospider 有相关的教程吗~
  • 小马哥nice:请问有源代码共享吗
  • 心智万花筒:这个网站给出的文章不全吧?
    力气强:@米乐乐果 不全,比较久之前的好像就不会有了

本文标题:获取某微信公众号所有文章且进行分析

本文链接:https://www.haomeiwen.com/subject/jaecjttx.html