獲取某微信公眾號(hào)所有文章且進(jìn)行分析

在線工具:微信文章轉(zhuǎn)PDF

微信公眾平臺(tái)上面的公眾號(hào)很多,里面各種文章都有,很多很雜亂。不過(guò)在這些文章中,肯定是會(huì)存在自己所認(rèn)為的精品的文章的。

所以如果我自己能夠編寫出一個(gè)程序,用來(lái)獲取自己喜歡的某個(gè)微信公眾號(hào)上的文章,獲取文章的瀏覽量點(diǎn)贊量,然后加以簡(jiǎn)單的數(shù)據(jù)分析,那么最終得到的文章列表,肯定就會(huì)是比較好的文章了。

這里需要注意的是,通過(guò)編寫爬蟲獲取搜狗微信搜索中的微信文章,并不能得到瀏覽量點(diǎn)贊量這兩個(gè)關(guān)鍵性的數(shù)據(jù)(編程功力入門級(jí)別的我)。所以我就另辟蹊徑,通過(guò)清博指數(shù)這個(gè)網(wǎng)站,來(lái)獲取我所想要的數(shù)據(jù)。

注:目前已經(jīng)找到方法可以獲得搜狗微信中文章的瀏覽量和點(diǎn)贊量。2017.02.03

其實(shí)清博指數(shù)這個(gè)網(wǎng)站上面的數(shù)據(jù)都很齊全了,可以看到微信公眾號(hào)的榜單,可以看到每日每周每月的熱文,但是還是我上面所說(shuō)的,內(nèi)容比較雜亂,那些閱讀量很高的文章,有可能就是一些家長(zhǎng)級(jí)別的人才會(huì)喜歡的文章。

當(dāng)然,我也可以在這個(gè)網(wǎng)站上搜索特定的微信公眾號(hào),然后看它的歷史文章。清博指數(shù)做的也已經(jīng)很細(xì)了,可以根據(jù)閱讀數(shù)、點(diǎn)贊數(shù)等排序文章。但是,我所需要的可能是點(diǎn)贊數(shù)除以閱讀數(shù)這個(gè)很簡(jiǎn)單的指標(biāo),所以我便需要將上面的數(shù)據(jù)通過(guò)爬蟲抓取下來(lái),進(jìn)行下簡(jiǎn)單的分析。順便可以練練手,無(wú)聊的慌。

開(kāi)始程序

以微信公眾號(hào)簡(jiǎn)七理財(cái)為例,我需要先打開(kāi)其文章界面,下面是其url:

http://www.gsdata.cn/query/article?q=jane7ducai&post_time=0&sort=-3&date=&search_field=4&page=1

然后我通過(guò)分析發(fā)現(xiàn),它總共有25頁(yè)文章,也就是最后一頁(yè)文章的url是下面這樣,注意只有最后一個(gè)參數(shù)是不一樣的:

http://www.gsdata.cn/query/article?q=jane7ducai&post_time=0&sort=-3&date=&search_field=4&page=25

所以就可以編寫一個(gè)函數(shù),重復(fù)調(diào)用25次就可以了。

BeautifulSoup抓取網(wǎng)頁(yè)上自己所需要的數(shù)據(jù)

忘了說(shuō)了,我編寫程序的語(yǔ)言用的是Python,其爬蟲入門很簡(jiǎn)單。然后BeautifulSoup是一個(gè)網(wǎng)頁(yè)分析的插件,用來(lái)獲取文章中的HTML數(shù)據(jù)很方便。

接下來(lái)就是分析網(wǎng)頁(yè)結(jié)構(gòu)了:

我用紅框框起來(lái)的是兩篇文章,它們?cè)诰W(wǎng)頁(yè)的結(jié)構(gòu)代碼都是一致的。然后通過(guò)審查元素我可以看到網(wǎng)頁(yè)的對(duì)應(yīng)代碼,這時(shí)候便可以編寫出爬取的規(guī)則出來(lái),下面我直接是寫成了一個(gè)函數(shù):

