首发于 Python学习
requests + BeautifulSoup爬取豆瓣电影Top 250 数据

requests + BeautifulSoup爬取豆瓣电影Top 250 数据

豆瓣电影Top 250网站: movie.douban.com/top250

1、通过requests库获取网页源代码 ,关键代码如下:

def get_text_from_web(url):
    print(url)  # 打印当前访问的网址
    header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"}  # 构建请求头
    try:  # 访问网络资源可能会抛出异常
        res = requests.get(url, headers=header, timeout=10)  # 发送请求
        res.raise_for_status()  # 如果状态码不是200则抛出异常
        res.encoding = res.apparent_encoding  # 设置编码格式,避免乱码
        return res.text  # 返回网页源代码
    except Exception as e:  # 捕获异常
        print("抛出异常,", e)  # 输出异常信息        

关于requests库的详细介绍,可参考之前的文章: 网络爬虫之Requests库详解

2、对获取到的网页源代码进行解析,获取电影的相关信息 。例如电影名称、导演和演员、评分、评价人数、著名台词等。​

这里主要是调用BeautifulSoup库中的相关方法,关键代码如下:

def parse_page_by_bs(text):
    text = text.replace("<br>", "")  # 删除<br>标签
    soup = BeautifulSoup(text, "html.parser")  # 构建BeautifulSoup对象
    movies = soup.select("div.info")  # 获取所有的电影
    res = []  # 保存所有电影信息
    for movie in movies:  # 依次遍历每一部电影
        try:
            titles = movie.select("span.title")
            title_str = ""
            for title in titles:
                title_str = title_str + title.string
            info = movie.select_one("div.bd").p.string.strip()  # 获取电影信息
            temp = movie.select("div.star span")  # 获取评价信息
            score = temp[1].string  # 获取评分值
            num = temp[3].string.replace("人评价", "")  # 获取评价人数
            quote = movie.select_one("span.inq")  # 获取著名台词
            if quote is not None:  # 如果存在,则获取内容
                quote = quote.string
            else:  # 否则,默认为空
                quote = ""
            res.append([title_str, info, score, num, quote])  # 一部电影一条记录
        except Exception as e:
            print(title_str, "抛出异常", e)  # 输出异常信息
    return res

关于BeautifulSoup库的详细介绍,可参考之前的文章: 网络爬虫之BeautifulSoup详解(含多个案例)

几个关键说明:

(1)电影基本信息即导演、主演、类型、国家等是整体放在一个段落中的,并且通过<br>标签进行换行,如果想完整的获取这些信息, 直接通过p.string是获取不到的 ,因为里面存在<br>标签,将文本分成了两部分,使得p标签存在多个子节点,此时通过p.string获取的内容为None。要想解决这个问题,可在解析之前将所有的<br>标签删除。

(2)在数据解析过程中,可能存在部分电影数据不完整,例如著名台词缺失,此时如果没有做相应的判断,将会导致程序出现异常,从而强制退出。因此 最好在数据解析的过程中添加异常处理 ,输出抛出异常的网页网址,这样可快速定位,同时程序不会强制退出,其他页面仍然能够正常访问。

3、抓取所有页面的电影数据,并保存到Excel文件中去 。通过单击页面下方的页码 3 、页码 4 和页码 1,观察网页地址的变化如下:

movie.douban.com/top250? (第3页)

movie.douban.com/top250? (第4页)

movie.douban.com/top250? (第1页)

可知每页显示25条电影信息。因此只需要做一个循环改变start的传值即可访问所有的页面。关键代码如下:

base_url = "https://movie.douban.com/top250?start={}"
result = []
for i in range(0, 251, 25):
    url = base_url.format(i)