Python 爬取豆瓣电影TOP250榜单到Excel文件
用 python 爬取一般的网页内容 ,需要用到 requests 库 和 bs4 库
将爬取的数据写入到 Excel文件则需要用到 openpyxl ,这是一个第三方模块,可以处理 xlsx 格式的 Excel 文件。
1. 提交 url 发起 Request 请求,返回一个Response 对象(res)
2. 使用 BeautifulSoup 解析获取的网页信息为 html 格式
3. find_all() 是一个查找的方法,以电影名称为例,我们来观察一下它的 html 页面代码,发现在 一个div 标签,属性名为 ‘hd’ 里,包裹一个 a 标签和 span 标签,顺着它们一层层往下,最终找到我们的电影名。把找到的信息全部保存在 result 中。
4. 查看一下爬取电影TOP250 需要多少页面,也就是我们的 find_depth 函数。
5. 把爬取的内容保存到 Excel 文件。
import openpyxl
import requests
from bs4 import BeautifulSoup
import re
def open_url(url):
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
res=requests.get(url,headers=headers)
return res
def find_movies(res):
soup = BeautifulSoup(res.text, 'html.parser')
# 电影名
movies = []
targets = soup.find_all("div", class_="hd")
for each in targets:
movies.append(each.a.span.text)
# 评分
ranks = []
targets = soup.find_all("span", class_="rating_num")
for each in targets:
ranks.append(each.text)
# 资料
messages = []
targets = soup.find_all("div", class_="bd")
for each in targets:
try:
messages.append(each.p.text.split('\n')[1].strip() + each.p.text.split('\n')[2].strip())
except:
continue
result = []
length = len(movies)
for i in range(length):
result.append([movies[i],ranks[i],messages[i]])
return result
#查找的深度
def find_depth(res):
soup=BeautifulSoup(res.text,'html.parser')
depth=soup.find('span',class_='next').previous_sibling.previous_sibling.text
return int(depth)
def save_to_excel(result):
wb=openpyxl.Workbook() #建立一个Excel工作簿
ws=wb.active #得到一个 sheet 的页面
ws['A1']='电影名称' #直接给单元格赋值
ws['B1']='评分'
ws['C1']='资料'
for each in result:
ws.append(each) #用此函数只能按行写入,从空白行开始
wb.save('豆瓣TOP250.xlsx')
def main():
host='https://movie.douban.com/top250'
res=open_url(host)
depth=find_depth(res)
result=[]
for i in range(depth):
url=host+'/?start='+str(25*i) #寻找每页之间的关系,得出每页的url
res=open_url(url)
result.extend(find_movies(res))
save_to_excel(result)
if __name__=='__main__':
main()
最后可以得到如下的结果啦: