1. 程式人生 > >【網路爬蟲】爬取豆瓣電影Top250評論

【網路爬蟲】爬取豆瓣電影Top250評論

前言

本爬蟲大致流程為:
(1)分析網頁——分析網站結構
(2)傳送請求——通過requests傳送請求
(3)響應請求——得到請求響應的頁面
(4)解析響應——分析頁面,得到想要的資料
(5)儲存文字——以txt格式儲存

使用環境

  • anaconda3
  • python3.6
  • jupyter notebook

用到的庫

  • requests
  • lxml
  • urllib
  • re

庫的安裝很簡單,自行百度

中文簡體和繁體轉換所需Python庫,用於將評論中的繁體字轉為簡體字

下載zh_wiki.py 和 langconv

下載後,將這兩個py檔案放在程式碼同一個目錄下,即可

(1)分析網頁

在這裡插入圖片描述

下面我們點選下一頁,觀察網址的變化

我們發現,只有start變數在變化,而且每次加25,正好是每頁電影的個數
要想獲得每部電影的評論,我們首先要進入這部電影評論的地方

下面我們就要看每部電影的評論

在這裡插入圖片描述

檢視全部評論

在這裡插入圖片描述

在這裡插入圖片描述

同樣,一開始第一頁的引數不全,我們先點評論第2頁,再點第1頁,如上圖:

在這裡插入圖片描述

在這裡插入圖片描述

在top250頁面下開啟開發者工具(F12)

在這裡插入圖片描述

圖中紅框內,便是評論連結的前部分,那我們就可通過top頁面,獲取每一箇中每部電影的評論連結
通過一系列連結的拼接就可以獲得每部電影的評論地址,然後再通過評論連結獲取評論頁面,再獲取評論文字,這樣就可以了

流程如下:

在這裡插入圖片描述

(2)傳送請求,響應請求,解析網頁

需要匯入的庫:

import
requests # 請求庫 from urllib.parse import urlencode # 解析連結 from lxml import etree # 解析頁面 import langconv import re # 正則表示式,用去匹配去除評論中的符合
  • 獲取Top250頁面
# 獲取電影排行頁面
def get_top_page(start):
    params = {
        'start': start,
        'filter': '',
    }
    url = 'https://movie.douban.com/top250?' + urlencode(
params) print(url) try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' } response = requests.get(url,headers=headers) if response.status_code == 200: return response.text return None except RequestException: print('get_top_page() Error') return None # 測試 top_page = get_top_page(0) # 獲取第1頁的頁面html print(top_page)
  • 獲取每頁電影連結
    在這裡插入圖片描述
# 獲取每頁每部電影的評論連結前部分
def get_comment_link(top_page):
    html = etree.HTML(top_page)
    result = html.xpath('//div[@class="hd"]//a/@href')  # 分析上面得到的頁面獲得
    return result

# 測試
comment_link = get_comment_link(top_page)
print(comment_link)

在這裡插入圖片描述

這樣我們就獲得了第1頁裡面每部電影的評論連結的前部分

  • 獲取評論頁面
# 根據評論連結,獲取評論頁面
def get_comment_page(comment_link,start):
    params = {
        'start': start,
        'limit': '20',
        'sort':'new_score',
        'status':'P'
    }
    url = comment_link +'comments?'+ urlencode(params)
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
        }
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.text
        return 'Error'
    except RequestException:
        print('get_comment_page() Error')
        return None
  • 根據評論頁面獲取評論
# 根據評論頁面獲取評論
def get_comment(comment_page):
    html = etree.HTML(comment_page)
    result = html.xpath('//div[@class="mod-bd"]//div/div[@class="comment"]/p/span/text()') # 類似前面的方法,找節點
    return result

(3)儲存資料

  • 繁體字轉為簡體字
import langconv
def Traditional2Simplified(sentence):  # 將sentence中的繁體字轉為簡體字
    sentence = langconv.Converter('zh-hans').convert(sentence)
    return sentence
  • 評論資料清理
