如何在具有文本站点地图的网站上使用Scrapy网站地图蜘蛛?

时间:2018-09-24 20:17:51

标签: python scrapy sitemap

我尝试使用通用的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 :(得分:0)

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

答案 1 :(得分: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