Если проблема заключается в одновременном посещении большего количества URL-адресов, вы можете посещать их по одному, используя сигнал spider_idle ( https://docs.scrapy.org/en/latest/topics/signals.html. ).
Идея состоит в следующем:
1.start_requests посещает только первый URL-адрес
2. когда паук бездействует, метод spider_idle называется
3. метод spider_idle удаляет первый URL и посещает второй URL
4.так на ...
Код будет примерно таким (я не пробовал):
class SlfSpider1Spider(CrawlSpider):
name = 'slf_spider1'
custom_settings = { 'CONCURRENT_REQUESTS': '1' }
allowed_domains = ['gipfelbuch.ch']
start_urls = ['https://www.gipfelbuch.ch/gipfelbuch/touren/seite/'+str(i) for i in [1,650]]
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(SlfSpider1Spider, cls).from_crawler(crawler, *args, **kwargs)
# Here you set which method the spider has to run when it gets idle
crawler.signals.connect(spider.spider_idle, signal=signals.spider_idle)
return spider
# Method which starts the requests by vicisting all URLS specified in start_urls
def start_requests(self):
# the spider visits only the first provided URL
url = self.start_urls[0]:
print('#### START REQUESTS: ',url)
yield scrapy.Request(url, callback=self.parse_verhaeltnisse, dont_filter=True)
def parse_verhaeltnisse(self,response):
links = response.xpath('//td//@href').extract()
for link in links[0:2]:
print('##### PARSING: ',link)
abs_link = 'https://www.gipfelbuch.ch/'+link
yield scrapy.Request(abs_link, callback=self.parse_gipfelbuch_item, dont_filter=True)
def parse_gipfelbuch_item(self, response):
route = response.xpath('/html/body/main/div[4]/div[@class="col_f"]//div[@class="togglebox cont_item mt"]//div[@class="label_container"]')
print('#### PARSER OUTPUT: ')
key=[route[i].xpath('string(./label)').extract()[0] for i in range(len(route))]
value=[route[i].xpath('string(div[@class="label_content"])').extract()[0] for i in range(len(route))]
fields = dict(zip(key,value))
print('Route: ', fields['Gipfelname'])
print('Comments: ', fields['Verhältnis-Beschreibung'])
print('Length of dict extracted from Route: {}'.format(len(route)))
return
# When the spider gets idle, it deletes the first url and visits the second, and so on...
def spider_idle(self, spider):
del(self.start_urls[0])
if len(self.start_urls)>0:
url = self.start_urls[0]
self.crawler.engine.crawl(Request(url, callback=self.parse_verhaeltnisse, dont_filter=True), spider)
Ожидайте создается для этого и может обработать ввод/вывод плюс тайм-ауты и т.д. Обратите внимание, что, если Вы не поклонник TCL, существует, Ожидают модули для Perl/Python/Java.
Править: Вышеупомянутая страница предлагает, чтобы Википедия Ожидала, что запись является полезным ресурсом :-)
В то время как не непосредственно связанный с Вашим вопросом, я рекомендовал бы использовать ssh вместо этого, поскольку можно выполнить определенные команды через него (плюс, он более безопасен по умолчанию).
Я использовал различные методы для сценариев сессий telnet под Unix, но самый простой является, вероятно, последовательностью эха и команд сна с их выводом, переданным по каналу в telnet. Передача по каналу вывода в другую команду является также возможностью.
Глупый пример
(echo password; echo "show ip route"; sleep 1; echo "quit" ) | telnet myrouter
Это (в основном) получает таблицу маршрутизации маршрутизатора Cisco.
Другой метод должен использовать netcat (или nc, зависящий от который posix) в том же формате как vatine шоу, или можно создать текстовый файл, который содержит каждую команду на своей собственной строке.
Я нашел, что некоторые posix' telnets не обрабатывают перенаправление правильно (который является, почему я предлагаю netcat),
Несколько вопросов:
Тем не менее я записал некоторый Java только что, чтобы говорить с несколькими поддерживающими IP удлинителями (BayTech RPC3s), который мог бы быть полезен для Вас. Если Вам будет интересно, то я буду видеть, могу ли я вскопать его и отправить его где-нибудь.