文字挖掘入門(一):大眾點評評論爬蟲
最近在學習文字分析,包括爬蟲、文字清洗、詞向量、機器學習建模等,一邊學一邊做個案例,希望各位大蝦多給點意見~
整體思路
爬取大眾點評十大熱門糖水店的評論,爬取網頁後從html頁面中把需要的欄位資訊(顧客id、評論時間、評分、評論內容、口味、環境、服務、店鋪ID)提取出來並存儲到MYSQL資料庫中。
網頁爬取和解析
連結格式為"http://www.dianping.com/shop/" + shopID + “/review_all/” + pi,如:http://www.dianping.com/shop/518986/review_all/p1 ,一頁評論有20條。我們使用for迴圈構造連結URL,使用requests庫發起請求並把html頁面爬取下來,通過BeautifulSoup和re庫解析頁面提取資訊。
我們發現完整的評論都儲存在’div’,'main-review’中,且部分頁面口味、環境、服務並不是每一頁都有,因此需要使用try…except…防止程式中斷,BeautifulSoup部分程式碼如下:
for item in soup('div','main-review'):
cus_id = item.find('a','name').text.strip()
comment_time = item.find('span','time').text.strip()
comment_star = item.find('span',re.compile('sml-rank-stars' )).get('class')[1]
cus_comment = item.find('div',"review-words").text.strip()
scores = str(item.find('span','score'))
try:
kouwei = re.findall(r'口味:([\u4e00-\u9fa5]*)',scores)[0]
huanjing = re.findall(r'環境:([\u4e00-\u9fa5]*)',scores)[0]
fuwu = re.findall(r'服務:([\u4e00-\u9fa5]*)' ,scores)[0]
except:
kouwei = huanjing = fuwu = '無'
資料儲存
我們使用MYSQL資料庫,安裝教程參考菜鳥教程,python連線MYSQL資料推薦使用pymysql,同樣是推薦菜鳥教程菜鳥教程。我們需要先建立一個數據庫和表,然後連線並定義遊標,然後寫對應的sql語句,最後執行事務,儲存部分的程式碼如下:
#連線MYSQL資料庫
db = pymysql.connect("localhost","root","","TESTDB" )
cursor = db.cursor()
#儲存爬取到的資料
def save_data(data_dict):
sql = '''INSERT INTO DZDP(cus_id, comment_time, comment_star, cus_comment, kouwei, huanjing, fuwu, shopID) VALUES(%s,%s,%s,%s,%s,%s,%s,%s)'''
value_tup = (data_dict['cus_id']
,data_dict['comment_time']
,data_dict['comment_star']
,data_dict['cus_comment']
,data_dict['kouwei']
,data_dict['huanjing']
,data_dict['fuwu']
,data_dict['shopID']
)
try:
cursor.execute(sql,value_tup)
db.commit()
except:
print('資料庫寫入失敗')
return
反爬蟲對抗
-
修改請求頭中瀏覽器資訊:使用fake_useragent第三方庫,修改request中的headers引數,用法如下:
from fake_useragent import UserAgent ua = UserAgent() headers = {'User-Agent':ua.random}
-
設定跳轉路徑:在訪問評論時,一般的瀏覽行為是從某一頁跳轉到下一頁這樣的,而不是直接通過連線訪問,為了更好的偽裝成一個正常的訪問,我們需要設定一下跳轉的路徑,修改headers中的Referer引數
headers = { 'User-Agent':ua.random, 'Cookie':cookie, 'Referer': 'http://www.dianping.com/shop/518986/review_all' }
-
設定Cookies:評論資料需要登入後才能獲取,下面介紹一種非常簡單方便的繞過登入的方法。
- 在網頁上進行登入
- 使用Chrome瀏覽器的開發者工具,查詢當前請求的cookie
- 複製瀏覽器中的cookie,使用此cookie對我們的請求進行偽裝
-
使用IP代理池:這裡使用西刺代理的免費代理,構建一個爬蟲爬取西刺代理的ip,然後進行驗證,篩掉不可用的ip,構建出ip池供後續呼叫,程式碼來自網路。但是經過測試,大眾點評對一個賬號不同ip訪問監控非常嚴格,使用IP代理池不更換賬號的話,死的更快,封你賬號,然而構建賬號池比較麻煩,我們先暫緩。
-
降低爬取頻率:一個簡單又有效的方法就是降低爬取頻率,畢竟高頻率的爬取對伺服器也是一個考驗,如果對速度的要求不是很高的話,建議把頻率放慢一點,你好我好大家好!
import random import time time.sleep(6*random.random() + 4)
-
設定斷點續傳:即使降低了爬取頻率,有時還是會被美團的網路工程師抓到的,小哥哥饒命啊。因此我們需要一個斷點續傳的小功能,避免每次都從頭開始爬。思路是建一個文字檔案,儲存當前爬取的進度,每次執行程式時都出當前進度開始,詳見程式碼