【问题标题】:Scrapy - How do i extract info from nested linksScrapy - 我如何从嵌套链接中提取信息
【发布时间】:2017-12-20 22:48:18
【问题描述】:

我开始学习如何使用 Scrapy www.scrapy.org

我的问题是我试图从另一个链接中的链接中提取信息。

流程是这样的:

我们进入www.imdb.com,然后在菜单上点击Watchlist > IMDbtop250,然后我们会在http://www.imdb.com/chart/top找到一个电影清单;

我正在尝试输入具有类似www.imdb.com/title/tt0111161/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=1EX7BT4EGCE6HVGF919H&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_1 的链接的每部电影,然后输入看起来像这样www.imdb.com/title/tt0111161/fullcredits?ref_=tt_cl_sm#cast 的电影的完整演员链接,并开始从最后一个链接中提取所有演员,所以问题出在是我知道如何提取信息但在链接导航方面遇到困难,这是我现在拥有的代码

    # -*- coding: utf-8 -*-
from scrapy import item
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class ActorsSpider(CrawlSpider):
    name = "actors"
    allowed_domains = ["www.imdb.com"]
    start_urls = ['http://www.imdb.com/chart/top',
                  'http://www.imdb.com/title/']

    def parse(self, response):
        rules = {
            Rule(LinkExtractor(allow=r'/title/tt0111161/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=2398042102&pf_rd_r=0BP5GZ1CWDNT2NFAWKDN&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_1')),
            Rule(LinkExtractor(allow=r'fullcredits?ref_=tt_cl_sm#cast'), callback='parse_actor'),
        }

    def parse_actor(self, response):
        item['title'] = response.css('title').extract()[0]
        return item

我知道这应该以递归方式完成,但首先我实际上是在尝试使链接工作,并且我尝试输入的两个链接都共享此特性 /title/tt0111161/ 至少对于第一个链接。

另外,我现在只是提取标题,以了解我是否在我想去的地方。

提前感谢您的帮助。

删除了一些链接,因为我还没有 10 声望。

【问题讨论】:

    标签: python scrapy href scrape rule


    【解决方案1】:

    您的 allowed_domains 错误,一定是:

    allowed_domains = ["imdb.com"]
    

    从评分最高的电影开始

    start_urls = ['http://www.imdb.com/chart/top/']
    

    解析每部电影并为演员列表准备网址

    def parse(self, response):
            for film in response.css('.titleColumn'):
                url = film.css('a::attr(href)').extract_first()
                actors_url = 'http://imdb.com' + url[:17] + 'fullcredits?ref_=tt_cl_sm#cast'
                yield scrapy.Request(actors_url, self.parse_actor)
    

    然后找到所有演员

    def parse_actor(self, response):
            item = ImdbItem()
            item['title'] = response.css('h3[itemprop~=name] a::text').extract_first()
            item['actors'] = response.css('td[itemprop~=actor] span::text').extract()
            return item
    

    【讨论】:

    • 这是我试图做的,现在我只是更新以在我的 JSON 对象中添加海报,顺便说一下,你能解释一下h3[itemprop~=name] a::text 是如何工作的吗,我知道 itemProp 不是等于名字?
    • 你可以使用scrapy shell (link)
    • 我的问题是关于 ~= 运算符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2021-11-05
    • 2011-07-25
    • 2018-06-23
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多