Как использовать Scrapy Sitemap Spider на сайтах с текстовыми картами сайта?

1

Я попытался использовать общий Scrapy.spider, чтобы следить за ссылками, но это не сработало - поэтому я попытался упростить процесс, обратившись к файлу sitemap.txt, но это тоже не сработало!

Я написал простой пример (чтобы помочь мне понять алгоритм) паука, чтобы следить за сайтом, указанным на моем сайте: https://legion-216909.appspot.com/sitemap.txt Он предназначен для навигации по URL-адресам, указанным на sitemap, распечатать их на экране и вывести результаты в файл links.txt. Код:

import scrapy
from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    name = "spyder_PAGE"
    sitemap_urls = ['https://legion-216909.appspot.com/sitemap.txt']

    def parse(self, response):
        print(response.url)
        return response.url

Я запустил вышеперечисленного паука как Scrapy crawl spyder_PAGE > links.txt но вернул пустой текстовый файл. Я несколько раз просматривал документы Scrapy, но чего-то не хватает. Где я иду не так?

Теги:
scrapy
sitemap

2 ответа

0

Вам нужно только переопределить _parse_sitemap(self, response) из SitemapSpider следующим образом:

from scrapy import Request
from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
   sitemap_urls = [...]
   sitemap_rules = [...]
   def _parse_sitemap(self, response):
        # yield a request for each url in the txt file that matches your filters
        urls = response.text.splitlines()
        it = self.sitemap_filter(urls)
        for loc in it:
            for r, c in self._cbs:
                if r.search(loc):
                    yield Request(loc, callback=c)
                    break
0

SitemapSpider ожидает формат XML- SitemapSpider сайта, заставляя паука выйти с этой ошибкой:

[scrapy.spiders.sitemap] WARNING: Ignoring invalid sitemap: <200 https://legion-216909.appspot.com/sitemap.txt>

Поскольку ваш файл sitemap.txt - это просто список или URL-адреса, было бы проще просто разделить их на строковый метод.

Например:

from scrapy import Spider, Request

class MySpider(Spider):
    name = "spyder_PAGE"
    start_urls = ['https://legion-216909.appspot.com/sitemap.txt']

    def parse(self, response):
        links = response.text.split('\n')
        for link in links:
            # yield a request to get this link
            print(link)

# https://legion-216909.appspot.com/index.html
# https://legion-216909.appspot.com/content.htm
# https://legion-216909.appspot.com/Dataset/module_4_literature/Unit_1/.DS_Store

Ещё вопросы

Сообщество Overcoder
Наверх
Меню