2017-07-20 20 views
0

私はScrapyのXMLfeedspiderを使用してページxmlから情報を抽出しています。私はこのページのタグ "loc"の中にあるリンクだけを抽出してロードしますが、リダイレクトするページをブロックして、このページから情報を収集する最後の解析ノードに送信しようとしています。問題は、これらのページを "def star_urls"にロードするか、parse_nodeを使用して必要な情報を抽出するために別の解析にリダイレクトする必要があるかどうかわからないが、すべてのlocタグではなく、xmlページからのリンクだけを抽出する方法がわかりません。XMLページからURLを抽出し、それらを読み込み、Scrapy - XMLfeedspiderを使用してそれらの中の情報を抽出する方法?

私の考えを再開:

をアイデアは、負荷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

そして、最終的にはそれぞれのロードこのページのタイトルと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() 

答えて

2

を使用する必要があります。

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, 
     } 

変更:として、後であなたがscrapy.Requestを使用するコードでは、scrapyモジュールをインポート

  1. とにかく、以下の修飾スパイダーコードを参照してください。
  2. あなたが掻き取った実際のドメインを反映するようにallowed_domains.ie.com)が変更されました。
  3. start_requestsには、実際に何がある必要があるかが含まれています。parse_nodeloc要素にわたる反復は、iteratorおよびitertagの設定がXMLFeedSpiderのものになり、結果はparse_nodeに渡されます。その中のコードでは、Requestが商品詳細のうち、parse_itemに解析されています。
  4. parse_itemCatalogueItemにアクセスできないため、へのアクセス権がないため、dictの形式の項目が返されます。
+0

完璧、あなたの答えに非常に感謝します。他のページに自動的にリダイレクトするリンクはほとんどなかったので、リダイレクトを停止したいと思っていました。 – Pablo

1

あなたは私はあなたの条件にリダイレクトしないように理解していない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'] 
関連する問題