python爬虫练习-爬取豆瓣电影top250

发布时间 2023-04-10 15:19:12作者: zhuzhu侠

一、设计方案

爬取的内容:豆瓣电影的榜单数字、名称、评星、评分、评论数量

方案实现思路:使用requests爬取网页,然后实现数据解析,借助pandas将数据写出到Excel

二、主题页面的结构特征分析

1.打开开发者工具,查找我所需的内容,以及它所在的标签;在 div class="item" 中查找。

2.进行页面解析

 

 

3分析节点

 

 

    

三、网络爬虫程序设计

1.数据爬取与采集

#获取页面
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 构造分页数字列表
page_indexs = range(0, 250, 25)
list(page_indexs)
def download_all_htmls():
    """
    下载所有列表页面的HTML,用于后续的分析
    """
    htmls = []
    for idx in page_indexs:
        url = f"https://movie.douban.com/top250?start={idx}&filter="
        print("craw html:", url)
        r = requests.get(url,
                        headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"})
        if r.status_code != 200:
            raise Exception("error")
        htmls.append(r.text)
    return htmls
htmls = download_all_htmls()
htmls[0]
def parse_single_html(html):
    """
    解析单个HTML,得到数据
    @return list({"link", "title", [label]})
    """
    soup = BeautifulSoup(html, 'html.parser')
    article_items = (
        soup.find("div", class_="article")
            .find("ol", class_="grid_view")
            .find_all("div", class_="item")
    )
    datas = []
    for article_item in article_items:
        rank = article_item.find("div", class_="pic").find("em").get_text()
        info = article_item.find("div", class_="info")
        title = info.find("div", class_="hd").find("span", class_="title").get_text()
        stars = (
            info.find("div", class_="bd")
                .find("div", class_="star")
                .find_all("span")
        )
        rating_star = stars[0]["class"][0]
        rating_num = stars[1].get_text()
        comments = stars[3].get_text()
        
        datas.append({
            "rank":rank,
            "title":title,
            "rating_star":rating_star.replace("rating","").replace("-t",""),
            "rating_num":rating_num,
            "comments":comments.replace("人评价", "")
        })
    return datas

import pprint
pprint.pprint(parse_single_html(htmls[0]))
# 执行所有的HTML页面的解析
all_datas = []
for html in htmls:
    all_datas.extend(parse_single_html(html))
    
all_datas
len(all_datas)
df = pd.DataFrame(all_datas)
df.to_excel("豆瓣电影TOP250.xlsx")

#保存成功

 

 后续爬取数据的可视化参考:https://www.cnblogs.com/n4ll/p/12748687.html