很多朋友对于Python电影爬取详细教程:掌握必备技能,轻松入门和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
本文知识点:Requsts请求库的使用、两大解析库beautiful+lxml的使用、正则表达式、xpath、css选择器的使用
1. 为什么要抓取这个页面?
我很懒,不想一页一页地看100部电影的介绍,而是想一页一页地浏览整页内容(比如在excel表格中);
想了解更多一些有趣的信息,比如:哪部电影的评分最高?哪位演员的作品最多?哪个国家上榜的电影最多?哪一年上榜的电影最多?这些信息在网络上直接获取并不容易,所以需要爬虫。
2. 爬虫目标
从网页中提取电影标题、封面图片、排名、评分、演员、发行国家/地区、评分等信息,并保存为csv 文本文件。
根据爬取结果进行简单的可视化分析。
平台:windows7+SublimeText3
3. 爬行步骤
3.1.网站URL分析
首先打开猫眼Top100的网址:http://maoyan.com/board/4?offset=0。页面非常简单,包含的信息就是上面提到的爬虫目标。将页面向下滚动到底部,点击第2页,可以看到URL变为:http://maoyan.com/board/4?offset=10。因此,我们可以推断出URL的变化规律:offset代表偏移量,10代表一页上电影的偏移量,即:第一页电影是从0-10,第二页电影是11-20 点。因此,要获取全部100部电影,只需要构造10个URL,然后依次获取网页内容,然后使用不同的方法提取所需的内容。
接下来,使用requests 方法获取第一页。
3.2.请求获取主页数据
首先定义一个获取单个页面的函数:get_one_page(),传入url参数。
1def get_one_page(url):
2 尝试:
3 个标头={
4 "用户代理": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,如Gecko) Chrome/66.0.3359.181 Safari/537.36"}
5 # 不加header就无法抓取
6 响应=requests.get(url, headers=headers)
7 如果响应.status_code==200:
8 返回response.text
9 其他:
10 返回无
11 除RequestException:
12 返回无
13 #try- except 语句捕获异常
接下来在main() 函数中设置url。
1def main():
2 url="http://maoyan.com/board/4?offset=0"
3 html=get_one_page(url)
4 打印(html)
5
6
7if __name__=="__main__":
8 主要()
运行上面的程序后,就会爬取首页的源代码。如下图:
接下来,我们需要从整个网页中提取出几段我们需要的内容。使用的方法就是上面提到的四种方法,下面分别说明。
3.3. 4 内容分析与提取方法
3.3.1.正则表达式提取
第一种是使用正则表达式提取。
什么是正则表达式?下面这一系列看似杂乱的符号就是正则表达式的语法。
1".*?板索引.*?(d+).*?src="(.*?)".*?名称"(.*?).*?"
它是一个强大的字符串处理工具。它们被称为正则表达式,因为它们识别正则字符串。可以这样定义:“如果你给我的字符串符合规则,我就返回它”; “如果字符串不符合规则,我会忽略它。”通过请求捕获的网页是一堆字符串,可以通过这些字符串来提取我们想要的内容。
如果你还不知道,可以参考下面的教程:
http://www.runoob.com/regexp/regexp-syntax.htmlhttps://www.w3cschool.cn/regexp/zoxa1pq7.html
接下来,开始提取关键内容。在网页上右键-勾选-网络选项,选择左侧第一个文件,导航到电影信息对应的位置,如下图:
可以看到dd节点里有每部电影的相关信息。所以你可以利用正则性从这个节点中提取。
首先要提取的内容是电影的排名。它位于class="board-index" 的i 节点内。将不需要提取的内容替换为“.*?”,将需要提取的数字排名括在()中,()内的数字表示为(d+)。正则表达式可以写成:
1".*?板索引.*?(d+)"
接下来,第二个要提取的是封面图像。图像URL 位于img 节点的"src" 属性中。正则表达式可以写成:
1"src="(.*?)".*?"
第一个和第二个正则表达式之间的代码是不需要的,应该用“.*?”替换,因此这两部分加起来是:
1".*?板索引.*?(d+).*?src="(.*?)"
同样的,你可以使用正则正则表达式来记下主演角色、上映时间、收视率等,完整的正则表达式如下:
1".*?板索引.*?(d+).*?src="(.*?)".*?名称"(.*?).*?star"(.*?).*?发布时间"(。*?)(。*?)。*?分数"(。*?)。*?"
正则表达式写好后,就可以定义一个页面解析提取方法:parse_one_page()来提取内容:
1def parse_one_page(html):
2 模式=重新编译(
3 ".*?板索引.*?(d+).*?src="(.*?)".*?名称"(.*?).*?star"(.*?).*?发布时间"(.*?)(.*?).*?分数"(.*?).*?", re.S)
4 # re.S 表示匹配任意字符。如果不添加,则无法匹配换行符。
5 项=re.findall(pattern, html)
6 # 打印(项目)
items: 中的项目为7
8 产量{
9 "索引": 项[0],
10 "thumb": get_thumb(item[1]), # 定义get_thumb()方法来进一步处理URL
11 "名称": 项[2],
12 "星": item[3].strip()[3:],
13 # "时间": item[4].strip()[5:],
14 #使用两种方法分别提取时间上的日期和地区。
15 "时间": get_release_time(item[4].strip()[5:]),
16 "区域": get_release_area(item[4].strip()[5:]),
17 "分数": item[5].strip() + item[6].strip()
18 # 分数由两部分组成:整数+小数
19}
Tips:re.S:匹配任何字符。如果不添加,则无法匹配换行符; Yield:使用yield的好处是,作为生成器,可以遍历、迭代,将数据整理成字典,输出结果很漂亮。具体使用请参考:https://blog.csdn.net/zhangpinghao/article/details/18716275;strip(): 用于删除字符串中的空格。
为了方便提取内容,上面的程序定义了三个方法:get_thumb()、get_release_time()和get_release_area():
1# 获取封面图片
2def get_thumb(url):
3 模式=re.compile(r"(.*?)@.*?")
4 拇指=re.search(模式, url)
5 返回thumb.group(1)
6# http://p0.meituan.net/movie/5420be40e3b755ffe04779b9b199e935256906.jpg@160w_220h_1e_1c
7# 删除@160w_220h_1e_1c以获取大图
8
9
10# 提取释放时间函数
11def get_release_time(数据):
12 模式=re.compile(r"(.*?)((|$)")
13 项=re.search(模式, 数据)
14 如果项目为None:
15 返回“未知”
16 return items.group(1) # 返回第一个匹配的括号(.*?)中的结果,即时间
17 号
18
19# 提取国家/地区函数
20def get_release_area(数据):
21 模式=re.compile(r".*((.*))")
22 # $表示匹配一行字符串的结尾,这里是(.*?); (|$,表示匹配字符串包含(,或者只匹配(.*?)
23 项=re.search(模式, 数据)
24 如果项目为None:
25 返回“未知”
26 项退货.组(1)
Tips:"r":在正则表达式前添加"r"是告诉编译器这个字符串是原始字符串,不要改变它。字符串使用正则表达式时,最好在前面加上‘r’; "|"常规"|"表示or","": ***正则""表示or",""表示匹配一行字符串的结尾;group(1):表示返回搜索匹配的第一个括号内的结果,即(.*?),groupup()返回所有结果2013-12-18(,group(1)返回"(".
接下来修改main()函数,输出爬取的内容:
1def main():
2 url="http://maoyan.com/board/4?offset=0"
3 html=get_one_page(url)
4
5 对于parse_one_page(html): 中的项目
6 打印(项目)
7
8
9if __name__=="__main__":
10 主函数()
Tips:if_name_=="_main_":直接运行.py文件时,会运行if_name_=="_main_"下的代码块;当.py文件作为模块导入时,if_name_=="_main_"下面的代码块不会被执行。参考:https://blog.csdn.net/yjk13703623757/article/details/77918633。
运行程序即可成功提取所需内容。结果如下:
1 {"索引":"1","大拇指":"http://p1.meituan.net/movie/20803F59291C47e116C11963ce019e68711.jpg"吉","明星":"张国荣、张丰毅、巩俐","时间":" 1993-01-01", "地区": "中国香港", "得分": "9.6"}
2{"index": "2", "thumb": "http://p0.meituan.net/movie/54617769d96807e4d81804284ffe2a27239007.jpg", "name": "罗马假日", "star": "格里高利·派克, 奥地利黛丽埃迪·普伯恩艾伯特", "时间": "1953-09-02", "地区": "美国", "得分": "9.1"}
3{"index": "3", "thumb": "http://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg", "name": "肖申克的救赎", "star": "蒂姆·罗宾斯, 摩根·弗里曼, 鲍勃冈顿", "时间": "1994-10-14", "地区": "美国", "得分": "9.5"}
4{"index": "4", "thumb": "http://p0.meituan.net/movie/e55ec5d18ccc83ba7db68caae54f165f95924.jpg", "name": "这个杀手不太冷", "star": "让·雷诺、加里·奥德曼、娜塔莉·波特曼", "时间": "1994-09-14", "地区": "法国", "得分": "9.5"}
5{"index": "5", "thumb": "http://p1.meituan.net/movie/f5a924f362f050881f2b8f82e852747c118515.jpg", "name": "教父", "star": "马龙·白兰度、阿尔·帕斯詹姆斯·卡恩, "时间": "1972-03-24", "地区": "美国", "分数": "9.3"}
6
7.
8}
9[1.9秒完成]
以上是第一种提取方法。如果您不习惯正则表达式复杂的语法,可以尝试下面的第二种方法。
3.3.2. lxml结合xpath提取
该方法需要使用lxml这个强大的解析工具,配合xpath语法及其路径选择表达式来高效地提取所需的内容。 lxml包是第三方包,需要自行安装。如果你不熟悉xpath的语法,可以参考以下教程:
http://www.w3school.com.cn/xpath/xpath_syntax.asp
1
2
3
4
5
6
7
8
9
更新于2018年8月18日
10
榜单规则:猫眼影库前100部经典影片按照评分及评分人数从高到低排序,每天上午10点更新。相关数据来自“猫眼电影库”。
11
12
131
14
17 号
18
19
20
21
霸王别姬
22
23 主演:张国荣、张丰毅、巩俐
24
25
发布时间: 1993-01-01 (中国香港)
26
27
9.6
28
29
30
31
32
33
34
根据截取的HTML网页部分,我们首先提取第一部电影的排名信息。有两种方法。
第一种:直接复制。
右键-复制-复制Xpath,得到的xpath路径为://*[@id="app"]/div/div/div[1]/dl/dd[1]/i,以便解压全部页面信息的排名需要进一步修改为://*[@id="app"]/div/div/div[1]/dl/dd/i/text()。如果想要更精简,可以省略中间部分,将绝对路径"/"替换为相对路径"//",最后进一步修改为: //*[@id="app"]//div//dd/i/text()。
第二种:观察网页结构,自己写。
首先注意id=app的div节点,因为id在整个网页结构中是唯一的,不会有第二个相同的。因此,你可以用这个div节点作为xpath语法的起点,然后往下看就可以看到3级div节点。可以省略,写成://div,再往下是两个并行的p节点、dl节点、dd节点以及最后的i节点文本。中间可以随意省略,只要路径能选择唯一的文本值‘1’即可,例如省略p和dl节点,只保留后面的节点。这样,完整路径就可以是: //*[@id="app"]//div//dd/i/text(),与上面的公式相同。
根据以上思路,可以编写其他内容的xpath路径。观察路径的前半部分://*[@id="app"]//div//dd 是一样的,后面就不一样了。因此,为了简化代码,将路径的第一部分赋值给变量items ,最终提取的代码如下:
1#2 使用lxml结合xpath提取内容
2def parse_one_page2(html):
3 解析=etree.HTML(html)
4 项=parse.xpath("//*[@id="app"]//div//dd")
5 # 完整的为//*[@id="app"]/div/div/div[1]/dl/dd
6 # 打印(类型(项目))
7 # * 代表匹配所有节点,@代表属性
8 # 第一部电影是dd[1],如果要提取页面上所有电影,去掉[1]
9 # xpath://*[@id="app"]/div/div/div[1]/dl/dd[1]
items: 中的项目为10
11 产量{
12 "索引": item.xpath("./i/text()")[0],
13 #./i/text()前面的点表示从items节点开始
14 #/text()提取文本
15 "thumb": get_thumb(str(item.xpath("./a/img[2]/@src")[0].strip())),
16 # "thumb": 为了在网络中定位,元素中会写@src而不是@src,所以会报列表索引超出范围错误。
17 "名称": item.xpath("./a/@title")[0],
18 "星": item.xpath(".//p[@class="星"]/text()")[0].strip(),
19 "时间": get_release_time(item.xpath(
20 ".//p[@class="releasetime"]/text()")[0].strip()[5:]),
21 "区域": get_release_area(item.xpath(
22 ".//p[@class="releasetime"]/text()")[0].strip()[5:]),
23 "分数" : item.xpath(".//p[@class="分数"]/i[1]/text()")[0] +
24 item.xpath(".//p[@class="score"]/i[2]/text()")[0]
25}
Tips:[0]:[0]是在卡片中的Position后面添加的,而不是Elements后面添加的,否则无法提取相关内容; class属性:p[@class="star"]/text()表示提取class属性为"star"的p节点的文本值;提取属性值:img[2]/@src":提取img节点的src属性值。无需在属性值后添加“/text()”。
运行程序即可成功提取所需内容。结果与第一种方法相同。
以上是第二种提取方法。如果您不习惯xpath语法,可以尝试下面的第三种方法。
3.3.3.美丽的汤+ css 选择器
Beautiful Soup 和lxml 一样,是一个非常强大的python 解析库,可以非常高效地从HTML 或XML 文件中提取内容。其使用方法请参考以下教程:
https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
CSS 选择器选择是一种用于选择需要样式化的元素的模式。利用它的语法还可以快速定位到需要的节点,然后提取相应的内容。使用方法请参考以下教程:
http://www.w3school.com.cn/cssref/css_selectors.asp
我们用这个方法来提取:
1# 3 使用beautifulsoup + css 选择器提取
2def parse_one_page3(html):
3 汤=BeautifulSoup(html, "lxml")
4 #打印(内容)
5 # print(类型(内容))
6 # 打印("----------------")
7 项=范围(10)
items: 中的项目为8
9 产量{
10
11 "index": soup.select("dd i.board-index")[item].string,
12 # iclass节点完全是"board-index board-index-1",只写board-index
13 "thumb": get_thumb(soup.select("a img.board-img")[item]["src"]),
14 # 表示a节点下class=board-img的img节点。注意浏览器中的eelement是src节点,network是src节点。您必须使用它才能正确返回值。
15
16 "name": soup.select(".name a")[item].string,
17 "星": soup.select(".star")[item].string.strip()[3:],
18 "时间": get_release_time(soup.select(".releasetime")[item].string.strip()[5:]),
19 "区域": get_release_area(soup.select(".releasetime")[item].string.strip()[5:]),
20 "分数": soup.select(".integer")[item].string + soup.select(".fraction")[item].string
21
22 }
运行上面的程序,结果与第一种方法相同。
3.3.4. Beautiful Soup + find_all 函数提取
Beautifulsoup除了与css选择器匹配之外,还可以使用自带的find_all函数直接提取。
find_all,顾名思义,就是查询所有符合条件的元素。你可以向它传递一些属性或文本来获取满足条件的元素。它非常强大。
其API如下:
1find_all(名称、属性、递归、文本、**kwargs)
常用的语法规则如下: soup.find_all(name="ul"):查找所有ul节点,ul节点还可以嵌套; li.string和li.get_text():都获取li节点的文本,但建议使用后者; soup.find_all(attrs={"id": "list-1"})):传入attrs参数。参数类型为字典类型,表示查询id为list-1的节点;常用的属性如id、class等,可以省略attrs,使用更简洁的形式,例如:soup.find_all(id="list-1") soup.find_all(class_="element")
根据上面的通用语法,可以提取出网页中需要的内容:
1def parse_one_page4(html):
2 汤=BeautifulSoup(html,"lxml")
3 项=范围(1
0) 4 for item in items: 5 yield{ 6 7 "index": soup.find_all(class_="board-index")[item].string, 8 "thumb": soup.find_all(class_ = "board-img")[item].attrs["src"], 9 # 用.get("src")获取图片src链接,或者用attrs["src"] 10 "name": soup.find_all(name = "p",attrs = {"class" : "name"})[item].string, 11 "star": soup.find_all(name = "p",attrs = {"class":"star"})[item].string.strip()[3:], 12 "time": get_release_time(soup.find_all(class_ ="releasetime")[item].string.strip()[5:]), 13 "area": get_release_time(soup.find_all(class_ ="releasetime")[item].string.strip()[5:]), 14 "score":soup.find_all(name = "i",attrs = {"class":"integer"})[item].string.strip() + soup.find_all(name = "i",attrs = {"class":"fraction"})[item].string.strip() 15 16 } 以上就是4种不同的内容提取方法。 3.4. 数据存储 上述输出的结果为字典格式,可利用csv包的DictWriter函数将字典格式数据存储到csv文件中。 1# 数据存储到csv 2def write_to_file3(item): 3 with open("猫眼top100.csv", "a", encoding="utf_8_sig",newline="") as f: 4 # "a"为追加模式(添加) 5 # utf_8_sig格式导出csv不乱码 6 fieldnames = ["index", "thumb", "name", "star", "time", "area", "score"] 7 w = csv.DictWriter(f,fieldnames = fieldnames) 8 # w.writeheader() 9 w.writerow(item) 然后修改一下main()方法: 1def main(): 2 url = "http://maoyan.com/board/4?offset=0" 3 html = get_one_page(url) 4 5 for item in parse_one_page(html): 6 # print(item) 7 write_to_csv(item) 8 9 10if __name__ == "__main__": 11 main() 结果如下图: 再将封面的图片下载下来: 1def download_thumb(name, url,num): 2 try: 3 response = requests.get(url) 4 with open("封面图/" + name + ".jpg", "wb") as f: 5 f.write(response.content) 6 print("第%s部电影封面下载完毕" %num) 7 print("------") 8 except RequestException as e: 9 print(e) 10 pass 11 # 不能是w,否则会报错,因为图片是二进制数据所以要用wb 3.5. 分页爬取 上面完成了一页电影数据的提取,接下来还需提取剩下9页共90部电影的数据。对网址进行遍历,给网址传入一个offset参数即可,修改如下: 1def main(offset): 2 url = "http://maoyan.com/board/4?offset=" + str(offset) 3 html = get_one_page(url) 4 5 for item in parse_one_page(html): 6 # print(item) 7 write_to_csv(item) 8 9 10if __name__ == "__main__": 11 for i in range(10): 12 main(offset = i*10) 这样就完成了所有电影的爬取。结果如下: 4. 可视化分析 俗话说“文不如表,表不如图”。下面根据excel的数据结果,进行简单的数据可视化分析,并用图表呈现。 4.1. 电影评分最高top10 首先,想看一看评分最高的前10部电影是哪些? 程序如下: 1import pandas as pd 2import matplotlib.pyplot as plt 3import pylab as pl #用于修改x轴坐标 4 5plt.style.use("ggplot") #默认绘图风格很难看,替换为好看的ggplot风格 6fig = plt.figure(figsize=(8,5)) #设置图片大小 7colors1 = "#6D6D6D" #设置图表title、text标注的颜色 8 9columns = ["index", "thumb", "name", "star", "time", "area", "score"] #设置表头 10df = pd.read_csv("maoyan_top100.csv",encoding = "utf-8",header = None,names =columns,index_col = "index") #打开表格 11# index_col = "index" 将索引设为index 12 13df_score = df.sort_values("score",ascending = False) #按得分降序排列 14 15name1 = df_score.name[:10] #x轴坐标 16score1 = df_score.score[:10] #y轴坐标 17plt.bar(range(10),score1,tick_label = name1) #绘制条形图,用range()能搞保持x轴正确顺序 18plt.ylim ((9,9.8)) #设置纵坐标轴范围 19plt.title("电影评分最高top10",color = colors1) #标题 20plt.xlabel("电影名称") #x轴标题 21plt.ylabel("评分") #y轴标题 22 23# 为每个条形图添加数值标签 24for x,y in enumerate(list(score1)): 25 plt.text(x,y+0.01,"%s" %round(y,1),ha = "center",color = colors1) 26 27pl.xticks(rotation=270) #x轴名称太长发生重叠,旋转为纵向显示 28plt.tight_layout() #自动控制空白边缘,以全部显示x轴名称 29# plt.savefig("电影评分最高top10.png") #保存图片 30plt.show() 结果如下图: 可以看到:排名最高的分别是两部国产片"霸王别姬"和"大话西游",其他还包括"肖申克的救赎"、"教父"等。 嗯,还好基本上都看过。 4.2. 各国家的电影数量比较 然后,想看看100部电影都是来自哪些国家? 程序如下: 1area_count = df.groupby(by = "area").area.count().sort_values(ascending = False) 2 3# 绘图方法1 4area_count.plot.bar(color = "#4652B1") #设置为蓝紫色 5pl.xticks(rotation=0) #x轴名称太长重叠,旋转为纵向 6 7 8# 绘图方法2 9# plt.bar(range(11),area_count.values,tick_label = area_count.index) 10 11for x,y in enumerate(list(area_count.values)): 12 plt.text(x,y+0.5,"%s" %round(y,1),ha = "center",color = colors1) 13plt.title("各国/地区电影数量排名",color = colors1) 14plt.xlabel("国家/地区") 15plt.ylabel("数量(部)") 16plt.show() 17# plt.savefig("各国(地区)电影数量排名.png") 结果如下图: 可以看到,除去网站自身没有显示国家的电影以外,上榜电影被10个国家/地区"承包"了。其中,美国以30部电影的绝对优势占据第1名,其次是8部的日本,韩国第3,居然有7部上榜。 不得不说的是香港有5部,而内地一部都没有。。。 4.3. 电影作品数量集中的年份 接下来站在漫长的百年电影史的时间角度上,分析一下哪些年份"贡献了"最多的电影数量,也可以说是"电影大年"。 1# 从日期中提取年份 2df["year"] = df["time"].map(lambda x:x.split("/")[0]) 3# print(df.info()) 4# print(df.head()) 5 6# 统计各年上映的电影数量 7grouped_year = df.groupby("year") 8grouped_year_amount = grouped_year.year.count() 9top_year = grouped_year_amount.sort_values(ascending = False) 10 11 12# 绘图 13top_year.plot(kind = "bar",color = "orangered") #颜色设置为橙红色 14for x,y in enumerate(list(top_year.values)): 15 plt.text(x,y+0.1,"%s" %round(y,1),ha = "center",color = colors1) 16plt.title("电影数量年份排名",color = colors1) 17plt.xlabel("年份(年)") 18plt.ylabel("数量(部)") 19 20plt.tight_layout() 21# plt.savefig("电影数量年份排名.png") 22 23plt.show() 结果如下图: 可以看到,100部电影来自37个年份。其中2011年上榜电影数量最多,达到9部;其次是前一年的7部。回忆一下,那会儿正是上大学的头两年,可怎么感觉除了阿凡达之外,没有什么其他有印象的电影了。。。 另外,网上传的号称"电影史奇迹年"的1994年仅排名第6。这让我进一步对猫眼榜单的权威性产生了质疑。 再往后看,发现遥远的1939和1940年也有电影上榜。那会儿应该还是黑白电影时代吧,看来电影的口碑好坏跟外在的技术没有绝对的关系,质量才是王道。 4.3.1. 拥有电影作品数量最多的演员 最后,看看前100部电影中哪些演员的作品数量最多。 程序如下: 1#表中的演员位于同一列,用逗号分割符隔开。需进行分割然后全部提取到list中 2starlist = [] 3star_total = df.star 4for i in df.star.str.replace(" ","").str.split(","): 5 starlist.extend(i) 6# print(starlist) 7# print(len(starlist)) 8 9# set去除重复的演员名 10starall = set(starlist) 11# print(starall) 12# print(len(starall)) 13 14starall2 = {} 15for i in starall: 16 if starlist.count(i)>1: 17 # 筛选出电影数量超过1部的演员 18 starall2[i] = starlist.count(i) 19 20starall2 = sorted(starall2.items(),key = lambda starlist:starlist[1] ,reverse = True) 21 22starall2 = dict(starall2[:10]) #将元组转为字典格式 23 24# 绘图 25x_star = list(starall2.keys()) #x轴坐标 26y_star = list(starall2.values()) #y轴坐标 27 28plt.bar(range(10),y_star,tick_label = x_star) 29pl.xticks(rotation = 270) 30for x,y in enumerate(y_star): 31 plt.text(x,y+0.1,"%s" %round(y,1),ha = "center",color = colors1) 32 33plt.title("演员电影作品数量排名",color = colors1) 34plt.xlabel("演员") 35plt.ylabel("数量(部)") 36plt.tight_layout() 37plt.show() 38# plt.savefig("演员电影作品数量排名.png") 结果如下图: 张国荣排在了第一位,这是之前没有猜到的。其次是梁朝伟和星爷,再之后是布拉德·皮特。惊奇地发现,前十名影星中,香港影星居然占了6位。有点严重怀疑这是不是香港版的top100电影。。。 对张国荣以7部影片的巨大优势雄霸榜单第一位感到好奇,想看看是哪7部电影。 1df["star1"] = df["star"].map(lambda x:x.split(",")[0]) #提取1号演员 2df["star2"] = df["star"].map(lambda x:x.split(",")[1]) #提取2号演员 3star_most = df[(df.star1 == "张国荣") | (df.star2 == "张国荣")][["star","name"]].reset_index("index") 4# |表示两个条件或查询,之后重置索引 5print(star_most) 可以看到包括排名第1的"霸王别姬"、第17名的"春光乍泄"、第27名的"射雕英雄传之东成西就"等。 突然发现,好像只看过"英雄本色"。。。有时间,去看看他其他的作品。 1 index star name 20 1 张国荣,张丰毅,巩俐 霸王别姬 31 17 张国荣,梁朝伟,张震 春光乍泄 42 27 张国荣,梁朝伟,张学友 射雕英雄传之东成西就 53 37 张国荣,梁朝伟,刘嘉玲 东邪西毒 64 70 张国荣,王祖贤,午马 倩女幽魂 75 99 张国荣,张曼玉,刘德华 阿飞正传关于Python电影爬取详细教程:掌握必备技能,轻松入门,的介绍到此结束,希望对大家有所帮助。
【Python电影爬取详细教程:掌握必备技能,轻松入门】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
endlich ein richtig gutes Tutorial zum Thema Python!
有18位网友表示赞同!
Da bin ich ja total gespannt! Filme sind meine große Leidenschaft und jetzt auch noch mit Python!
有17位网友表示赞同!
Super, ich suche schon ewig nach einem klaren und umfangreichen Tutorial für dieses Thema.
有8位网友表示赞同!
Schau mal, vielleicht lerne ich endlich, wie man richtig Filme scrappen kann.
有16位网友表示赞同!
Ist das wirklich der "ultimative" Leitfaden? Dann unbedingt drauf klopfen!
有14位网友表示赞同!
Ich bin kein Python-Profi, aber dieses Tutorial klingt mega vielversprechend für Anfänger.
有6位网友表示赞同!
Witzig! Den Titel kann ich gut unterschreiben. Zeit, endlich mal in die Tiefe zu tauchen und alles zu lernen!
有9位网友表示赞同!
Klingt super spannend, Filme sind immer ein beliebtes Thema zum Scraping.
有17位网友表示赞同!
Hoffentlich erklärt es auch das Besondere bei Film-Datenextraktion!
有20位网友表示赞同!
Ich freue mich schon darauf, dieses Tutorial zu starten und mein Wissen im Bereich Python und Filmprogrammierung zu erweitern!
有18位网友表示赞同!
Endlich ein Tutorial, welches sich nicht nur um die Basics kümmert, sondern wirklich ins Detail geht.
有10位网友表示赞同!
Wenn er tatsächlich "am besten ist", dann habe ich meinen Traumleitfaden gefunden!
有14位网友表示赞同!
Ich bin echt gespannt auf den Inhalt! Vielleicht kann ich endlich selbst meine Lieblingsfilme analysieren.
有16位网友表示赞同!
Python und Filme, eine schöne Kombination. Das könnte wirklich Spaß machen!
有11位网友表示赞同!
Super für alle, die Film-Daten gewinnen wollen, ob für Analyse oder Unterhaltungsgründe.
有12位网友表示赞同!
Man muss den Autoren Respekt entgegenbringen! Ist das wirklich alles im Tutorial dabei?
有17位网友表示赞同!
Vielleicht kann ich auch mithilfe dieses Tutorials meinen eigenen Filmprogramm entwickeln.
有10位网友表示赞同!
Ich bin Anfänger in Python. Hoffentlich ist es gut verständlich!
有5位网友表示赞同!
Eine neue Möglichkeit, mehr über Filme zu verstehen - und das mit der Macht des Programmierens!
有5位网友表示赞同!