在線工具:微信文章轉(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)生活中的一些想法,難道不是一件很美妙的事情么。