[英]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,
}
修改:
scrapy
模块,稍后在代码中使用scrapy.Request
。 allowed_domains
( .ie
到.com
)以反映您抓取的实际域。 start_requests
包含parse_node
实际需要的parse_node
。 迭代过loc
元素被照顾iterator
和itertag
设置XMLFeedSpider
并将结果传递到parse_node
。 里面的代码,然后产生Request
S能够被解析项目细节parse_item
。 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.