要求:爬取豆瓣电影 TOP 250(https://movie.douban.com/top250)的电影信息,如:[‘排名’, ‘电影名称’, ‘电影信息’, ‘评分’, ‘评价人数’, ‘推荐语’],并把这些信息保存在csv文件中。
文章目录
一、分析
1、爬取的网页为https://movie.douban.com/top250
2、具体的页面:
3、审查元素(每个电影的所有信息都存放在item中)
4、需要提取的信息(都在item下的元素中):
[‘排名’, ‘电影名称’, ‘电影信息’, ‘评分’, ‘评价人数’, ‘推荐语’]
5、需要用到BeautifulSoup库,进行元素的定位于提取
二、爬取一页具体操作
1、导入必要的库与请求头
from bs4 import BeautifulSoup
import requests
import re
headers = { # headers就是一个请求头
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
2、请求豆瓣页面
url = 'https://movie.douban.com/top250'
# 获取相应对象
response = requests.get(url, headers=headers)
3、把源码放在bs4里面
# 创建bs4对象
soup = BeautifulSoup(response.text, 'html.parser')
4、解析页面,获取数据
(通过BeautifulSoup定位需要的元素并提取相应的内容,修改为合适的格式)
item_list = soup.find_all('div', attrs={"class": "item"})
for item in item_list:
# 获取排行
pic = item.find('div', attrs={"class": "pic"}).text # 获取排名
# 获取电影名称
title = item.find('div', attrs={'class': 'hd'}).find('a').text # 获取电影名称
title = title.split('/')
name = ''
for i in title:
i = i.replace('\n', '').replace('\xa0', '')
i = i.strip()
name += i + '/'
# print('名字是:',name[:-1])
# 获取导演信息
p_list = item.find('div', attrs={"class": "bd"}).findAll('p')
daoyan = p_list[0].text.replace('\n', '').replace('\xa0', '').strip()
daoyan = re.sub(' {5,}', '', daoyan)
# 获取评分和评价人数
star = item.find('div', attrs={"class": "star"}).text.split() # 列表返回:1、分数2、评价人数
# 获取推荐语
quote = item.find('p', attrs={'class': 'quote'})
if quote:
quote = quote.text.strip()
5、输出并查看内容
print(pic, name[:-1], daoyan, star[0], star[1], quote)
结果:
需要的信息都已经提取出来了
三、完整代码
1、数据只有前25条,需要实现翻页
第二页:https://movie.douban.com/top250?start=25&filter=
第三页:https://movie.douban.com/top250?start=50&filter=
由此可见第一页可为https://movie.douban.com/top250?start=0&filter=
2、把提取的信息存在csv文档中
完整代码:
from bs4 import BeautifulSoup
import requests
import re
import csv
import time
file = open('豆瓣250.csv','w',encoding='utf-8',newline='')
csv_file = csv.writer(file)
csv_file.writerow(['排名','电影名称','电影信息','评分','评价人数','推荐语'])
url1='https://movie.douban.com/top250?start={}&filter='
for pg in range(10):
time.sleep(1)
url=url1.format(pg*25)
print('正在爬取第{}页,url是:{}'.format(pg+1,url))
headers = { # headers就是一个请求头
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
item_list = soup.find_all('div',attrs={"class": "item"})
for item in item_list:
# 获取排行
pic = item.find('div',attrs={"class": "pic"}).text # 获取排名
# 获取电影名称
title = item.find('div', attrs={'class': 'hd'}).find('a').text # 获取电影名称
title = title.split('/')
name = ''
for i in title:
i = i.replace('\n','').replace('\xa0','')
i = i.strip()
name += i +'/'
# print('名字是:',name[:-1])
# 获取导演信息
p_list=item.find('div',attrs={"class": "bd"}).findAll('p')
daoyan = p_list[0].text.replace('\n','').replace('\xa0','').strip()
daoyan = re.sub(' {5,}','',daoyan)
# 获取评分和评价人数
star = item.find('div',attrs={"class": "star"}).text.split() # 列表返回:1、分数2、评价人数
# 获取推荐语
quote = item.find('p',attrs={'class': 'quote'})
if quote:
quote = quote.text.strip()
# ['排名', '电影名称', '电影信息', '评分', '评价人数', '推荐语']
csv_file.writerow([pic,name[:-1],daoyan,star[0],star[1],quote])
注:本代码只可用于学习。