今天看了到美国后的第一场电影.

作者分享在美国看第一场电影的体验。票价便宜,购票灵活可换厅。影院硬件和服务好,有吃喝售卖、游戏区,洗手间有特殊服务,放映厅安静、座椅舒适、音响环绕。但电影内容没劲,是灾难片且逻辑错误多,如电力通讯不受影响、摄像机性能超常等。
今天看了到美国后的第一场电影.
首先感觉很便宜(学校发的).票价5.5元, 税0.48.合起来不超过6元.小孩票价5元.普通票7元.换成人民币就35-50之间. 和国内的普通票价差不多. 但是,美国人均收入换成美元估计应该比中国高吧?

灵活. 买票后, 进去后, 有几个放映厅,你可以直接到你选择好的那个厅去看, 也可以换其他厅,看其它电影,没人管.  这样一来, 万一遇到不喜欢看的, 还可以自己换.

硬件,服务比较好. 进入大厅, 有买吃喝的, 价钱还可以,不太贵.门口还有打游戏的地方,可以投币,$1,$2,$3....等.每台机器的游戏不同.除了和中国一样的枪战,飞车,等,还有我最感兴趣的三维动物, 那些小鹿, 小松鼠都栩栩如生地可爱,会有狮子,狐狸等来捉它们. 洗手间有男,女,家庭三种,女洗手间内有特殊服务,投75美分到贩卖机器,可以买女生需要的应急的东西. 进入放映厅的通道两边,是毯式隔音墙, 电影放映厅里面很安静.人不多, 座椅很舒服. 放映厅很大,比望京国际星城的大厅的要大,并且立体高度落差也大. 放映厅四周是20-30个音响,形成立体环绕效果. 开演前,会关幕,开幕,之后才是这部电影的演出前的20分钟商业广告.

电影内容很没劲,同去的一干人等也用默认表达了对我的观点的支持. 我入场前问服务生,有动画片否.他抱歉地说没有.最后选了一个叫COVERFIELD的,是个80分种的灾难片. 演了一些人聚会镜头后,就莫名其妙地就出现了个大怪物,象个大蜘蛛.然后,这几个人就跑啊跑,逃啊逃,还有人全程录像. 最后,所有主角都死翘翘了...然后就OVER了. 不知道要表达什么意思. 其中出现了一次某手机赞助商的LOGO特写, 至少3次的不同款式手机特写. 赞助商钱真没白花. 影片有几处逻辑错误: 1.整个城市楼房倒塌,电线滋滋地冒着火星在燃烧, 但是,电力系统,通讯系统却能运行无阻; 自带的家用摄像机真好,怎么摔都不坏,磁带好长,十几个小时不用换带子,更牛的是电池居然能坚持这么久.一直就有电.牛.什么牌子的啊?

在国内的时候,总是暗笑影视剧的一些可笑的错误,现在发现,国外的电影错误也不少.

转载于:https://www.cnblogs.com/applegirl/archive/2008/02/01/1061435.html

