Scrapy Несколько циклов для нескольких URL - PullRequest
1 голос
/ 24 февраля 2020

Я могу заставить l oop работать отлично, за исключением того, что каждый раз получаю 3-4 цикла ... Я попытался удалить ссылку start_urls, но затем очистка перестала работать

import scrapy
from scrapy.http import Request, FormRequest
from scrapy.utils.response import open_in_browser

class PrinterSpider(scrapy.Spider):
    name = 'printers'
    start_urls = ['http://192.168.137.9', 'http://192.168.137.35', 'http://192.168.137.34', 'http://192.168.137.27', 'http://192.168.137.21' ]

    def parse(self, response):
        token = response.xpath('//*[@name="CSRFToken"]/@value').extract_first()
        yield  FormRequest.from_response(response, formnumber=1, formdata={
            'CSRFToken' : token,
            'B55d' : 'password',
            'loginurl' : '/general/status.html'
         }, callback=self.postlogin2)


    def  postlogin2(self,response):
         for i in self.start_urls:
            yield Request(
            url = i+"/general/information.html?kind=item",
            callback=self.action)

    def action(self,response):
        drum = response.xpath('//html[1]/body[1]/div[1]/div[1]/div[2]/div[2]/div[2]/div[1]/div[1]/div[2]/form[1]/div[7]/dl[1]/dd[1]/text()').extract()
        print(drum)
        for i in self.start_urls:
            yield Request(
            url = i+"/net/wired/tcpip.html",
            callback=self.action2)

    def action2(self, response):
        tcpip = response.xpath('//html[1]/body[1]/div[1]/div[1]/div[2]/div[2]/div[2]/div[1]/div[1]/div[2]/form[1]/div[4]/dl[1]/dd[2]/input[1]/@value').extract()
        print(tcpip)

1 Ответ

1 голос
/ 24 февраля 2020

Scrapy использует элементы из start_urls для запуска parse() - позже вы должны получить URL от response без l oop.

def postlogin2(self, response):
    yield Request(
        response.url + "/general/information.html?kind=item",
        callback=self.action)

, а точнее

def postlogin2(self, response):
    yield Request(
        response.urljoin("/general/information.html?kind=item"),
        callback=self.action)

или

def postlogin2(self, response):
    yield response.follow("/general/information.html?kind=item", callback=self.action)

Сделайте то же самое с другими циклами.

Сделайте c: Response.urljoin () , Response.follow ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...