第一步
打開一個電影的評論界面:html
哪吒之魔童降世:https://maoyan.com/films/1211270mongodb
咱們發現這裏只顯示10條評論,而咱們須要爬取10w條數據,因此不能今後頁面進行抓包,因此放棄!!!!數據庫
因而又上網查,終於看到一篇文章說到開發者模式能夠直接切換到手機模式;json
第二步
切換開發者模式爲手機模式api
切換模式後能夠看到全部評論都顯示出來了,咱們能夠直接抓包進行分析dom
第三步
點擊查看所有討論ide
開發者工具切換切換XHR,而後一直下滑查看評論工具
每條請求所對應的數據post
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,ui
第四步
咱們在上面的方法基礎上改變時間戳後發現也只能爬取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,依次類推 直到時間爲電影的上映時間便可獲取該部電影的全部評論數據;
![](http://static.javashuo.com/static/loading.gif)
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