import re
# 清理一下評論資料
def clear(string):
    string = string.strip()  # 去掉空格等空白符號
    string = re.sub("[A-Za-z0-9]", "", string)  # 去掉英文字母 數字
    string = re.sub(r"[!!?。。,&;"★#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃「」『』【】"
                    r"〔〕〖〗〘〙#〚〛〜〝〞/?=~〟,〰–—‘’‛“”„‟…‧﹏.]", " ", string)  # 去掉中文符號
    string = re.sub(r"[!\'\"#。$%&()*+,-.←→/:~;<=>[email protected][\\]^_`_{|}~", " ", string)  # 去掉英文符號
    return Traditional2Simplified(string).lower()  # 所有的英文都換成小寫
  • 存為txt檔案
# 儲存評論
def save_to_txt(results):
    for result in results:
        result = clear(result)
        # print(result)
        with open('comment1.txt','a',encoding='utf-8') as file:
            file.write(result)
            file.write('\n'+'='*50+'\n')

完整程式碼

import requests  # 請求庫
from urllib.parse import urlencode  # 解析連結
from lxml import etree  # 解析頁面

import langconv
import re   # 正則表示式,用去匹配去除評論中的符合

# 獲取電影排行頁面
def get_top_page(start):
    params = {
        'start': start,
        'filter': '',
    }
    url = 'https://movie.douban.com/top250?' + urlencode(params)
    print(url)
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
        }
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        print('get_top_page() Error')
        return None

# 獲取每頁每部電影的評論連結
def get_comment_link(top_page):
    html = etree.HTML(top_page)
    result = html.xpath('//div[@class="hd"]//a/@href') # 通過..獲取父節點
    return result

# 根據評論連結,獲取評論頁面
def get_comment_page(comment_link,start):
    params = {
        'start': start,
        'limit': '20',
        'sort':'new_score',
        'status':'P'
    }
    url = comment_link +'comments?'+ urlencode(params)
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
        }
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.text
        return 'Error'
    except RequestException:
        print('get_comment_page() Error')
        return None

# 根據評論頁面獲取評論
def get_comment(comment_page):
    html = etree.HTML(comment_page)
    result = html.xpath('//div[@class="mod-bd"]//div/div[@class="comment"]/p/span/text()') # 通過..獲取父節點
    return result

 # 將sentence中的繁體字轉為簡體字
def Traditional2Simplified(sentence): 
    sentence = langconv.Converter('zh-hans').convert(sentence)
    return sentence

# 清理一下評論資料
def clear(string):
    string = string.strip()  # 去掉空格等空白符號
    string = re.sub("[A-Za-z0-9]", "", string)  # 去掉英文字母 數字
    string = re.sub(r"[!!?。。,&;"★#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃「」『』【】"
                    r"〔〕〖〗〘〙#〚〛〜〝〞/?=~〟,〰–—‘’‛“”„‟…‧﹏.]", " ", string)  # 去掉中文符號
    string = re.sub(r"[!\'\"#。$%&()*+,-.←→/:~;<=>[email protected][\\]^_`_{|}~", " ", string)  # 去掉英文符號
    return Traditional2Simplified(string).lower()  # 所有的英文都換成小寫

# 儲存評論
def save_to_txt(results):
    for result in results:
        result = clear(result)
        # print(result)
        with open('comment.txt','a',encoding='utf-8') as file:
            file.write(result)
            file.write('\n'+'='*50+'\n')

# 執行
print("爬取開始...")
for start in range(0,250,25):  # 可以爬取第一頁,減少爬蟲時間
    print("正在爬取第"+str(int(start/25+1))+"頁!!!")
    #print(start)
    top_page = get_top_page(start)
    comment_link = get_comment_link(top_page)
    #print(comment_link)
    for i in range(25):
        print("正在爬取第"+str(i)+"個電影!!!")
        #print(comment_link[i])
        for j in range(0,100,20):
            comment_page = get_comment_page(comment_link[i],j)
            results = get_comment(comment_page)
            save_to_txt(results)
        print("爬取第"+str(i)+"個電影結束")

爬取結果

在這裡插入圖片描述

我沒爬完,可以通過修改引數,只爬取第一頁每部電影的前100條評論

