爬取豆瓣最受欢迎的250部电影并保存至Excel表格
- 导入requests和BeautifulSoup库,以及xlwt库用于创建Excel文件。
- 创建request_douban函数用于发送请求获取网页内容,使用headers模拟浏览器访问。
- 创建一个Workbook对象用于存储数据,并创建一个Sheet对象用于写入数据。
- 使用write方法在第一行写入表头信息。
- 创建一个全局变量n用于记录行数。
- 创建save_to_excel函数用于解析网页内容并将数据写入Excel文件中。
- 使用find方法和CSS选择器定位到电影列表,并使用find_all方法找到所有电影项。
- 使用find方法和CSS选择器定位到电影项中的各个信息,并使用string和get方法获取文本内容和图片链接。
- 判断简介信息是否存在,如果存在则使用string方法获取内容,否则设置为默认值。
- 使用write方法将电影信息写入对应的单元格。
- 创建main函数用于控制程序的执行流程。
- 拼接URL,根据传入的页数计算start参数并发送请求获取网页内容。
- 使用BeautifulSoup解析网页内容。
- 调用save_to_excel函数将数据写入Excel文件。
- 使用循环调用main函数获取多页数据。
- 使用save方法保存Excel文件。
代码如下:
import requests
from bs4 import BeautifulSoup
import xlwt
# 定义请求函数,传入URL参数
def request_douban(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/88.0.4324.146 Safari/537.36',
}
try:
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
return response.text
except requests.RequestException:
return None
# 创建一个Excel工作簿对象
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
# 在工作簿中创建一个名为“豆瓣电影Top250”的工作表
sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True)
sheet.write(0, 0, '名称') # 在第一行第一列写入标题“名称”
sheet.write(0, 1, '图片') # 在第一行第二列写入标题“图片”
sheet.write(0, 2, '排名') # 在第一行第三列写入标题“排名”
sheet.write(0, 3, '评分') # 在第一行第四列写入标题“评分”
sheet.write(0, 4, '作者') # 在第一行第五列写入标题“作者”
sheet.write(0, 5, '简介') # 在第一行第六列写入标题“简介”
n = 1 # 初始化行数的计数器
# 定义保存数据至Excel的函数,函数接收一个BeautifulSoup对象作为参数
def save_to_excel(soup):
list = soup.find(class_='grid_view').find_all('li')
for item in list:
item_name = item.find(class_='title').string # 获取电影名称
item_img = item.find('a').find('img').get('src') # 获取电影图片链接
item_index = item.find(class_='').string # 获取电影排名
item_score = item.find(class_='rating_num').string # 获取电影评分
item_author = item.find('p').text # 获取电影作者
if item.find(class_='inq') is not None:
item_intr = item.find(class_='inq').string # 获取电影简介
else:
item_intr = 'NOT AVAILABLE'
print('爬取电影:' + item_index + ' | ' + item_name + ' | ' + item_score + ' | ' + item_intr)
global n
# 将数据写入Excel表格中
sheet.write(n, 0, item_name) # 写入电影名称
sheet.write(n, 1, item_img) # 写入电影图片链接
sheet.write(n, 2, item_index) # 写入电影排名
sheet.write(n, 3, item_score) # 写入电影评分
sheet.write(n, 4, item_author) # 写入电影作者
sheet.write(n, 5, item_intr) # 写入电影简介
n = n + 1
# 定义主函数,用于爬取多页面并保存数据至Excel表格中
def main(page):
url = 'https://movie.douban.com/top250?start=' + str(page * 25) + '&filter=' # 构造URL
html = request_douban(url) # 请求URL获取HTML文本
soup = BeautifulSoup(html, 'lxml') # 使用BeautifulSoup进行解析
save_to_excel(soup) # 将解析结果保存至Excel表格中
if __name__ == '__main__':
for i in range(0, 10): # 爬取前10页的数据
main(i)
book.save(u'豆瓣最受欢迎的250部电影.xlsx') # 保存Excel文件