爬蟲之獲取貓眼電影10W評論


第一步

打開一個電影的評論界面:

哪吒之魔童降世:https://maoyan.com/films/1211270

我們發現這里只顯示10條評論,而我們需要爬取10w條數據,所以不能從此頁面進行抓包,所以放棄!!!!

於是又上網查,終於看到一篇文章說到開發者模式可以直接切換到手機模式;

第二步

切換開發者模式為手機模式

切換模式后可以看到所有評論都顯示出來了,我們可以直接抓包進行分析

第三步

點擊查看全部討論

 開發者工具切換切換XHR,然后一直下滑查看評論

每條請求所對應的數據

http://m.maoyan.com/review/v2/comments.json?movieId=1211270&userId=-1&offset=15&limit=15&ts=1564996441232&type=3

# movieId       表示電影ID
# offset        表示偏移量
# limit         一頁顯示多少數據
# ts            當前時間戳

通過多次下滑觀察可以看到每次都是offset在變化,而且每次加15,也就是增加15條評論,知道了這個規律其實大家都應該會做了,但是還有個問題,這個方法只能爬取1000條數據,除非改變時間戳,也就是ts,

第四步

我們在上面的方法基礎上改變時間戳后發現也只能爬取1000條數據,我們只能另尋他法;

於是我們通過百度知道了有另外一個api可以獲得貓眼電影的評論數據

http://m.maoyan.com/mmdb/comments/movie/1211270.json?_v_=yes&offset=0&startTime=2019-08-04%2018:18:53
# 只需要改變startTime,根據時間段來獲取評論數據
# 每次獲取的評論數據還是15條

查看每頁中最后一條數據的startTime

根據上面的原理我們制定爬取方案:
因為我們請求網頁所得到的響應數據只用15條,且可以獲取到最后一條數據的startTime;

第一次請求url中的startTime我們用當前時間,並獲取響應數據中最后一條數據的startTime;
第二次請求時我們將時間替換為第一次請求時響應數據中最后一條數據的startTime,依次類推
直到時間為電影的上映時間即可獲取該部電影的所有評論數據;
from pymongo import MongoClient

my_client = MongoClient("127.0.0.1",27017)

MDB = my_client["Movie_rating"]   # 指定連接電影評分的庫名

print(MDB.Movie_comment.find({}).count())  # 查看表中一共有多少條數據
指定存儲數據庫
import time
import random
import datetime
import requests
from mongo_db import MDB

# 獲取當前時間轉換為2019/8/5 17:31:15形式空格用%20替換
now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S').replace(' ','%20')

headers = {
            'Host': 'm.maoyan.com',
            'Referer': 'http://m.maoyan.com/movie/1211270/comments?_v_=yes',
            'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36',
            'X-Requested-With': 'superagent',
        }

time.sleep(random.random())

# 從當前時間往前爬取2000個url的數據,每個url有15條數據
for num in range(1,2000):
    url = "http://m.maoyan.com/mmdb/comments/movie/1211270.json?_v_=yes&offset=0&startTime={}".format(now_time)
    print("正在下載第{}條評論".format(num))
    response = requests.get(url).json()
    # 每頁的最后一條評論的時間,每次請求后給全局的now_time重新賦值,下次請求時用的時間就是上次響應數據中的最后一條數據的時間
    now_time = response["cmts"][-1]["startTime"]
    for movie_info in response["cmts"]:
        cityName = movie_info["cityName"]
        content = movie_info["content"]
        user_id = movie_info["id"]
        nickName = movie_info["nickName"]
        movieId = movie_info["movieId"]
        gender = movie_info.get("gender")
        if not gender:
            gender = "暫無"

        comment_info = {"cityName":cityName,"nickName":nickName,"user_id":user_id,"movieId":movieId,"gender":gender,"content":content}
        # 因為我們創建了唯一索引,所以我們在插入數據時如果有重復的會報錯,這里做了異常處理
        try:
            MDB.Movie_comment.insert_one(comment_info)
        except Exception as e:
            print(e)
print("所有評論下載完成")

數據下載地址:https://files.cnblogs.com/files/songzhixue/%E7%8C%AB%E7%9C%BC%E7%94%B5%E5%BD%B13w%E6%9D%A1%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE.rar

共計3w評論下載完成后導入mongodb數據庫

時間轉換地址:http://tool.chinaz.com/Tools/unixtime.aspx

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM