1. 程式人生 > >文字挖掘入門(一):大眾點評評論爬蟲

文字挖掘入門(一):大眾點評評論爬蟲

最近在學習文字分析,包括爬蟲、文字清洗、詞向量、機器學習建模等,一邊學一邊做個案例,希望各位大蝦多給點意見~

整體思路

爬取大眾點評十大熱門糖水店的評論,爬取網頁後從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

反爬蟲對抗

  1. 修改請求頭中瀏覽器資訊:使用fake_useragent第三方庫,修改request中的headers引數,用法如下:

    from fake_useragent import UserAgent
    ua = UserAgent()
    headers = {'User-Agent':ua.random}
    
  2. 設定跳轉路徑:在訪問評論時,一般的瀏覽行為是從某一頁跳轉到下一頁這樣的,而不是直接通過連線訪問,為了更好的偽裝成一個正常的訪問,我們需要設定一下跳轉的路徑,修改headers中的Referer引數

    headers = {
            'User-Agent':ua.random,
            'Cookie':cookie,
            'Referer': 'http://www.dianping.com/shop/518986/review_all'
    }
    
  3. 設定Cookies:評論資料需要登入後才能獲取,下面介紹一種非常簡單方便的繞過登入的方法。

    • 在網頁上進行登入
    • 使用Chrome瀏覽器的開發者工具,查詢當前請求的cookie
    • 複製瀏覽器中的cookie,使用此cookie對我們的請求進行偽裝
  4. 使用IP代理池:這裡使用西刺代理的免費代理,構建一個爬蟲爬取西刺代理的ip,然後進行驗證,篩掉不可用的ip,構建出ip池供後續呼叫,程式碼來自網路。但是經過測試,大眾點評對一個賬號不同ip訪問監控非常嚴格,使用IP代理池不更換賬號的話,死的更快,封你賬號,然而構建賬號池比較麻煩,我們先暫緩。

  5. 降低爬取頻率:一個簡單又有效的方法就是降低爬取頻率,畢竟高頻率的爬取對伺服器也是一個考驗,如果對速度的要求不是很高的話,建議把頻率放慢一點,你好我好大家好!

    import random
    import time
    time.sleep(6*random.random() + 4)
    
  6. 設定斷點續傳:即使降低了爬取頻率,有時還是會被美團的網路工程師抓到的,小哥哥饒命啊。因此我們需要一個斷點續傳的小功能,避免每次都從頭開始爬。思路是建一個文字檔案,儲存當前爬取的進度,每次執行程式時都出當前進度開始,詳見程式碼