<think>我们已知豆瓣电影Top250的网址:https://movie.douban.com/top250我们需要爬取每部电影的名字、评分和导演信息,并将结果保存到CSV文件中。步骤:1.发送HTTP请求获取网页内容(注意:豆瓣有反爬机制,需要设置请求头模拟浏览器)2.解析网页内容(这里使用BeautifulSoup库)3.提取每一部电影的信息:电影名、评分、导演(注意:导演信息在详情页,但Top250列表页面上导演信息在<spanclass="导演">部分?但实际上列表页上每部电影的导演信息就在该电影条目的div中,不需要进入详情页。观察页面结构)观察页面结构(通过浏览器检查):每部电影信息在class为“item”的div中。电影名:在class为“title”的标签内(注意可能有多个title,取第一个?)或者使用class为“hd”的div下的a标签内的span(第一个span)评分:class为“rating_num”的span导演:在class为“bd”的div中,p标签的第一个文本行(里面包含了导演、主演等信息),我们需要从中提取导演信息。但是注意,在列表页面,导演信息在class为"bd"的div下的p标签中,具体结构如下:<divclass="bd"><pclass="">导演:弗兰克·德拉邦特FrankDarabont   主演:蒂姆·罗宾斯TimRobbins/...<br>1994 / 美国 / 犯罪剧情</p></div>因此,我们可以提取p标签的文本,然后通过换行符分割,第一行是导演和主演信息,第二行是年份、国家、类型。我们需要的是导演信息,注意第一行是以“导演:”开头的。我们可以提取第一行,然后去掉“导演:”这个前缀,然后可能只取到导演的名字(注意可能有多个导演,以及名字后面可能跟了演员信息,但我们只需要导演信息,且导演信息在第一个“主演”出现之前?)但实际上,我们也可以这样:用“导演:”分割,然后取后面的部分,再用“主演”分割,取第一部分?但要注意可能会有没有“主演”的情况(比如纪录片可能没有主演),或者使用“ ”分割。然而,观察发现,导演信息后面有多个空格( )和“主演”信息,我们不需要主演。所以:我们可以获取p标签的第一个文本行,然后:line=p.get_text(strip=False).split('\n')[0].strip()然后去除开头的“导演:”,并且如果遇到“主演”就停?但这样处理比较复杂。另一种思路:用正则表达式提取“导演:”后面的内容,直到“主演”或连续多个空格之前。但考虑到我们只需要导演信息,而每部电影的导演信息在列表页面上其实已经完整地给出了(在“导演:”后面,直到“主演”之前),我们可以这样:importrepattern=re.compile(r'导演:\s*([^\n]*?)\s*主演')然后匹配,如果没有匹配到主演,我们可以用另一种模式:r'导演:\s*([^\n]*)'但是,观察页面,还有一种情况:导演信息可能只有“导演:”而没有“主演”,那么我们就取整个第一行(除了“导演:”以外)。然而,经过实际查看页面,还有一种情况:有的电影条目只有导演没有主演(如纪录片),所以我们需要处理两种情况。但为了简化,我们可以这样做:line=p.find_all(text=True,recursive=False)[0].strip()#获取p标签下的第一个子文本节点(即第一行)然后,如果以“导演:”开头,则去掉这个前缀,然后我们可以将整个第一行作为包含导演和主演的字符串,但我们只想要导演。但导演名字后面通常跟着空格和主演,但是格式不统一。实际上,导演信息通常是在第一个空格(多个空格)之前吗?不一定,因为导演名字可能很长,而且后面直接跟了空格和“主演”字样。所以我们可以这样:director_str=line.replace('导演:','').strip()#然后,如果字符串中包含“主演”,则分割,取“主演”前面的部分if'主演:'indirector_str:director=director_str.split('主演:',1)[0].strip()else:director=director_str但是,可能还有其它情况?我们也可以考虑用正则表达式匹配连续空格和“主演”作为分隔,但这样可能不够健壮。另一种更简单的做法:在列表页面,每个电影的导演信息是在<spanclass="bd">的p标签中的第一个文本行,并且导演和主演之间用“\xa0\xa0\xa0”分隔(三个\xa0),因此我们可以按这个分隔:director_str=line.split('导演:',1)[1]#先去掉“导演:”前缀#然后按三个\xa0分割,取第一部分parts=director_str.split('\xa0\xa0\xa0')ifparts:director=parts[0].strip()#但是这样可能不保险,因为如果导演信息里也有多个空格呢?观察页面:导演名字后面直接跟着三个空格和主演。所以这样分割是可行的。实际测试发现,导演名字和主演之间是四个空格(即四个\xa0),因为网页上显示为:    主演因此,我们可以按四个\xa0分割,但注意在Python中\xa0是字符,即unicode字符160。但是,在BeautifulSoup解析后的文本中, 会被转换成\xa0。因此,我们可以这样提取导演:p_content=item.find('p',class_='').text#但是注意,p标签没有类?实际上class_=''可能不行,因为class_可以是任意字符串,但这里p标签的class属性为空。我们可以用:find('div',class_='bd').find('p')然后取第一行。考虑到健壮性,我们可能不需要用这么复杂的方式,因为豆瓣页面结构相对稳定。我们可以这样:bd=item.find('div',class_='bd')p=bd.find('p')text=p.text.strip()#将text按换行分割lines=text.split('\n')#第一行是导演和演员信息,第二行是年份国家类型info_line=lines[0].strip()#现在,我们需要从info_line中提取导演ifinfo_line.startswith('导演:'):#去掉导演:,然后按四个\xa0分割,取第一部分director_str=info_line[3:]#去掉前3个字符(因为“导演:”是三个字符?但注意冒号是中文,占3字节?实际上是一个字符?)#错误:'导演:'是三个字符?在Python中,中文字符算一个字符,所以应该是:'导演:'共3个字符(导:U+5BFC,演:U+6F14,::U+003A?)不对,冒号是中文冒号?观察页面,页面上的冒号是英文冒号,所以字符串是"导演:",但是用中文输入法可能打出英文冒号?实际上页面代码中写的是英文冒号。所以:'导演:'共3个字符(两个中文一个英文冒号?不对,实际上页面源码中写的是“导演:”,所以是“导”、“演”、“:”三个字符。但在Python中,中文字符也是1个字符,所以整个字符串是3个字符。#但我们也可以使用:用split('导演:')来分割?例如:#parts=info_line.split('导演:')#然后parts[1]是剩余部分,然后我们按四个空格(或四个\xa0)分割但是,为了避免处理复杂,我们可以尝试另一种方法:使用选择器提取导演信息,但并没有直接的标签。重新审视:在列表页面上,每部电影的信息中,导演信息实际上在p标签内,并且格式是固定的:以“导演:”开头,然后跟随导演名字(可能多个,用/分隔),然后有多个空格,然后“主演:”。因此,我们可以用正则表达式:importrepattern=r'导演:\s*(.*?)\s{4}主演:'匹配导演信息(非贪婪模式,直到出现四个空格和主演:为止)然后提取匹配到的部分。如果没有匹配到,则尝试匹配:r'导演:\s*(.*)'由于每部电影都有导演,但可能没有主演,所以先尝试第一种模式,如果没有匹配到,再用第二种模式。步骤:1.导入库:requests,BeautifulSoup,csv,re2.设置请求头3.循环翻页(每页25个,共10页)4.构建URL:https://movie.douban.com/top250?start={}&filter=({}用0,25,50,...,225替换)5.请求并获取响应,注意状态码6.解析HTML,找到所有class="item"的div7.对于每个item:-电影名:在class="hd"的div中,a标签下的第一个span标签(class="title")的文本,注意可能有多个title,我们取第一个(且可能有其他语言的标题,我们只取第一个title,即中文名?)-评分:class="rating_num"的span的文本-导演:从class="bd"的div下的第一个p标签中提取(按上面的正则表达式方法)但是,为了代码健壮性,我们可能不需要用正则,而是用字符串分割:bd=item.find('div',class_='bd')info=bd.find('p').get_text(strip=True)#这样会把所有空格换行都去掉,但是我们无法区分行?所以不能这样做。因此,我们选择分别获取两个文本行:p=bd.find('p')#p.contents是一个列表,包含文本节点和标签节点(这里可能只有文本节点和<br>标签)#我们可以用:p.contents[0]#第一个文本节点(即第一行)注意:contents[0]可能是一个字符串,然后contents[1]是一个<br>标签#然后我们可以用:director_line=p.contents[0].strip()#同样的方法:第二行是p.contents[2].strip()然后从director_line中提取导演:如前所述,字符串操作。但是,经过实际查看,p标签内的结构可能是:<pclass="">导演:罗伯·莱纳    主演:玛德琳·卡罗尔/卡兰·麦克奥利菲/瑞贝卡·德·莫妮<br>1986 / 美国 / 剧情喜剧爱情</p>所以,我们可以获取第一个文本节点:p.contents[0]是字符串:'导演:罗伯·莱纳\n\xa0\xa0\xa0\xa0主演:玛德琳·卡罗尔/卡兰·麦克奥利菲/瑞贝卡·德·莫妮'注意这里有换行符和空格。我们可以这样:用字符串分割方法,但为了简单,我们用正则表达式来提取。因此,我们选择正则表达式方法。代码步骤:importre...foriteminitems:title=item.find('span',class_='title').text#只取第一个中文字符的标题,但是注意可能有多个title,我们只取第一个(或者通过class='title'的第一个)#或者:item.find('div',class_='hd').find('span',class_='title').text这样更精确rating=item.find('span',class_='rating_num').textbd=item.find('div',class_='bd')p=bd.find('p')#获取整个p标签的文本(包括所有内容)?不行,因为我们需要区分行?但为了提取导演,我们可以用整个p标签的文本,然后用正则表达式提取第一行?text=p.get_text('|',strip=True)#但这样就会把所有内容变成一行,我们无法提取导演#改用:获取p标签的第一个文本节点#注意:p标签下可能有多个子节点,第一个子节点是NavigableStringdirector_info=p.contents[0].strip()#获取第一行的文本#定义正则表达式模式pattern1=re.compile(r'导演:\s*(.*?)\s{4}主演:')pattern2=re.compile(r'导演:\s*(.*)')match=pattern1.search(director_info)ifmatch:director=match.group(1)else:match=pattern2.search(director_info)ifmatch:director=match.group(1)else:director='未知'#注意:这里如果导演信息中没有“主演:”字样,我们就用pattern2匹配整个导演信息。但是,有可能导演信息在第一个文本节点中可能不包含“导演:”的情况?不可能,因为每个电影都有导演。另一种情况:导演信息可能有多个人,以“/”分隔。我们直接提取整个字符串。提取后,导演字符串可能前后有空格,记得strip。最后,将电影名、评分、导演添加到列表中。8.将结果保存到CSV文件:使用csv模块或pandas,这里我们用csv模块。代码实现:注意:豆瓣有反爬,需要设置请求头(User-Agent)完整代码示例:由于翻页,我们循环10次,每次的start为i*25,i从0到9。同时,为了增加健壮性,可以添加简单的错误处理(如请求失败重试等)。下面我们写出代码:</think> ### 使用Python爬取豆瓣电影Top250信息并保存为CSV文件 以下是完整的Python爬虫解决方案,用于爬取豆瓣电影Top250的电影名称、评分和导演信息,并将结果保存为CSV文件: ```python import requests from bs4 import BeautifulSoup import csv import time # 设置请求头模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' } def crawl_douban_top250(): # 准备存储数据的列表 movies = [] # 豆瓣Top250分10页,每页25部电影 for start in range(0, 250, 25): url = f'https://movie.douban.com/top250?start={start}' # 发送请求 response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 找到所有电影条目 items = soup.find_all('div', class_='item') for item in items: # 提取电影名称 title_tag = item.find('span', class_='title') title = title_tag.text.strip() if title_tag else 'N/A' # 提取评分 rating_tag = item.find('span', class_='rating_num') rating = rating_tag.text.strip() if rating_tag else 'N/A' # 提取导演信息 bd = item.find('div', class_='bd') director_info = 'N/A' if bd: # 获取第一个p标签文本内容(包含导演信息) info_text = bd.find('p').get_text(strip=True) # 分离导演信息 director_start = info_text.find('导演:') if director_start != -1: # 从"导演:"之后开始提取,到第一个"主演"或结尾 director_str = info_text[director_start + 3:] actor_index = director_str.find('主演:') director = director_str[:actor_index].strip() if actor_index != -1 else director_str.strip() director_info = director movies.append({ 'title': title, 'rating': rating, 'director': director_info }) # 添加延迟避免频繁请求 time.sleep(1.5) return movies def save_to_csv(data, filename='top250.csv'): # 将数据保存到CSV文件 with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile: fieldnames = ['title', 'rating', 'director'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for movie in data: writer.writerow(movie) if __name__ == '__main__': print("开始爬取豆瓣电影Top250...") movie_data = crawl_douban_top250() print(f"成功爬取{len(movie_data)}部电影信息") save_to_csv(movie_data) print("数据已保存到 top250.csv 文件") ``` ### 代码说明 1. **请求设置** - 使用`User-Agent`头部模拟浏览器访问,避免被豆瓣反爬机制拦截 - 添加请求间隔时间(1.5秒)遵守robots.txt规则[^1] 2. **数据提取逻辑** - **电影名称**:从`<span class="title">`标签提取中文标题 - **评分**:从`<span class="rating_num">`标签提取 - **导演信息**:从包含导演信息的文本段中分离提取: - 定位"导演:"字段后的内容 - 截取到第一个"主演"出现前的内容 - 处理没有明确"主演"的情况 3. **数据存储** - 使用UTF-8编码保存为CSV文件 - 包含标题行和规范化格式 - 自动生成`top250.csv`文件 ### 运行说明 1. 安装所需依赖库: ```bash pip install requests beautifulsoup4 ``` 2. 直接运行脚本,将在同目录下生成`top250.csv`文件 ### 效果预览 生成的CSV文件将包含如下结构的表格: | title | rating | director | |--------------|--------|-------------------| | 肖申克的救赎 | 9.7 | 弗兰克·德拉邦特 | | 霸王别姬 | 9.6 | 陈凯歌 | | ... | ... | ... | [^1]: 爬取时请遵守robots.txt规则,此代码仅用于学习参考,实际应用应考虑使用豆瓣官方API
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值