簡體   English   中英

如何使用Scrapy-XMLfeedspider從XML頁面提取URL,加載它們並在其中提取信息?

[英]How to extract urls from an XML page, load them and extract information inside them using Scrapy - XMLfeedspider?

我正在使用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-不要一站式cdq.html

然后最后加載每個頁面並提取標題和URL。

有任何想法嗎?

在我的代碼下面找到:

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()

我不理解您要求不重定向的要求。 無論如何,請參見下面的修改后的蜘蛛代碼:

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實際需要的parse_node 迭代過loc元素被照顧iteratoritertag設置XMLFeedSpider並將結果傳遞到parse_node 里面的代碼,然后產生Request S能夠被解析項目細節parse_item
  4. parse_item僅以dict格式生成項目,因為我無權訪問您的CatalogueItem

您應該使用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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM