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 文件。

 

Python 爬取豆瓣电影TOP250榜单到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()

 

最后可以得到如下的结果啦:

Python 爬取豆瓣电影TOP250榜单到Excel文件
标题