總結

\quad\quad在做這個爬蟲前,我看了一些相關的書,瞭解大致流程,和一些庫的使用,很明顯程式碼不是最簡化的,但是對於一個初學者來說挺有成就感,希望再接再厲,繼續加油!!!

  • 在爬取的過程中,可能出現IP被封鎖,網站可能設定了IP訪問次數限制——解決方法:可以使用代理
  • 只爬取了評論,可以將電影名稱和評論對應起來,另外,還可以將好評/壞評分別標記每條評論,以便以後對文字資料進行一些情感分析啥的,這樣就不用自己條件標籤了
  • 還可以以其他方式儲存資料,如資料庫

相關推薦

網路爬蟲豆瓣電影Top250評論

前言 本爬蟲大致流程為: (1)分析網頁——分析網站結構 (2)傳送請求——通過requests傳送請求 (3)響應請求——得到請求響應的頁面 (4)解析響應——分析頁面,得到想要的資料 (5)儲存文字——以txt格式儲存 使用環境 anaconda3 pyt

案例學python——案例三:豆瓣電影資訊入庫 一起學爬蟲——通過豆瓣電影top250學習requests庫的使用

  閒扯皮 昨晚給高中的妹妹微信講題,函式題,小姑娘都十二點了還迷迷糊糊。今天凌晨三點多,被連續的警報聲給驚醒了,以為上海拉了防空警報,難不成地震,空襲?難道是樓下那個車主車子被堵了,長按喇叭?開窗看看,好像都不是。好鬼畜的警報聲,家裡也沒裝報警器啊,莫不成家裡煤氣漏了?起床循聲而查,報警

一起學爬蟲——通過豆瓣電影top250學習requests庫的使用

學習一門技術最快的方式是做專案,在做專案的過程中對相關的技術查漏補缺。 本文通過爬取豆瓣top250電影學習python requests的使用。 1、準備工作 在pycharm中安裝request庫 請看上圖,在pycharm中依次點選:File->Settings。然後會彈出下圖的介面: 點選2

簡易爬蟲豆瓣電影top250

