haritalarınızda URL'ler ile CrawlSpider çalışması için ama görünüşe: Sadece geri aramasında sitemap_xml_xpath
rules
üst kısmında bir kural eklemek ve düzenlemek için ihtiyaç CrawlSpider
does not process XML responses gibi. Dolayısıyla, onları kabul etmek için _requests_to_follow
'u geçersiz kılmanız gerekir. İşte
Sana
/urlset/url/loc
sayfaları ayrıştırmak istiyorum nasıl bağlı
from scrapy.spiders.crawl import CrawlSpider, Rule
from scrapy.link import Link
from scrapy.http import Request
class XmlLinkExtractor():
def __init__(self, xpath, namespaces):
self.xpath = xpath
self.namespaces = namespaces
def extract_links(self, response):
selector = response.selector
if self.namespaces:
for i, ns in self.namespaces.items():
selector.register_namespace(i, ns)
for link in selector.xpath(self.xpath).extract():
yield Link(link)
class ExampleSitemapCrawlSpider(CrawlSpider):
name = "myspider"
start_urls = (
# link to a sitemap index file
'http://www.example.com/sitemap.gz',
# link to a sitemap file
#'http://www.example.com/sitemaps/sitemap-general.xml',
)
rules = (
# this handles sitemap indexes, following links to other sitemaps
Rule(XmlLinkExtractor('/sm:sitemapindex/sm:sitemap/sm:loc/text()',
{"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}),),
# this is for "leaf" pages in sitemaps
Rule(XmlLinkExtractor('/sm:urlset/sm:url/sm:loc/text()',
{"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}),
# here, defining the callback without follow=True
# makes the crawler stop at these pages level,
# not following deeper links
# unset the callback if you want those pages
# to go through other rules once downloaded
callback='parse_loc'),
# ... other rules
)
def _requests_to_follow(self, response):
# we need to override `_requests_to_follow`
# and comment these 2 lines, because they filter XML responses
#if not isinstance(response, HtmlResponse):
# return
seen = set()
for n, rule in enumerate(self._rules):
links = [lnk for lnk in rule.link_extractor.extract_links(response)
if lnk not in seen]
if links and rule.process_links:
links = rule.process_links(links)
for link in links:
seen.add(link)
r = Request(url=link.url, callback=self._response_downloaded)
r.meta.update(rule=n, link_text=link.text)
yield rule.process_request(r)
def parse_loc(self, response):
self.logger.debug("parsing %r" % response)
(a sitemapindex içeren) ile başlamak için sitemap.gz
URL ile çalıştı örnek örümcek, farklı olan geri farklı URL'ler yönlendirmek isteyebilirler (Farklı kurallar ekleyerek ve filtrelemeye izin vermek için XmlLinkExtractor
'u özelleştirerek (veya süzmek için XPath'i kullanacak şekilde)
Teşekkürler Paul, fark ettiğim bir başka şey de Steven'ın da doğru cevabı var. Sorun, xraw sayfalarıyla başladığımda (start_urls'u xml olarak ayarladıysam), taramayı kullanan kişide. Eğer bir html sayfası ile başlayacağım ve daha sonra bir xml sayfasına gidersiniz, taramalı süvari, Steven'ın cevabıyla hile yapıyor gibi görünüyor. Yardımlarınız için hepinize teşekkür ederim. Geç cevap verdiğim için özür dilerim. – Saitx