爬虫实例——爬取豆瓣网 top250 电影的信息

简介: 本节通过一个具体的实例来看下编写爬虫的具体过程。以爬取豆瓣网 top250 电影的信息为例,top250 电影的网址为:https://movie.douban.com/top250。在浏览器的地址栏里输入 https://movie.douban.com/top250,我们会看到如下内容:

本节通过一个具体的实例来看下编写爬虫的具体过程。以爬取豆瓣网 top250 电影的信息为例,top250 电影的网址为:https://movie.douban.com/top250。在浏览器的地址栏里输入 https://movie.douban.com/top250,我们会看到如下内容:

网络异常,图片无法展示
|

对于每一部电影需要爬取的内容如下图所示:

网络异常,图片无法展示
|

如上图所示,爬取的内容包括电影排名、电影名称、电影评分、电影属于哪个国家、电影类型、电影的上映时间以及电影的导演、主演。了解了要爬取哪些内容之后,接下来需要知道这些内容对应的 html 内容。

网络异常,图片无法展示
|

知道了对应的 html 内容之后,接下来就是解析 html,获取我们想要的内容。下面我们就逐步介绍爬取的过程:

1.获取 html

网络异常,图片无法展示
|

如上图所示,由于每页只展示 25 个电影的信息,要想获取所有电影的信息,需要通过一个循环来获取全部 10 页的内容。

1.1 导入所需的第三方库

import requests
from bs4 import BeautifulSoup
import time
import csv

1.2 发送请求

1.2.1 设置 headers

由于豆瓣网会有反扒的机制,所以在请求网页的时候,需要设置headers。headers 的内容如下:

headers = {
    'User-Agent': ******,
    'Cookie': ******
}

在实际运行时,需要将 ** 改成真实的 User-Agent 和 Cookie。

1.2.2 生成 url

第一页的 url 为:https://movie.douban.com/top250?start=0&filter=。第二页的 url 为:https://movie.douban.com/top250?start=25&filter=。第三页的 url 为:https://movie.douban.com/top250?start=50&filter=。从上面三个 url 的组成可以看出,只有 start 后面的数字在变,其他的都不变。我们可以根据这个规律来获取所有的 url。

1.2.3 发送请求获取响应

for i in range(10):
    response = requests.get(
        'https://movie.douban.com/top250?'+'start='+str(25*i)+'&filter=', headers=headers)

2.解析 html

2.1 响应解析

soup = BeautifulSoup(response.text, 'lxml')
    ol = soup.ol
    all_li = ol.find_all('li')
    for li in all_li:
        rank = li.find('em', class_="").string
        title = li.find('span', class_="title").string
        rating = li.find('span', class_="rating_num").string
        info = li.find('div', class_="bd").p.get_text().strip()
        country = info.split('/')[-2]
        genre = info.split('/')[-1]
        release_time = info.split('\n')[1].split('/')[0].replace(" ", "")
        director_actor = li.find('div', class_="bd").p.next_element.replace(
            "\n", "").replace(" ", "")
        ranks.append(rank)
        titles.append(title)
        ratings.append(rating)
        countrys.append(country)
        genres.append(genre)
        release_times.append(release_time)
        director_actors.append(director_actor)

由上面的 html 内容可以看到,每部电影的信息处于<li></li>标签内,而所有的<li></li>标签又位于<ol></ol>标签内。于是,首先获取 ol 标签的内容,然后再获取所有的 li 标签的内容。获取到所有的 li 标签之后,对每个 li 标签进行遍历,获取我们想要的内容。在所有的内容获取完成后,将内容加入到相应的存储列表中。

3.存储内容

在获取我们想要的内容之后,将内容存储到 csv 文件。代码如下:

with open('top250.csv', 'w') as file:
    writer = csv.writer(file, delimiter=',')
    writer.writerow(["排名", "名称", "评分", "国家", "类型", "上映时间", "导演&主演"])
    for i in range(250):
        writer.writerow([
            ranks[i],
            titles[i],
            ratings[i],
            countrys[i],
            genres[i],
            release_times[i],
            director_actors[i]
        ])

4.完整代码

综合上面每一步的代码之后,便可以得到完整的代码:

