如何从XML页面中提取URL,加载它们并使用Scrapy提取信息 - XMLfeedspider?

时间:2017-07-20 16:48:35

标签: python xml scrapy

我使用Scrapy的XMLfeedspider从页面xml中提取信息。我试图仅提取标记内的此页面上的链接" loc"并加载它们但阻止页面重定向,然后将其发送到最后一个将从此页面收集信息的解析节点。问题是,我不确定是否可以将这些页面加载到" def star_urls"或者如果我需要使用parse_node并重定向到另一个解析来提取我需要的信息,但即使我尝试了,我也不确定如何从xml页面中提取链接,而不是所有的loc标签

恢复我的想法:

这个想法应该加载this xml page并从中提取<loc>标记内的链接,如下所示:

  

https://www.gotdatjuice.com/track-2913133-sk-invitational-ft-sadat-x-lylit-all-one-cdq.html   https://www.gotdatjuice.com/track-2913131-sk-invitational-ft-m-o-p-we-dont-stop-cdq.html

然后最终加载每个页面并提取标题和网址。

有什么想法吗?

在下面找到我的代码:

from scrapy.loader import ItemLoader
from scrapy.spiders import XMLFeedSpider
from scrapy.http import Request
from testando.items import CatalogueItem

class TestSpider(XMLFeedSpider):

    name = "test"
    allowed_domains = ["gotdajuice.ie"]
    start_urls = [      
        'https://www.gotdatjuice.com/sitemap.xml'
    ]   

    namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')]
    itertag = 'n:loc'
    iterator = 'xml'


    name_path = ".//div[@class='song-name']/h1/text()"


    def start_request(self):
      urls = node.xpath(".//loc/text()").extract()
      for url in urls:
          yield scrapy.Request(
            meta={'dont_redirect': True},
            dont_filter=True,
            url=url, callback=self.parse_node)

    def parse_node(self, response, node):

        l = ItemLoader(item=CatalogueItem(), response=response)
        l.add_xpath('name', self.name_path)
        l.add_value('url', response.url)
        return l.load_item()

2 个答案:

答案 0 :(得分:3)

我不明白您不需要重定向的要求。无论如何,请参阅下面修改过的蜘蛛代码:

import scrapy
from scrapy.loader import ItemLoader
from scrapy.spiders import XMLFeedSpider
from scrapy.http import Request

class TestSpider(XMLFeedSpider):
    name = "test"
    allowed_domains = ["gotdajuice.com"]
    start_urls = [
        'https://www.gotdatjuice.com/sitemap.xml'
    ]

    namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')]
    itertag = 'n:loc'
    iterator = 'xml'

    name_path = ".//div[@class='song-name']/h1/text()"

    def parse_node(self, response, node):
      urls = node.xpath("./text()").extract()
      for url in urls:
          yield scrapy.Request(
            meta={'dont_redirect': True},
            dont_filter=True,
            url=url, callback=self.parse_item)

    def parse_item(self, response):
        yield {
            'name': response.xpath(self.name_path).extract_first(),
            'url': response.url,
        }

修改:

  1. 导入的scrapy模块,稍后在您使用的代码中scrapy.Request
  2. allowed_domains.ie更改为.com)以反映您抓取的实际域名。
  3. 您的start_requests包含parse_node中实际需要的内容。对loc元素的迭代由iteratoritertag XMLFeedSpider设置处理,结果将传递到parse_node。然后,内部代码会在Request中解析项目详细信息{/ 1}}。
  4. parse_item只会以parse_item格式生成该项,因为我无法访问您的dict

答案 1 :(得分:1)

您应该使用xmltodict

{{1}}