我尝试使用通用的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文档,但是缺少一些东西。我要去哪里错了?
答案 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