爬蟲目的說明: 此爬蟲簡單到不能再簡單了,主要內容就是爬取豆瓣top250電影頁面的內容,然後將該內容匯入了資料庫。下面先上結果圖: 爬蟲部分程式碼: def getlist(listurl, result): time.sleep(2

go語言爬蟲go語言豆瓣電影top250

抓取欄位:電影名稱、評分、評價人數 二、執行: 正在抓取第0頁…… 肖申克的救贖 9.6 824764人 這個殺手不太冷 9.4 791399人 霸王別姬 9.5 589028人 阿甘正傳 9.4 678850人 美麗人生 9.5 3940

Python爬蟲Scrapy框架運用1—豆瓣電影top250電影資訊(1)

一、Step step1: 建立工程專案 1.1建立Scrapy工程專案 E:\>scrapy startproject 工程專案 1.2使用Dos指令檢視工程資料夾結構 E:\>tree /f step2: 建立spid

Python3爬蟲Scrapy豆瓣電影TOP250

今天要實現的就是使用是scrapy爬取豆瓣電影TOP250榜單上的電影資訊。 步驟如下: 一、爬取單頁資訊 首先是建立一個scrapy專案,在資料夾中按住shift然後點選滑鼠右鍵,選擇在此處開啟命令列視窗,輸入以下程式碼: scrapy startprojec

python爬蟲例項豆瓣電影評分連結並圖示()-問題如何電影圖片(解決有程式碼)

這裡只有尾巴,來分析一下確定範圍:如何爬取圖片並下載?參考:http://blog.csdn.net/chaoren666/article/details/53488083----------------------------------------------------

爬蟲貓眼電影top100

用正則表示式爬取 #!/usr/bin/python # -*- coding: utf-8 -*- import json # 快速匯入此模組:滑鼠先點到要匯入的函式處,再Alt + Enter進行選擇 from multiprocessing.pool im

Python網路爬蟲:利用正則表示式豆瓣電影top250排行前10頁電影資訊

在學習了幾個常用的爬取包方法後,轉入爬取實戰。 爬取豆瓣電影早已是練習爬取的常用方式了,網上各種程式碼也已經很多了,我可能現在還在做這個都太土了,不過沒事,畢竟我也才剛入門…… 這次我還是利用正則表示式進行爬取,怎麼說呢,有人說寫正則表示式很麻煩,很多人都不

團隊-張文然-需求分析-python爬蟲分類豆瓣電影信息

工具 新的 翻頁 需求 使用 html 頁面 應該 一個 首先要明白爬網頁實際上就是:找到包含我們需要的信息的網址(URL)列表通過 HTTP 協議把頁面下載回來從頁面的 HTML 中解析出需要的信息找到更多這個的 URL,回到 2 繼續其次還要明白:一個好的列表應該:包含

Python3 爬蟲博客園首頁所有文章

表達式 技術 標記 itl 1.0 headers wow64 ignore windows 首先,我們確定博客園首頁地址為:https://www.cnblogs.com/ 我們打開可以看到有各種各樣的文章在首頁,如下圖: 我們以上圖標記的文章為例子吧!打開網頁源碼,搜

Python爬蟲入門 | 豆瓣電影信息

Python 編程語言 web開發這是一個適用於小白的Python爬蟲免費教學課程,只有7節,讓零基礎的你初步了解爬蟲,跟著課程內容能自己爬取資源。看著文章,打開電腦動手實踐,平均45分鐘就能學完一節,如果你願意,今天內你就可以邁入爬蟲的大門啦~好啦,正式開始我們的第二節課《爬取豆瓣電影信息》吧!啦啦哩啦啦,

爬蟲豆瓣電影的名字

import requests #requests模組用於傳送HTTP請求 import json #json模組用於對JSON資料進行編解碼 #新建陣列用於存放多個電影資料 movielist=[] #瀏覽器演示json crawlSite="https://api.douba

python爬蟲豆瓣電影《芳華》電影短評,分詞生成雲圖。

專案github地址:https://github.com/kocor01/spider_cloub/ Python版本為3.6 最近突然想玩玩雲圖,動手寫了個簡單的爬蟲,搭建了簡單的爬蟲架構 爬蟲爬取最近比較火的電影《芳華》分詞後生成雲圖 使用了 jieba分詞,雲圖用word

Python3爬蟲中國國家地理的62個《古鎮》和363張攝影照片

宣告:爬蟲為學習使用,請各位同學務必不要對當放網站或i伺服器造成傷害。務必不要寫死迴圈。 - 思路:古鎮——古鎮列表(迴圈獲取古鎮詳情href)——xx古鎮詳情(獲取所有img的src) - from bs4 import BeautifulSoup import u

Python爬蟲微信公眾號文章資訊準備工作

有一天發現我關注了好多微信公眾號,那時就想有沒有什麼辦法能夠將微信公眾號的文章弄下來,而且還想將一些文章的精彩評論一起搞下來。參考了一些文章,通過幾天的研究基本上實現了自己的要求,現在記錄一下自己的一些心得。 整個研究過程如下: 1.瞭解微信公眾號文章連結的組成,歷史文章API組成,單個文章

python爬蟲豆瓣電影)_動態網頁,json解釋,中文編碼

from bs4 import BeautifulSoup import requests import json import sys import codecs reload(sys) sys.setdefaultencoding( "utf-8" ) rank

[python爬蟲入門]豆瓣電影排行榜top250

要爬取內容的是豆瓣網的電影排行top250: https://movie.douban.com/top250, 將電影名和評分爬取下來並輸出, 如下圖: 使用了tkinter做了簡單頁面 然後分析如何爬取內容: 首先爬取標題: 檢視原始碼後, 發現標

(7)Python爬蟲——豆瓣電影Top250

利用python爬取豆瓣電影Top250的相關資訊,包括電影詳情連結,圖片連結,影片中文名,影片外國名,評分,評價數,概況,導演,主演,年份,地區,類別這12項內容,然後將爬取的資訊寫入Excel表中。基本上爬取結果還是挺好的。具體程式碼如下: #!/us