【问题标题】:How to extract urls from an XML page, load them and extract information inside them using Scrapy - XMLfeedspider?如何从 XML 页面中提取 url,加载它们并使用 Scrapy - XMLfeedspider 提取其中的信息?
【发布时间】:2017-07-20 16:48:34
【问题描述】:

我正在使用来自 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()

【问题讨论】:

    标签: python xml scrapy


    【解决方案1】:

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

    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 元素的迭代由XMLFeedSpideriteratoritertag 设置负责,并将结果传递给parse_node。然后,里面的代码生成Requests 到parse_item 中解析的项目详细信息。
    4. parse_item 只生成 dict 格式的项目,因为我无权访问您的 CatalogueItem

    【讨论】:

    • 完美,非常感谢您的回答。我想停止重定向,因为很少有链接会自动重定向到其他页面。
    【解决方案2】:

    你应该使用xmltodict

    import xmltodict
    def start_requests(self):
        yield Request("https://www.gotdatjuice.com/sitemap.xml", callback=self.parse_sitemap)
    def parse_sitemap(self,response):
    
    obj = xmltodict.parse(response.body)
    monString = json.dumps(obj)
    json_data = json.loads(monString)
    
    urls = json_data['urlset']['url']
    for url in urls :
        loc = url['loc']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2017-06-04
      相关资源
      最近更新 更多