import requests
from bs4 import BeautifulSoup
import time
import csv
headers = {
    'User-Agent': ******,
    'Cookie': ******
}
ranks = []
titles = []
ratings = []
inqs = []
countrys = []
genres = []
release_times = []
director_actors = []
for i in range(10):
    response = requests.get(
        'https://movie.douban.com/top250?'+'start='+str(25*i)+'&filter=', headers=headers)
    soup = BeautifulSoup(response.text, 'lxml')
    ol = soup.ol
    all_li = ol.find_all('li')
    for li in all_li:
        rank = li.find('em', class_="").string
        title = li.find('span', class_="title").string
        rating = li.find('span', class_="rating_num").string
        info = li.find('div', class_="bd").p.get_text().strip()
        country = info.split('/')[-2]
        genre = info.split('/')[-1]
        release_time = info.split('\n')[1].split('/')[0].replace(" ", "")
        director_actor = li.find('div', class_="bd").p.next_element.replace(
            "\n", "").replace(" ", "")
        ranks.append(rank)
        titles.append(title)
        ratings.append(rating)
        countrys.append(country)
        genres.append(genre)
        release_times.append(release_time)
        director_actors.append(director_actor)
    time.sleep(3)
with open('top250.csv', 'w') as file:
    writer = csv.writer(file, delimiter=',')
    writer.writerow(["排名", "名称", "评分", "国家", "类型", "上映时间", "导演&主演"])
    for i in range(250):
        writer.writerow([
            ranks[i],
            titles[i],
            ratings[i],
            countrys[i],
            genres[i],
            release_times[i],
            director_actors[i]
        ])

5.结果

将获取到的内容存储到 csv 文件中。csv 文件的部分内容如下图所示:

网络异常,图片无法展示
|

这样我们便完成了豆瓣 top250 电影信息的爬取。

相关文章
|
6月前
|
数据采集 数据可视化 算法
【优秀python案例】基于Python的豆瓣电影TOP250爬虫与可视化设计与实现
本文设计并实现了一个基于Python的豆瓣电影TOP250爬虫与可视化系统,通过获取电影评分、评论并应用词云和饼图等可视化技术,为用户提供了电影评价的直观展示和深入分析。
1301 3
【优秀python案例】基于Python的豆瓣电影TOP250爬虫与可视化设计与实现
|
4月前
|
数据采集 开发者
爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数
爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数
190 0
|
5月前
|
数据采集
做个爬虫吧:豆瓣《八佰》影评
做个爬虫吧:豆瓣《八佰》影评
65 0
|
6月前
|
数据采集 数据可视化 关系型数据库
【优秀python web设计】基于Python flask的猫眼电影可视化系统,可视化用echart,前端Layui,数据库用MySQL,包括爬虫
本文介绍了一个基于Python Flask框架、MySQL数据库和Layui前端框架的猫眼电影数据采集分析与可视化系统,该系统通过爬虫技术采集电影数据,利用数据分析库进行处理,并使用Echart进行数据的可视化展示,以提供全面、准确的电影市场分析结果。
190 4
|
8月前
|
数据采集 存储 JavaScript
(2024)豆瓣电影详情内容爬虫详解和源码
这是一个Python爬虫程序,用于抓取豆瓣电影详情页面如`https://movie.douban.com/subject/1291560/`的数据。它首先发送GET请求,使用PyQuery解析DOM,然后根据`&lt;br&gt;`标签分割HTML内容,提取电影信息如导演、演员、类型等,并将中文键转换为英文键存储在字典中。完整代码包括请求、解析、数据处理和测试部分。当运行时,会打印出电影详情,如导演、演员列表、类型、时长等。
170 1
 (2024)豆瓣电影详情内容爬虫详解和源码
|
7月前
|
数据采集 大数据 关系型数据库
如何使用 PHP 爬虫爬取大数据
**摘要:** 本文探讨了如何使用PHP爬虫处理大数据。从爬虫基本概念出发,讨论了PHP爬虫框架如Goutte和PHP-Crawler。在爬取大数据时,需明确目标网站、数据类型和量,编写爬虫程序,包括数据提取、反爬策略如设置User-Agent和访问频率控制。同时,采用并发处理(多线程)和分布式爬虫策略提升效率。最后,强调了合法合规使用爬虫技术的重要性。
|
8月前
|
数据采集 存储 JavaScript
(2024)豆瓣电影TOP250爬虫详细讲解和代码
这是一个关于如何用Python爬取2024年豆瓣电影Top250的详细教程。教程涵盖了生成分页URL列表和解析页面以获取电影信息的函数。`getAllPageUrl()` 生成前10页的链接,而`getMoiveListByUrl()` 使用PyQuery解析HTML,提取电影标题、封面、评价数和评分。代码示例展示了测试这些函数的方法,输出包括电影详情的字典列表。
423 3
|
3月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
193 6
|
6月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
306 4
|
7月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
119 4