# 獲取網(wǎng)頁(yè)中的數(shù)據(jù)
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:
        # 替換標(biāo)題中的英文雙引號(hào),防止插入數(shù)據(jù)庫(kù)時(shí)出現(xiàn)錯(cuò)誤
        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('發(fā)布時(shí)間:'.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)

此函數(shù)包含了用requests先來(lái)獲取網(wǎng)頁(yè)的內(nèi)容,然后傳給BeautifulSoup用來(lái)分析提取我所需要的數(shù)據(jù),然后在通過(guò)insert_content函數(shù)數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)的知識(shí)本次就不做涉及,全部代碼會(huì)在下面給出,也算是怕自己之后遺忘。

個(gè)人認(rèn)為,其實(shí)BeautifulSoup的知識(shí)點(diǎn)只需要掌握我上面代碼所用到的find,findAll,get_text(),attrs['src']等幾個(gè)常用的語(yǔ)句就可以了。

循環(huán)抓取,且寫入數(shù)據(jù)庫(kù)中

最一開(kāi)始的url還記得嗎,總共需要抓取25個(gè)頁(yè)面,這個(gè)25個(gè)頁(yè)面的url其實(shí)就最后面的參數(shù)不一樣,所以完全可以給定一個(gè)基礎(chǔ)url,然后用for函數(shù)直接生成25個(gè)url就可以了:

# 生成需要爬取的網(wǎng)頁(yè)鏈接且進(jìn)行爬取
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這個(gè)函數(shù)傳入了兩個(gè)參數(shù),便是基礎(chǔ)的url和需要的頁(yè)面數(shù)了,可以看到我在代碼的最后一行對(duì)此函數(shù)進(jìn)行了調(diào)用。

此函數(shù)還調(diào)用了上面我抓取頁(yè)面所編寫的函數(shù)get_webdata,這樣的話,25個(gè)頁(yè)面上的文章數(shù)據(jù)都會(huì)一次寫入數(shù)據(jù)庫(kù)中。

然后請(qǐng)注意下面這個(gè)小技巧:

time.sleep(round(random.random(),1))

我每用程序爬取完一個(gè)網(wǎng)頁(yè),此語(yǔ)句便會(huì)隨機(jī)生成一個(gè)1s內(nèi)的時(shí)間段,然后休息這么一個(gè)很小的時(shí)間段,然后接著繼續(xù)抓取下一個(gè)頁(yè)面,可以防止被ban

拿到最終數(shù)據(jù)

先給出我此次編寫程序所剩下的代碼:

#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()

包含開(kāi)頭的import一些插件,然后剩下的這兩個(gè)函數(shù)便是數(shù)據(jù)庫(kù)操作相關(guān)的函數(shù)。

最終我通過(guò)在數(shù)據(jù)庫(kù)中select * from weixin.gsdata;,便可以獲取到我所抓取到的此微信公眾號(hào)的文章數(shù)據(jù),包括標(biāo)題、發(fā)布日期、閱讀量、點(diǎn)贊量、訪問(wèn)url等信息。

分析數(shù)據(jù)

這些數(shù)據(jù)只是最原始的數(shù)據(jù),我可以將上面的數(shù)據(jù)導(dǎo)入到Excel中,進(jìn)行簡(jiǎn)單的分析處理,便可以獲得我所需要的文章列表。分析思路有下:

  • 我可以按照點(diǎn)贊量排序
  • 我可以按照閱讀量排序
  • 我可以用點(diǎn)贊量除以閱讀量,然后由大到小排序
  • 我還可以加入時(shí)間的因素

我所喜歡的微信公眾號(hào)就那么幾個(gè),我完全可以通過(guò)此程序?qū)⑽宜矚g的微信公眾號(hào)的文章全部抓取下來(lái),我愿意的話,可以進(jìn)一步篩選出更加優(yōu)質(zhì)的文章。

程序很簡(jiǎn)單,但是簡(jiǎn)單的程序可以實(shí)現(xiàn)生活中的一些想法,難道不是一件很美妙的事情么。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容