首页 > 编程问答 >爬取前 250 部电影 IDMb 中的数据

爬取前 250 部电影 IDMb 中的数据

时间:2024-07-21 13:17:37浏览次数:9  
标签:python web-scraping beautifulsoup web-crawler

拜托,我需要有人帮助我。我不明白为什么我只爬取 25 部电影而不是 250 部电影。我的代码:

import pandas as pd
import requests
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
url = "https://www.imdb.com/chart/top/?ref_=nv_mv_250"
response = requests.get(url, headers = headers)

html_doc = response.content
soup = BeautifulSoup(html_doc, "html.parser")

ls = soup.find_all("div", class_="sc-b189961a-0 hBZnfJ cli-children")
print(len(ls))

结果是 25。链接: https://www.imdb.com/chart/top/?ref_=nv_mv_250| ||,这里有 250 部电影,我使用 BeautifulSoup。结果 len(ls) 应为 250。 请解释并帮助我解决这个问题。非常感谢! 我希望我能爬取这个网站上的完整数据

I hope I can crawl fully data on this Web


遇到的是 IMDb 网站动态加载内容的问题。当前的代码只获取了初始页面加载的 HTML,其中包含前 25 部电影。其余的 225 部电影是通过 JavaScript 动态加载的。

为了爬取所有 250 部电影的数据,需要使用可以渲染 JavaScript 并完全加载页面的工具,例如 Selenium 或 Playwright。

以下是用 Playwright 爬取所有 250 部电影信息的代码示例:

from playwright.sync_api import sync_playwright

def main():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False) # 设置为 False 可以看到浏览器运行过程
        page = browser.new_page()
        page.goto("https://www.imdb.com/chart/top/?ref_=nv_mv_250")

        # 等待所有电影加载完成
        page.wait_for_selector("div.sc-b189961a-0.hBZnfJ.cli-children:nth-child(250)")

        # 获取所有电影信息
        ls = page.query_selector_all("div.sc-b189961a-0.hBZnfJ.cli-children")
        print(len(ls)) # 应该输出 250

        # 进一步提取需要的数据,例如电影标题,年份,评分等

        browser.close()

if __name__ == "__main__":
    main()

代码解释:

  1. 导入 playwright 库: from playwright.sync_api import sync_playwright
  2. 启动浏览器: 使用 sync_playwright 上下文管理器启动 Chromium 浏览器。
  3. 创建新页面并访问目标网址: 使用 browser.new_page() 创建新页面,并使用 page.goto() 方法访问 IMDb Top 250 电影页面。
  4. 等待所有电影加载: page.wait_for_selector 会等待页面加载到指定的元素(这里是第250部电影)才会继续执行,确保所有 250 部电影信息都已加载。
  5. 获取所有电影元素: 使用 page.query_selector_all() 方法选择所有包含电影信息的 div 元素,并存储在 ls 列表中。
  6. 输出电影数量: 打印 ls 列表的长度,确认是否获取了所有 250 部电影。
  7. 进一步提取数据: 可以根据需要,从 ls 列表中的每个电影元素中提取电影标题、年份、评分等信息。

请确保已经安装了 Playwright 库:

pip install playwright
python -m playwright install 

使用 Playwright 或类似工具可以解决动态加载内容的问题,并让成功爬取所有 250 部电影的数据。

标签:python,web-scraping,beautifulsoup,web-crawler
From: 78771840

相关文章

  • 用 python 抓取谷歌结果统计
    我想从谷歌获取关键字的估计结果数。我使用Python3.3并尝试使用BeautifulSoup和urllib.request完成此任务。到目前为止,这是我的简单代码defnumResults():try:page_google='''http://www.google.de/#output=search&sclient=psy-ab&q=pokerbonus&oq=pokerbonus&gs......
  • 【python】Python高阶函数--sorted函数的高阶用法解析与应用实战
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 超详细Python教程——异步任务和定时任务
    异步任务和定时任务在Web应用中,如果一个请求执行了耗时间的操作或者该请求的执行时间无法确定,而且对于用户来说只需要知道服务器接收了他的请求,并不需要马上得到请求的执行结果,这样的操作我们就应该对其进行异步化处理。如果说使用缓存是优化网站性能的第一要义,那么将耗时......
  • Python 中的模 (%) 运算符如何处理负数?
    %运算符在Python中到底是如何工作的,特别是在涉及负数时?例如,为什么-5%4求值为3,而不是-1?在Python中,模运算符(%)遵循以下规则:a%b=a-(b*floor(a/b))其中:a是被除数。......
  • 如何使用 python 更新设备孪生?
    我目前正在尝试使用python更新设备孪生中的属性。但由于SSL错误而无法执行此操作。下面是代码fromazure.iot.hubimportIoTHubRegistryManagerimportcertifiimportssl#ConnecttoIoTHubandsendmessagetodeviceCONNECTION_STRING="HostName=iothub-j......
  • 【Python将字符串连接在一起】
    当然,Python是一个功能丰富且灵活的语言,有许多技巧和最佳实践可以帮助你更有效地编写代码。以下是一些常见的Python技巧:列表推导式(ListComprehensions):这是一种简洁的构建列表的方法。它比使用循环更加清晰和Pythonic。[x*2forxinrange(5)]#输出:[0,2,4,6,......
  • 我心中的王者:Python-第2章 认识变量与基本数学运算
    我心中的王者:Python-第2章认识变量与基本数学运算本章将从基本数学运算开始,一步一步讲解变量的使用与命名,接着介绍Python的算术运算。2-1用Python做计算假设读者到麦当劳打工,一小时可以获得120元时薪,如果想计算一天工作8小时,可以获得多少工资?我们可以用计算器执行“1......
  • 【Dison夏令营 Day 25】用Python写个2048
    在本文中,我们将用python代码和逻辑来设计一款你经常在智能手机上玩的2048游戏。如果您对该游戏不熟悉,强烈建议您先玩一下该游戏,以便了解其基本功能。如何玩2048.NET?1.有一个4*4的网格,可以填入任何数字。一开始,随机填入两个2的单元格。其余单元格为空。我们......
  • python入门基础——新手必看
    前言随着人工智能,大数据的发展。python是当前时代最流行,可以在数据处理、web开发、人工智能等多个领域。它的语法简洁、开发效率高、可移植性强,并且可以和其他变成语言(比如C++)轻松衔接,本文主要讲述一些python的变量,基本数据类型,输入、输出,数据类型的转换,运算符等一些必需的......
  • python中逗号运算符的含义
    我理解了python中逗号运算符的简单概念。例如,x0,sigma=0,0.1表示x0=0,sigma=0.1。但我获得了一个代码,其中有一行如下所示。y,xe=np.histogram(np.random.normal(x0,sigma,1000))其中y和xe的输出如下。yOut[10]:array([3,17,58,136,216,25......