之前學習了用python爬蟲的基本知識,現在計畫用爬蟲去做一些實際的資料統計功能。由於前段時間演員的誕生帶火了幾個年輕的實力派演員,想用爬蟲程式搜尋某論壇中對於某些演員的討論熱度,並按照日期統計每天的討論量。
這個專案總共分為兩步:
將最近乙個月內的帖子鏈結儲存到陣列中
從陣列中開啟鏈結,翻出該鏈結的所有回帖,在回帖中查詢演員的名字
搜尋的範圍依然是以虎撲影視區為界限。虎撲影視區一天約5000個回帖,一月下來超過15萬回帖,作為樣本來說也不算小,有一定的參考價值。
完成這一步驟,主要分為以下幾步:
1. 獲取當前日期
2. 獲取30天前的日期
3. 記錄從第一頁往後翻的所有發帖鏈結
1. 獲取當前日期
這裡我們用到了datetime模組。使用datetime.datetime.now(),可以獲取當前的日期資訊以及時間資訊。在這個專案中,只需要用到日期資訊就好。
2. 獲取30天前的日期
用datetime模組的優點在於,它還有乙個很好用的函式叫做timedelta,可以自行計算時間差。當給定引數days=30時,就會生成30天的時間差,再用當前日期減去delta,可以得到30天前的日期,將該日期儲存為startday,即開始進行統計的日期。不然計算時間差需要自行考慮跨年閏年等因素,要通過乙個較為複雜的函式才可以完成。
today = datetime.datetime.now()在獲得開始日期與結束日期後,由於依然需要記錄每一天每個人的討論數,根據這兩個日期生成兩個字典,分別為actor1_dict與actor2_dict。字典以日期為key,以當日討論數目作為value,便於每次新增查詢記錄時更新對應的value值。delta = datetime.timedelta(days=30)
i = "%s" %(today - delta)
startday = i.split(' ')[0]
today = "%s" %today
today = today.split(' ')[0]
strptime, strftime = datetime.datetime.strptime, datetime.datetime.strftime3. 記錄從第一頁往後翻的所有發帖鏈結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
比較發帖時間,如果小於30天前的日期,則獲取發帖鏈結結束,返回當前拿到的鏈結陣列,**如下
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 =
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天內的帖子,儲存
else: #如果已經超過30天了,就直接返回
return post_list
return post_list
由於虎撲論壇會將一些得到認可的回帖擺在前端,即重複出現。如圖3所示:
為了避免重複統計,將這些重複先去除,**如下:
if i == 0:去除的規則其實並不重要,因為每個論壇都有自己的格式,只要能搞清楚源**中是怎麼寫的,剩下的操作就可以自己根據規則進行。index = content.find('更多亮了的回帖')
if index >= 0:
content = content[index:]
else:
index = content.find('我要推薦')
content = content[index:]
每個回帖格式大致如圖4,
用對應的正規表示式再去匹配,找到每個帖子每乙個回帖的內容,在內容中搜尋演員名字,即一開始的actor_1與actor_2,如果搜到,則在對應回帖日期下+1。
最終將兩位演員名字出現頻率返回,按日期記錄的字典由於是全域性變數,不需要返回。
web_str = '(.*?) .*?.*?[\s]*[\s]*(.*?)至此,我們就利用爬蟲知識,成功完成對論壇關鍵字的頻率搜尋了。' #找到回帖內容的正則
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
這只是乙個例子,關鍵字可以任意,這也不只是乙個針對演員的誕生而寫的程式。將演員名字換成其他詞,就可以做到類似「您的年度關鍵字」這樣的結果,根據頻率大小來顯示文字大小。
python 爬蟲 基本抓取
首先,python中自帶urllib及urllib2這兩個模組,基本上能滿足一般的頁面抓取,另外,requests 也是非常有用的。對於帶有查詢欄位的url,get請求一般會將來請求的資料附在url之後,以?分割url和傳輸資料,多個引數用 連線。data requests data為dict,js...
python 爬蟲,抓取小說
coding utf 8 from bs4 import beautifulsoup from urllib import request import re import os,time 訪問url,返回html頁面 defget html url req request.request url ...
Python爬蟲抓取(一)
開啟cmd 1.新建虛擬環境virtualenv 環境名稱,主要是我們開發乙個專案,不可能在源目錄下進行開發,新建虛擬目錄可以不汙染源環境,可以切換到你需要新建的目錄下再建,預設在python的安裝目錄下 2.進入虛擬環境 cd 環境名稱 3.啟用虛擬環境 scripts activate 4.在虛...