【问题标题】:Scrapy - parse a page to extract items - then follow and store item url contentsScrapy - 解析页面以提取项目 - 然后跟踪并存储项目 url 内容
【发布时间】:2011-04-28 22:45:04
【问题描述】:

我有一个关于如何在 scrapy 中做这件事的问题。我有一个爬取列出项目页面的蜘蛛。 每次找到包含项目的列表页面时,都会调用 parse_item() 回调来提取项目数据并生成项目。到目前为止一切顺利,一切正常。

但是每个项目,除其他数据外,还有一个 url,其中包含有关该项目的更多详细信息。我想跟踪该 url 并将获取的该项目 url 的内容存储在另一个项目字段 (url_contents) 中。

而且我不确定如何组织代码来实现这一点,因为两个链接(列表链接和一个特定项目链接)的遵循方式不同,回调在不同时间调用,但我必须在相同的项目处理。

到目前为止,我的代码如下所示:

class MySpider(CrawlSpider):
    name = "example.com"
    allowed_domains = ["example.com"]
    start_urls = [
        "http://www.example.com/?q=example",
    ]

    rules = (
        Rule(SgmlLinkExtractor(allow=('example\.com', 'start='), deny=('sort='), restrict_xpaths = '//div[@class="pagination"]'), callback='parse_item'),
        Rule(SgmlLinkExtractor(allow=('item\/detail', )), follow = False),
    )


    def parse_item(self, response):
        main_selector = HtmlXPathSelector(response)
        xpath = '//h2[@class="title"]'

        sub_selectors = main_selector.select(xpath)

        for sel in sub_selectors:
            item = ExampleItem()
            l = ExampleLoader(item = item, selector = sel)
            l.add_xpath('title', 'a[@title]/@title')
            ......
            yield l.load_item()

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    经过一些测试和思考,我发现这个解决方案适合我。 我们的想法是只使用第一条规则,它为您提供项目列表,此外,非常重要的是,将 follow=True 添加到该规则中。

    在 parse_item() 中你必须产生一个请求而不是一个项目,但是在你加载项目之后。请求是项目详细信息 url。您必须将加载的项目发送到该请求回调。您根据响应完成您的工作,并在其中生成项目。

    所以 parse_item() 的结尾会是这样的:

    itemloaded = l.load_item()
    
    # fill url contents
    url = sel.select(item_url_xpath).extract()[0]
    request = Request(url, callback = lambda r: self.parse_url_contents(r))
    request.meta['item'] = itemloaded
    
    yield request
    

    然后 parse_url_contents() 将如下所示:

    def parse_url_contents(self, response):
        item = response.request.meta['item']
        item['url_contents'] = response.body
        yield item
    

    如果有人有其他(更好的)方法,请告诉我们。

    斯蒂芬

    【讨论】:

    • 我就是这样做的。我认为唯一的其他选择是在存储/输出阶段重新组合数据。
    • 是的,我们还确认了scrapy group,所以我选择了我的答案
    【解决方案2】:

    我遇到了完全相同的问题,鉴于 2 天没有人回答您的问题,我认为唯一的解决方案是在您的 parse_item 函数中手动跟踪该 URL。

    我是 Scrapy 的新手,所以我不会尝试这样做(尽管我确信这是可能的),但我的解决方案是使用 urllib 和 BeatifulSoup 手动加载第二页,提取它信息,并将其保存为项目的一部分。是的,比 Scrapy 进行正常解析要麻烦得多,但它应该以最少的麻烦完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多