Python爬取全球是最大的电影数据库网站IMDb数据
阅读原文时间:2023年07月09日阅读:4

在使用 Python 开发爬虫的过程中,requests 和 BeautifulSoup4(别名bs4) 应用的比较广泛,requests主要用于模拟浏览器的客户端请求,以获取服务器端响应,接收到的响应结果,如:网页HTML源码则交由 bs4 封装后再解析提取目标内容数据。

今天的案例中,我们将使用一个新库 MechanicalSoup 该库事实上是对 requests 和 bs4 的进一步封装,让请求和解析的工作进一步简化,如果你已经熟悉 requests 和 bs4 的基本操作,下面的代码理解起来应该不会很困难。

mechanicalsoup 安装

终端下使用 pip 安装即可,也会自动安装相关依赖组件库

pip install mechanicalsoup

今天我们要请求的是全球是最大的电影数据库网站 IMDb,其官网地址是 http://www.imdb.com 首页显示效果如图所示:

我们要爬取数据的页面,可以通过“Menu“ 导航的子菜单项 "Top Rated Movies" 进入,或直接访问 https://www.imdb.com/chart/top/

我们要采集的目标数据为左侧页面的列表,经过浏览器右键“检查”分析,得知第一条数据项均包含在一个表格行内,此时我们进一步明确要采集的数据为排名、电影标题、发行年份三列,分析得到以下HTML元素:

目标数据均包含在一个td class="titleColumn" 单元格内,此时只需要批量获取有该特征的批量单元格,再取出目标数据并清理即可。

采集并打印

初步代码结构:

imdb.py

python答疑 咨询 学习交流群2:660193417###
import mechanical

# 数据容器
data = []

def fetch_data():
    # 此处爬取页面目标数据

def main():
    fetch_data()

if __name__ == "__main__":
    main()

重点的代码逻辑是包含在 fetch_data() 函数内,具体代码如下(含注释):

python答疑 咨询 学习交流群2:660193417###
def fetch_data():
    url = "https://www.imdb.com/chart/top/"
    # 构造浏览器对象
    b = mechanicalsoup.StatefulBrowser()
    # 请求目标网址
    b.open(url)
    # b.page 即为当前响应页面源码,且已封装为 BeautifulSoup 对象
    # 页面中找出所有具有 class="titleColumn" 属性的 td 单元格集合
    items = b.page.find_all("td", class_="titleColumn")

    # 遍历所有项
    for item in items:
        # 取出当前单元格中所所有文本,以"\n"分隔为三个元素
        row = item.text.strip().split("\n")
        # 进一步清理元素值的空格
        # 此时列表中三个元素对应为排名、标题、年份
        row = [x.strip() for x in row]
        # 将数据添加至data列表容器,便于进一步处理
        data.append(row)
        # 打印显示
        print(row)

此时代码如下:

python答疑 咨询 学习交流群2:660193417###
import mechanicalsoup

data = []

def fetch_data():
    url = "https://www.imdb.com/chart/top/?ref_=nv_mv_250"
    b = mechanicalsoup.StatefulBrowser()
    b.open(url)
    items = b.page.find_all("td", class_="titleColumn")
    for item in items:
        row = item.text.strip().split("\n")
        row = [x.strip() for x in row]
        data.append(row)
        print(row)

def main():
    fetch_data()

if __name__ == "__main__":
    main()

此时运行代码 python imdb.py 结果如下:

可以看到在逐行提取时打印的效果,此时数据窗口 data 中也包括了所有行250行的电影信息。

如果将采集的批量电影数据(250条)一次性写入Excel 表格文件,可以安装使用 Excel 操作库,比如:openpyxl 等,在执行完前述步骤 fetch_data() 执行新建、并写入Excel 操作即可。