Я попытался использовать общий 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, но чего-то не хватает. Где я иду не так?
Вам нужно только переопределить _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
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