爬虫综合大作业

作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159

作业要求:

  • 爬虫综合大作业
  1. 选择一个热点或者你感兴趣的主题。
  2. 选择爬取的对象与范围。
  3. 了解爬取对象的限制与约束。
  4. 爬取相应内容。
  5. 做数据分析与文本分析。
  6. 形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。
  7. 文章公开发布。

参考:


32个Python爬虫项目


都是谁在反对996?


Python和Java薪资最高,C#最低!


给《流浪地球》评1星的都是什么心态?


《都挺好》弹幕数据,比剧情还精彩?


爬了自己的微信好友,原来他们是这样的人……

春节人口迁徙大数据报告!

七夕前消费趋势数据

爬了一下天猫上的Bra购买记录,有了一些羞羞哒的发现...

Python做了六百万字的歌词分析,告诉你中国Rapper都在唱些啥

分析了42万字歌词后,终于搞清楚民谣歌手唱什么了

十二星座的真实面目

唐朝诗人之间的关系到底是什么样的?

中国姓氏排行榜

三.爬虫注意事项

1.设置合理的爬取间隔,不会给对方运维人员造成压力,也可以防止程序被迫中止。

  • import time
  • import random
  • time.sleep(random.random()*3)

2.设置合理的user-agent,模拟成真实的浏览器去提取内容。

  1. 首先打开你的浏览器输入:about:version。
  2. 用户代理:
  3. 收集一些比较常用的浏览器的user-agent放到列表里面。
  4. 然后import random,使用随机获取一个user-agent
  5. 定义请求头字典headers={’User-Agen‘:}
  6. 发送request.get时,带上自定义了User-Agen的headers

3.需要登录

发送request.get时,带上自定义了Cookie的headers

headers={’User-Agen‘:  

'Cookie':    }

4.使用代理IP

通过更换IP来达到不断高 效爬取数据的目的。

headers = {

    "User-Agent": "",

}

proxies = {

    "http": " ",

    "https": " ",

}

response = requests.get(url, headers=headers, proxies=proxies)

 1 # 获取数据,根据url获取
 2 def get_data(url):
 3     headers = {
 4 
 5         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
 6     }
 7     req = request.Request(url, headers=headers)
 8     response = request.urlopen(req)
 9     if response.getcode() == 200:
10         return response.read()
11     return None

爬虫主题:分析电影《新喜剧之王》是否有看点

剧情简介:

       大型影视基地,胸怀明星梦的女子如梦(鄂靖文 饰)已经在影视圈摸爬滚打了十多年,却依旧还是籍籍无名的龙套演员。平日里,在片场饱受剧组和其他演员的欺凌嘲笑,回到家则被恨铁不成钢的老爹指责,甚至扬言断绝父女关系。然而如梦一律微笑面对,天大的委屈也藏在心中,死皮赖脸地抓住每一个希望渺茫的机会。在此期间,她结识了热衷于跑龙套的李洋,早已过气却自视甚高的童星马可(王宝强 饰),更彻彻底底看清了自己以及爱情的真相。 
  她是过于平凡的小人物,是一个不该有梦的女孩,是一个直到宇宙灭亡也永远不会得到演戏机会的可悲龙套……

爬取对象:

https://maoyan.com/films/580298

爬取代码(本次爬取了评论中用户ID、用户名、用户所在城市、用户评论、评分分数、评论时间。):

 1 def get_data(url):
 2     headers = {
 3         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
 4     }
 5     req = request.Request(url, headers=headers)
 6     response = request.urlopen(req)
 7     if response.getcode() == 200:
 8         return response.read()
 9     return None
