1. 程式人生 > >豆瓣影評爬蟲

豆瓣影評爬蟲

豆瓣影評爬蟲

今天要爬取https://movie.douban.com/review/best/?start=0該網址的30條最受歡迎影評。

我們可以看到影評比較長,需要展開才能完整顯示。但是在網頁原始碼中是沒有顯示完整影評的。所以我們考慮到這部分應該是非同步載入的方式顯示。所以開啟網頁的開發者選項,可以看到點選展開之後,多了一條full的網頁。這個網頁就包含了完整評論。

我們觀察到全部評論所在的網址為https://movie.douban.com/j/review/9593388/full,其中9593388是對應的評論ID,評論ID在第一張圖片所在的網頁原始碼裡面有。所以我們的流程大題分為以下幾步:

  1. 獲取索引頁https://movie.douban.com/review/best/?start=0,索引頁只需要改變start=0,20,40即可訪問下一頁
  2. 解析索引頁,把索引頁中的10個評論的ID獲取到
  3. 通過獲取到的ID構建完整評論網址https://movie.douban.com/j/review/' + str(id) + '/full
  4. 解析評論頁,獲取評論者姓名和評論內容,寫入txt檔案

由於比較簡單我直接附上原始碼。

import requests
import re
from requests.exceptions import RequestException
import time

headers = {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive",
    "Host": "movie.douban.com",
    "Referer": "https://movie.douban.com/explore",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
}


# 獲取索引頁
def get_index_page(html):
    try:
        response = requests.get(url=html, headers=headers)
        response.encoding = 'utf-8'
        if response.status_code == 200:
            # print(response.text)
            return response.text
        return None
    except RequestException:
        print('獲取索引頁錯誤')
        time.sleep(3)
        return get_index_page(html)


# 解析索引頁
def parse_index_page(html):
    html = get_index_page(html)
    id_pattern = re.compile('<h2><a href="https://movie.douban.com/review/(.*?)/', re.S)
    id = re.findall(id_pattern, html)
    return id


# 獲取詳情頁
def get_detail_page(id):
    html = 'https://movie.douban.com/j/review/' + str(id) + '/full'
    html = get_index_page(html)
    content_pattern = re.compile('data-original(.*?)main-author', re.S)
    content = re.findall(content_pattern, html)
    text_pattern = re.compile('[\u4e00-\u9fa5|,、“”‘’:!
[email protected]
#¥【】*()——+。;?]+', re.S) text = re.findall(text_pattern, content[0]) text = ''.join(text) name_pattern = re.compile('data-author=.*?"(.*?)"', re.S) name = re.findall(name_pattern, html) # print(name[0].strip('\\')) return name, text def write2txt(name, text): with open('comment.txt', 'a', encoding='utf-8-sig') as f: f.write(name[0].strip('\\') + '\n') f.write(str(text) + '\n') f.write('\n') f.close() if __name__ == '__main__': for i in range(3): print(i) i = i * 20 html = 'https://movie.douban.com/review/best/?start=' + str(i) for id in parse_index_page(html): name, text = get_detail_page(id) write2txt(name, text)