豆瓣影評爬蟲
阿新 • • 發佈:2018-11-11
豆瓣影評爬蟲
今天要爬取https://movie.douban.com/review/best/?start=0該網址的30條最受歡迎影評。
我們可以看到影評比較長,需要展開才能完整顯示。但是在網頁原始碼中是沒有顯示完整影評的。所以我們考慮到這部分應該是非同步載入的方式顯示。所以開啟網頁的開發者選項,可以看到點選展開之後,多了一條full的網頁。這個網頁就包含了完整評論。
我們觀察到全部評論所在的網址為https://movie.douban.com/j/review/9593388/full,其中9593388是對應的評論ID,評論ID在第一張圖片所在的網頁原始碼裡面有。所以我們的流程大題分為以下幾步:
- 獲取索引頁https://movie.douban.com/review/best/?start=0,索引頁只需要改變start=0,20,40即可訪問下一頁
- 解析索引頁,把索引頁中的10個評論的ID獲取到
- 通過獲取到的ID構建完整評論網址https://movie.douban.com/j/review/' + str(id) + '/full
- 解析評論頁,獲取評論者姓名和評論內容,寫入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)