10 
11 #处理接口返回数据
12 
13 def parse_data(html):
14     data = json.loads(html)['cmts']  # 将str转换为json
15     for item in data:
16         comment = {
17             'id': item['id'],
18             'nickName': item['nickName'] if 'nickName' in item else '',  # 处理nickName不存在的情况
19             'cityName': item['cityName'] if 'cityName' in item else '',  # 处理cityName不存在的情况
20             'content': item['content'].replace('
', ' ', 10),  # 处理评论内容换行的情况
21             'score': item['score'],
22             'startTime': item['startTime']if 'startTime' in item else ''
23         }
24         comments.append(comment)
25     return comments
26 
27 if __name__ == '__main__':
28     for d in range(10):
29         for i in range(40):
30             comments = []
31             html = get_data('http://m.maoyan.com/mmdb/comments/movie/580298.json?_v_=yes&offset={}&startTime=2019-03-{}%2022%3A25%3A03'.format(i*15, d))
32             comments = parse_data(html)
33             for item in comments:
34                 with open('film_criticisms.txt', 'a', encoding='utf-8') as f:
35                     f.write(str(item['id']) + '	' + item['cityName'] + '	' + item['nickName'] + '	' + item['content'] + '	' + str(item['score']) + '	' +
36                             item['startTime'] + '
')
37             print('爬取第{}页'.format(i))
38             print(comments)

爬取结果:

数据分析:

获取用户评论中热词 

 1 comments = []
 2 with open('film_criticisms.txt', mode='r', encoding='utf-8') as f:
 3     rows = f.readlines()
 4     for row in rows:
 5         try:
 6             comment = row.split('	')[3]
 7             if comment != '':
 8                 comments.append(comment)
 9         except:# 预防出现list[index]的index超出范围的情况
10             print('这一条有误:'+ comment)
11             continue
12 
13 
14 
15 
16 
17 
18 pl = ' '.join(comments)
19 print(' '.join(comments))
20 
21 ci = ['', ' ', '我们', '知道', '看到', '自己', '起来', '什么', '他们', '一个', '看着', '没有', '看看', '就是', '怎么', '还是', '这么', '觉得', '电影']
22 
23 for c in ci:
24         myText = pl.replace(c, "")
25 
26 '''分割出词汇'''
27 words = list(jieba.cut(myText))
28 wordDict = {}
29 
30 '''统计频率次数'''
31 wordSet = set(words)
32 for w in wordSet:
33     if len(w) > 1:
34         wordDict[w] = words.count(w)
35 
36 '''排序'''
37 wordList = list(wordDict.items())
38 wordList.sort(key=lambda x: x[1], reverse=True)
39 
40 '''输出top20'''
41 for i in range(20):
42     print(wordList[i])

结果如下:

 

生成词云(由于无法导入imread包,因此我将数据放至wordart描绘词云):

 1 import matplotlib.pyplot as plt
 2 from wordcloud import WordCloud
 3 from scipy.misc import imread
 4 
 5 
 6 wc =WordCloud(background_color="white", mask=imread('xiju.jpg'), max_words=2000,font_path="C:WindowsFontssimkai.ttf",
 7               max_font_size=60, random_state=30)
 8 myWord = wc.generate(pl)
 9 wc.to_file('result.jpg')
10 plt.imshow(myWord)
11 plt.axis("off")
12 plt.show()

词云生成地址:https://wordart.com/create

词云如下:

                        原图:                                         词云显示图:

  

完整代码:

总结:

  • 《新喜剧之王》极具周星驰以往所释演的角色的风格,主角从一个不起眼、被欺负、被凌辱的小人物到实现理想的褪变。但与以往又有所不同,片中每次引发我们开怀大笑的背后,隐藏着一个又一个的辛酸的真实故事。
  • 这部片把社会的丑恶拼凑成一盘菜,拍的太真实,没有了以前那种天马行空的感觉,搞笑也没那么多,更多的是在表达小人物的艰辛,跟全世界的人都看不起你,打击你的时候,只有你的父母是真正关心你的人。
  • 希望观影的观众能够真正去理解这一部电影要解释的内容,而非一味的寻找笑点。
原文地址:https://www.cnblogs.com/Aliuyu/p/10805214.html