Scrapy & Selenium: как вызвать метод в цикле - PullRequest
1 голос
/ 23 сентября 2019

Я уже нашел подобные вопросы здесь, но мой сканер все еще не работает.

Я пытаюсь сканировать несколько URL-адресов, которые я извлекаю из txt.file.Это работает правильно.Однако scrapy / selenium открывает браузер для каждого URL один за другим, но не запускает функцию «crawltips».Только для последнего URL в моем txt.file выполняется код в def crawltips(self, response):.

Как я могу вызвать функцию "crawltips" для каждого URL в моем txt.file?

class AlltipsSpider(Spider):
    name = 'allclasses'
    allowed_domains = ['dummy.com']



    def start_requests(self):

        self.driver = webdriver.Chrome('C:\webdrivers\chromedriver.exe')
        with open("urls.txt", "rt") as f:
            start_urls = [l.strip() for l in f.readlines()]

        for url in start_urls:
            self.driver.get(url)
            self.driver.find_element_by_id('currentTab').click()
            self.driver.find_element_by_xpath('//*[@id="_blog-menu"]/div[2]/div/div[2]/a[3]').click()
            yield Request(self.driver.current_url, callback=self.crawltips)


    def crawltips(self, response):


        sel = Selector(text=self.driver.page_source)
        allposts = sel.xpath('//*[@class="block media _feedPick feed-pick"]')
        for post in allposts:
            username = post.xpath('.//div[@class="col-sm-7 col-lg-6 no-padding"]/a/@title').extract()
            publish_date = post.xpath('.//*[@class="bet-age text-muted"]/text()').extract()


            yield{'Username': username,
                'Publish date': publish_date                
                }

1 Ответ

1 голос
/ 23 сентября 2019

Насколько я понимаю, WebDriver может одновременно фокусироваться только на одной вкладке (окне).Во время выполнения цикла выбирается последний URL-адрес и выполняются там функции.

Для решения необходимо найти количество вкладок на основе количества URL-адресов и переключиться обратно на каждый URL-адрес после завершения следующегоone.

Например:

  • browser.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB) - перейти на новую вкладку и активно работать с ней (используйте Keys.SHIFT для вкладок с обратным словом)
  • driver.switch_to.window(driver.window_handles[i]) - Использование табуляции (i).
...