Как использовать Scrapy Sitemap Spider на сайтах с текстовыми картами сайта? - PullRequest
0 голосов
/ 24 сентября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Вам нужно только переопределить _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 голосов
/ 25 сентября 2018

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

[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
...