我正在使用 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)
我不明白你要求不重定向。无论如何,请参阅下面修改后的蜘蛛代码:
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)
修改:
scrapy模块,如稍后在您使用的代码中所示scrapy.Request。allowed_domains( ) 以反映您抓取的实际域。.ie.comstart_requests包含了实际需要的内容parse_node。元素的迭代由和 的设置loc负责,结果被传递到。然后,里面的代码产生s 来解析 中的项目详细信息。iteratoritertagXMLFeedSpiderparse_nodeRequestparse_itemparse_item只是以格式生成项目dict,因为我无权访问您的CatalogueItem.| 归档时间: |
|
| 查看次数: |
1538 次 |
| 最近记录: |