如何使用 Scrapy - XMLfeedspider 从 XML 页面中提取 url、加载它们并提取其中的信息?

Pab*_*blo 1 python xml scrapy

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

继续我的想法:

这个想法应该是加载这个 xml 页面<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-mop-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()
Run Code Online (Sandbox Code Playgroud)

Tom*_*art 5

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

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,
        }
Run Code Online (Sandbox Code Playgroud)

修改:

  1. 导入的scrapy模块,如稍后在您使用的代码中所示scrapy.Request
  2. 更改为allowed_domains( ) 以反映您抓取的实际域。.ie.com
  3. start_requests包含了实际需要的内容parse_node。元素的迭代由和 的设置loc负责,结果被传递到。然后,里面的代码产生s 来解析 中的项目详细信息。iteratoritertagXMLFeedSpiderparse_nodeRequestparse_item
  4. parse_item只是以格式生成项目dict,因为我无权访问您的CatalogueItem.