python爬取论坛付费内容_Python爬虫抓取论坛关键字过程解析
前言:
之前學(xué)習(xí)了用python爬蟲(chóng)的基本知識(shí),現(xiàn)在計(jì)劃用爬蟲(chóng)去做一些實(shí)際的數(shù)據(jù)統(tǒng)計(jì)功能。由于前段時(shí)間演員的誕生帶火了幾個(gè)年輕的實(shí)力派演員,想用爬蟲(chóng)程序搜索某論壇中對(duì)于某些演員的討論熱度,并按照日期統(tǒng)計(jì)每天的討論量。
這個(gè)項(xiàng)目總共分為兩步:
1.獲取所有帖子的鏈接:
將最近一個(gè)月內(nèi)的帖子鏈接保存到數(shù)組中
2.從回帖中搜索演員名字:
從數(shù)組中打開(kāi)鏈接,翻出該鏈接的所有回帖,在回帖中查找演員的名字
獲取所有帖子的鏈接:
搜索的范圍依然是以虎撲影視區(qū)為界限?;溆耙晠^(qū)一天約5000個(gè)回帖,一月下來(lái)超過(guò)15萬(wàn)回帖,作為樣本來(lái)說(shuō)也不算小,有一定的參考價(jià)值。
完成這一步驟,主要分為以下幾步:
1.獲取當(dāng)前日期
2.獲取30天前的日期
3.記錄從第一頁(yè)往后翻的所有發(fā)帖鏈接
1.獲取當(dāng)前日期
這里我們用到了datetime模塊。使用datetime.datetime.now(),可以獲取當(dāng)前的日期信息以及時(shí)間信息。在這個(gè)項(xiàng)目中,只需要用到日期信息就好。
2.獲取30天前的日期
用datetime模塊的優(yōu)點(diǎn)在于,它還有一個(gè)很好用的函數(shù)叫做timedelta,可以自行計(jì)算時(shí)間差。當(dāng)給定參數(shù)days=30時(shí),就會(huì)生成30天的時(shí)間差,再用當(dāng)前日期減去delta,可以得到30天前的日期,將該日期保存為startday,即開(kāi)始進(jìn)行統(tǒng)計(jì)的日期。不然計(jì)算時(shí)間差需要自行考慮跨年閏年等因素,要通過(guò)一個(gè)較為復(fù)雜的函數(shù)才可以完成。
today = datetime.datetime.now()
delta = datetime.timedelta(days=30)
i = "%s" %(today - delta)
startday = i.split(' ')[0]
today = "%s" %today
today = today.split(' ')[0]
在獲得開(kāi)始日期與結(jié)束日期后,由于依然需要記錄每一天每個(gè)人的討論數(shù),根據(jù)這兩個(gè)日期生成兩個(gè)字典,分別為actor1_dict與actor2_dict。字典以日期為key,以當(dāng)日討論數(shù)目作為value,便于每次新增查找記錄時(shí)更新對(duì)應(yīng)的value值。
strptime, strftime = datetime.datetime.strptime, datetime.datetime.strftime
days = (strptime(today, "%Y-%m-%d") - strptime(startday, "%Y-%m-%d")).days
for i in range(days+1):
temp = strftime(strptime(startday, "%Y-%m-%d") + datetime.timedelta(i), "%Y-%m-%d")
actor1_dict[temp] = 0
actor2_dict[temp] = 0
3.記錄從第一頁(yè)往后翻的所有發(fā)帖鏈接
?如圖1所示,采用發(fā)帖順序排列,可以得到所有的發(fā)帖時(shí)間(精確到分鐘)。右鍵并點(diǎn)擊查看網(wǎng)頁(yè)源代碼,可以發(fā)現(xiàn)當(dāng)前帖子的鏈接頁(yè)面,用正則表達(dá)式的方式抓取鏈接。
首先依然是獲取30天前的日期,再抓取第i頁(yè)的源代碼,用正則表達(dá)式去匹配,獲取網(wǎng)頁(yè)鏈接和發(fā)帖時(shí)間。如圖2所示:
比較發(fā)帖時(shí)間,如果小于30天前的日期,則獲取發(fā)帖鏈接結(jié)束,返回當(dāng)前拿到的鏈接數(shù)組,代碼如下
def all_movie_post(ori_url):
i = datetime.datetime.now()
delta = datetime.timedelta(days=30)
i = "%s" %(i - delta)
day = i.split(' ')[0] # 獲得30天前的日子
print day
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
post_list = []
for i in range(1,100):
request = urllib2.Request(ori_url + '-{}'.format(i),headers = headers)
response = urllib2.urlopen(request)
content = response.read().decode('utf-8')
pattern = re.compile('.*?(.*?)', re.S)
items = re.findall(pattern,content)
for item in items:
if item[1] == '2011-09-16':
continue
if item[1] > day: #如果是30天內(nèi)的帖子,保存
post_list.append('https://bbs.hupu.com' + item[0])
else: #如果已經(jīng)超過(guò)30天了,就直接返回
return post_list
return post_list
函數(shù)的傳參是鏈接首頁(yè),在函數(shù)中修改頁(yè)碼,并繼續(xù)搜索。
從回帖中搜索演員名字:
接下來(lái)的步驟也是通過(guò)一個(gè)函數(shù)來(lái)解決。函數(shù)的傳參包括上一步中得到的鏈接數(shù)組,已經(jīng)想要查詢的演員名字(這個(gè)功能可以進(jìn)一步擴(kuò)展,將演員名字也用列表的形式傳輸,同時(shí)上一步生成的字典也可以多一些)。
由于虎撲論壇會(huì)將一些得到認(rèn)可的回帖擺在前端,即重復(fù)出現(xiàn)。如圖3所示:
?為了避免重復(fù)統(tǒng)計(jì),將這些重復(fù)先去除,代碼如下:
if i == 0:
index = content.find('更多亮了的回帖')
if index >= 0:
content = content[index:]
else:
index = content.find('我要推薦')
content = content[index:]
去除的規(guī)則其實(shí)并不重要,因?yàn)槊總€(gè)論壇都有自己的格式,只要能搞清楚源代碼中是怎么寫的,剩下的操作就可以自己根據(jù)規(guī)則進(jìn)行。
每個(gè)回帖格式大致如圖4,
用對(duì)應(yīng)的正則表達(dá)式再去匹配,找到每個(gè)帖子每一個(gè)回帖的內(nèi)容,在內(nèi)容中搜索演員名字,即一開(kāi)始的actor_1與actor_2,如果搜到,則在對(duì)應(yīng)回帖日期下+1。
最終將兩位演員名字出現(xiàn)頻率返回,按日期記錄的字典由于是全局變量,不需要返回。
web_str = '(.*?) .*?.*?
(.*?)' #找到回帖內(nèi)容的正則
pattern = re.compile(web_str, re.S)
items = re.findall(pattern,content)
for item in items:
#if '引用' in item: #如果引用別人的回帖,則去除引用部分
#try:
#item = item.split('')[1]
#except:
#print item
#print item.decode('utf-8')
if actor_1 in item[1]:
actor1_dict[item[0]] += 1
actor_1_freq += 1
if actor_2 in item[1]:
actor2_dict[item[0]] += 1
actor_2_freq += 1
至此,我們就利用爬蟲(chóng)知識(shí),成功完成對(duì)論壇關(guān)鍵字的頻率搜索了。
這只是一個(gè)例子,關(guān)鍵字可以任意,這也不只是一個(gè)針對(duì)演員的誕生而寫的程序。將演員名字換成其他詞,就可以做到類似“您的年度關(guān)鍵字”這樣的結(jié)果,根據(jù)頻率大小來(lái)顯示文字大小。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
總結(jié)
以上是生活随笔為你收集整理的python爬取论坛付费内容_Python爬虫抓取论坛关键字过程解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 如何击败奥杜尔尤格萨隆0灯模式?
- 下一篇: python自动化测试脚本怎么编写_编写
