import pymysql as pm import json import time import requests #网页版猫眼只能显示热门短评,只有手机版app才能显示所有评论,所以抓包关键 # 建立数据库 db = pm.connect(host='localhost', user='root', password='123456', db='lianjia') # 声明游标 cursors = db.cursor() sql = 'insert into maoyan_data(date,city,score,comment,nick) values(%s,%s,%s,%s,%s)' for i in range(0,10): time.sleep(2) #offset不应该每次递增1次,因为每页有15条短评,而且第二页跟第一页只有一条短评不一样! url ='http://m.maoyan.com/mmdb/comments/movie/1235560.json?_v_=yes&offset='+ str(i*15) #这是评论网页地址,1235560是电影白蛇缘起的id html = requests.get(url).content #获得内容 data = json.loads(html.decode('utf-8'))['cmts']#获得cmts内的内容 # print(data) #loads方法是把json对象转化为python对象 for item in data: tomato=({'date':item['time'].split(' ')[0],'city':item['cityName'], 'score':item['score'],'comment':item['content'], 'nick':item['nick']})#可以帮助忽略index,自动递增 #注意!comment和Nick应该使用utfmd4字符集,因为可能出现表情符号! params = (tomato["date"], tomato["city"], tomato["score"], tomato["comment"], tomato["nick"]) cursors.execute(sql, params) # commit是把查询语句提交到数据库内 db.commit() db.close()
经验:
1.猫眼的网页版只显示极少数热门短评,只有在APP端才能看到所有评论,所以笔者所用的url ='http://m.maoyan.com/mmdb/comments/movie/1235560.json?_v_=yes&offset='+ str(i*15)就是在网上看到别人用的,可以记一下,等到以后学习爬取APP的时候对照
2.offset不应该每次递增1次,因为每页有15条短评,而且第二页跟第一页只有一条短评不一样!刚开始的时候,笔者没有发现这个问题,然后爬取的数据都重复了,之后上网一查才知道还有这种操作,但是改为str(i*15)就可以简单解决这个问题了
3.在mysql中建立表格的时候应该注意,comment和Nick应该长度比较大,特别是comment,而且可能会出现表情,导致程序运行错误((1366, "Incorrect string value: '\xF0\x9F\x8D\xAC\xF0\x9F...' for column 'nick' at row 1")),所以要把comment和Nick的字符集修改为utfmd4,这样就可以把无法识别的表情转换为?