【问题标题】:imdb top 250 movies scraper -- how to get results only from year 2000 and up?imdb 前 250 部电影刮板——如何仅从 2000 年及以后获得结果?
【发布时间】:2021-10-24 00:52:33
【问题描述】:

我是 Python 的新手(和一般的编码),而且我对这两个方面的知识都是基本的/有限的(我基本上只是从各种 Google 搜索中复制代码)。

到目前为止,我设法想出了一个有效的代码:

import scrapy

class imdb_project(scrapy.Spider):
    name = 'imdb'
    start_urls = ['https://www.imdb.com/chart/top']

    def parse(self, response):
        for i in response.css('.titleColumn a'):
            print(i.css('::text').get())

这段代码运行良好。我可以在 https://www.imdb.com/chart/top 上抓取所有 250 个电影标题

现在,我只想从同一页面中抓取电影标题,前提是电影在 2000 年及以后上映。

您可以看到here 年份显示在电影标题之后。这应该很容易做到,但对于我来说,我在谷歌甚至在 Stack Overflow 上都找不到类似的例子来帮助我开始解决这个问题。

我认为它应该是简单的:

if movie_year >= 2000:
    then run the 'for' loop above

...但我不知道如何在 Python 中编写上述代码。任何帮助(如果可能,请不要使用正则表达式或 xpath)?

【问题讨论】:

  • 你应该从他们的高级搜索中删除。但是,我只是添加重要说明: 机器人和屏幕抓取:您不得在本网站上使用数据挖掘、机器人、屏幕抓取或类似的数据收集和提取工具,除非得到我们明确的书面同意,如:imdb.com/conditions

标签: python web-scraping scrapy


【解决方案1】:

IMDb 禁止抓取,但如果理论上允许您从他们的网站抓取,情况如下:

import scrapy

class imdb_project(scrapy.Spider):
    name = 'imdb'
    start_urls = ['https://www.imdb.com/chart/top']

    def parse(self, response):
        for i in response.css('.titleColumn'):
            title = i.css('a::text').get()
            year = i.css('.secondaryInfo::text').get()[1:-1] 

            if int(year) >= 2000:
                # or you could just do title if you don't
                # want the year
                print("{0} ({1})".format(title, year))

【讨论】:

  • 你能解释一下[1:-1] 的作用吗?
  • 它被称为字符串切片,在这种情况下它所做的就是对括号中的两个括号进行切片。它从字符串的索引 1 开始 - 这是第二个字符 - 并在索引 -1 结束,这是倒数第二个字符
猜你喜欢
  • 2022-10-21
  • 2012-07-26
  • 2021-08-26
  • 2018-05-21
  • 2018-08-24
  • 2019-04-20
  • 2020-02-27
  • 2015-06-19
  • 1970-01-01
相关资源
最近更新 更多