這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Python如何實現(xiàn)爬蟲抓取論壇關(guān)鍵字,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
海城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,海城網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為海城上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的海城做網(wǎng)站的公司定做!這個項目總共分為兩步:
1.獲取所有帖子的鏈接:
將最近一個月內(nèi)的帖子鏈接保存到數(shù)組中
2.從回帖中搜索演員名字:
從數(shù)組中打開鏈接,翻出該鏈接的所有回帖,在回帖中查找演員的名字
獲取所有帖子的鏈接:
搜索的范圍依然是以虎撲影視區(qū)為界限?;溆耙晠^(qū)一天約5000個回帖,一月下來超過15萬回帖,作為樣本來說也不算小,有一定的參考價值。
完成這一步驟,主要分為以下幾步:
1.獲取當(dāng)前日期
2.獲取30天前的日期
3.記錄從第一頁往后翻的所有發(fā)帖鏈接
1.獲取當(dāng)前日期
這里我們用到了datetime模塊。使用datetime.datetime.now(),可以獲取當(dāng)前的日期信息以及時間信息。在這個項目中,只需要用到日期信息就好。
2.獲取30天前的日期
用datetime模塊的優(yōu)點在于,它還有一個很好用的函數(shù)叫做timedelta,可以自行計算時間差。當(dāng)給定參數(shù)days=30時,就會生成30天的時間差,再用當(dāng)前日期減去delta,可以得到30天前的日期,將該日期保存為startday,即開始進(jìn)行統(tǒng)計的日期。不然計算時間差需要自行考慮跨年閏年等因素,要通過一個較為復(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]
在獲得開始日期與結(jié)束日期后,由于依然需要記錄每一天每個人的討論數(shù),根據(jù)這兩個日期生成兩個字典,分別為actor1_dict與actor2_dict。字典以日期為key,以當(dāng)日討論數(shù)目作為value,便于每次新增查找記錄時更新對應(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.記錄從第一頁往后翻的所有發(fā)帖鏈接
如圖1所示,采用發(fā)帖順序排列,可以得到所有的發(fā)帖時間(精確到分鐘)。右鍵并點擊查看網(wǎng)頁源代碼,可以發(fā)現(xiàn)當(dāng)前帖子的鏈接頁面,用正則表達(dá)式的方式抓取鏈接。
首先依然是獲取30天前的日期,再抓取第i頁的源代碼,用正則表達(dá)式去匹配,獲取網(wǎng)頁鏈接和發(fā)帖時間。如圖2所示:
比較發(fā)帖時間,如果小于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)超過30天了,就直接返回 return post_list return post_list