Хобрук: Ваш путь к мастерству в программировании

Python Selenium не работает внутри скраппи

У меня есть скрипт, который очищает продукты ebay, но на странице продукта мне нужно выбрать раскрывающийся список, ввести почтовый индекс и нажать кнопку «Подробнее», поэтому я использовал селен.

но по какой-то причине селен не работает внутри scrapy селен работал нормально, когда я тестировал код в интерпретаторе python

вот пример введите здесь описание изображения введите здесь описание изображения

код отлично работает на практике, но при запуске scrapy

не выбирает раскрывающийся список и переходит к следующему запросу

введите здесь описание изображения

Ключи отправки SCRAPY OUTPUT не работают, потому что раскрывающийся список не выбран при запуске scrapy, И ПОКА ПОЛЕ DROPDOWN НЕ ВЫБРАНО, ПОЛЕ ZIPCODE НЕ ПОЯВЛЯЕТСЯ

введите здесь описание изображения

вот код

    # -*- coding: utf-8 -*-
    import scrapy, time
    from urlparse import urljoin
    from selenium import webdriver
    
    
    class EbayspiderSpider(scrapy.Spider):
        name = "ebayspider"
        #allowed_domains = ["www.ebay.com"]
        start_urls = ['http://stores.ebay.com/Complete-Tractor/Other-/_i.html?_fsub=1&_sid=1159087983&_trksid=p4634.c0.m322']
    
        def parse(self, response):
     #INITIALLY STARTING THE WEB BROWSER
            self.driver = webdriver.Chrome()
            SET_SELECTOR = '.li.nol'
            for attr in response.css(SET_SELECTOR):
                linkse = '.v4lnk ::attr(href)'
                link = attr.css(linkse).extract_first()
                yield scrapy.Request(urljoin(response.url, link), callback=self.parse_link)
    
            next_page = 'td.next a ::attr(href)'
            next_page = response.css(next_page).extract_first()
            if next_page:
                yield scrapy.Request(urljoin(response.url, next_page), callback=self.parse)
    
        def parse_link(self, response):
       
   #GETTING THE URL
            self.driver.get(response.url)
   #CLICKING on the show button to show the form
            self.driver.find_element_by_id('viTabs_1').click()
   #SELECTING THE DROPDOWN
            el = self.driver.find_element_by_id('shCountry')
            for option in el.find_elements_by_tag_name('option'):
                if option.text == 'United States':
                    option.click()
                    break
   #FILLING IN THE ZIPCODE FIELD
            el = self.driver.find_element_by_id('shZipCode')
            el.send_keys("4883")
    #CLICKING THE GET BUTTON
            self.driver.find_element_by_name("getRates").click()
            price1 = self.driver.find_element_by_xpath('//*[@id="shippingSection"]/table/tbody/tr[2]/td[1]/div').text
            price2 = self.driver.find_element_by_xpath('//*[@id="shippingSection"]/table/tbody/tr[2]/td[2]/div').text
    
            try:
                print '\n\t', price1, '\t', price2
            except:
                pass

ТАК, что здесь происходит, почему это работает в интерпретаторе, но не внутри scrapy?

я не вижу, что не так, пожалуйста, укажите мне правильное направление

РЕДАКТИРОВАТЬ:

КОД HYML ДЛЯ ВЫПАДАЮЩЕГО СПИСКА

введите здесь описание изображения и введите здесь описание изображения

код

<tr>
                    <td width="53%" nowrap="nowrap">
                        <div id="shQuantityDiv" class="sh-InlCnt">
                            <div id="shQuantity-errIcn" class="sh-err-icon sh-err-hide"></div>  
                            <label class="sh-ShipDtl" for="shQuantity">Quantity:</label>
                            <input type="text" class="sh-TxtCnt" value="1" size="5" name="quantity" id="shQuantity">
                        </div>
                        <div id="shCountryDiv" class="sh-InlCnt sh-dropDownPadLeft active sel">
                            <div id="shCountry-errIcn" class="sh-err-icon sh-err-hide"></div>
                            <label class="sh-ShipDtl" for="shCountry">Change country:</label>
                            <select name="country" id="shCountry" class="sh-TxtCnt sh-InlCnt">
                                <option value="-99" selected="">-Select-</option>
                                <option value="7">American Samoa</option>
                                    <option value="10">Anguilla</option>
                                    <option value="11">Antigua and Barbuda</option>
                                    <option value="14">Aruba</option>
                                    <option value="15">Australia</option>
                                    <option value="16">Austria</option>
                                    <option value="18">Bahamas</option>
                                    <option value="21">Barbados</option>
                                    <option value="23">Belgium</option>
                                    <option value="24">Belize</option>
                                    <option value="32">British Virgin Islands</option>
                                    <option value="2">Canada</option>
                                    <option value="41">Cayman Islands</option>
                                    <option value="50">Cook Islands</option>
                                    <option value="51">Costa Rica</option>
                                    <option value="55">Cyprus</option>
                                    <option value="57">Denmark</option>
                                    <option value="60">Dominican Republic</option>
                                    <option value="69">Fiji</option>
                                    <option value="70">Finland</option>
                                    <option value="71">France</option>
                                    <option value="73">French Polynesia</option>
                                    <option value="77">Germany</option>
                                    <option value="79">Gibraltar</option>
                                    <option value="82">Grenada</option>
                                    <option value="84">Guam</option>
                                    <option value="94">Iceland</option>
                                    <option value="99">Ireland</option>
                                    <option value="101">Italy</option>
                                    <option value="102">Jamaica</option>
                                    <option value="104">Japan</option>
                                    <option value="105">Jersey</option>
                                    <option value="109">Kiribati</option>
                                    <option value="130">Malta</option>
                                    <option value="131">Marshall Islands</option>
                                    <option value="132">Martinique</option>
                                    <option value="226">Micronesia</option>
                                    <option value="144">Nauru</option>
                                    <option value="146">Netherlands</option>
                                    <option value="147">Netherlands Antilles</option>
                                    <option value="148">New Caledonia</option>
                                    <option value="149">New Zealand</option>
                                    <option value="153">Niue</option>
                                    <option value="154">Norway</option>
                                    <option value="157">Palau</option>
                                    <option value="158">Panama</option>
                                    <option value="159">Papua New Guinea</option>
                                    <option value="164">Portugal</option>
                                    <option value="165">Puerto Rico</option>
                                    <option value="183">Solomon Islands</option>
                                    <option value="186">Spain</option>
                                    <option value="192">Sweden</option>
                                    <option value="193">Switzerland</option>
                                    <option value="201">Tonga</option>
                                    <option value="206">Turks and Caicos Islands</option>
                                    <option value="207">Tuvalu</option>
                                    <option value="3">United Kingdom</option>
                                    <option value="1" selected="">United States</option>
                                    <option value="213">Vanuatu</option>
                                    <option value="217">Virgin Islands (U.S.)</option>
                                    <option value="218">Wallis and Futuna</option>
                                    <option value="220">Western Samoa</option>
                                    </select>
                            </div>
                        <div aria-live="assertive" role="alert" id="shQuantity-errTxt" class="sh-err-text sh-err-hide">There are 15 items available. Please enter a number less than or equal to 15.</div>
                        <div aria-live="assertive" role="alert" id="shCountry-errTxt" class="sh-err-text sh-err-hide">Select a valid country.</div>
                    </td>
                    <td width="47%">
                        <div aria-live="assertive" role="alert" class="sh-InlCnt sh-float-l" id="shZipCodeDiv" style="display: block;">
                            <div id="shZipCode-errIcn" class="sh-err-icon sh-err-hide"></div>                                       
                            <label class="sh-ShipDtl" for="shZipCode" id="shZipCodeTextDiv">ZIP Code:</label>
                            <div class="sh-ZipAln sh-InlCnt">
                                <input type="text" class="sh-TxtCnt" name="zipCode" size="12" id="shZipCode" value="4883">
                            </div>
                            <div id="shZipCode-errTxt" class="sh-err-text sh-err-hide">Please enter a valid ZIP Code.</div>
                            <div id="shZipCode-errTxt2" class="sh-err-text sh-err-hide">Please enter 5 or 9 numbers for the ZIP Code.</div>
                        </div>
                        <div aria-live="assertive" role="alert" id="shGetRatesDiv" class="sh-InlCnt active sel" style="display: inline;">
                            <input type="button" class="sh-BtnTxt btn btn-s btn-ter" name="getRates" id="shGetRates" value="Get Rates">
                        </div>
                    </td>
                </tr>

Ответы:


1

Похоже, вы пытаетесь отправить значение в поле input, которое в данный момент не отображается. Когда вы используете оболочку Python для выполнения команд, вы работаете с уже отрендеренной страницей, поэтому обязательное поле input видно, и все работает нормально, но ваш скрипт работает по-другому... Вы можете попробовать подождать некоторое время, пока оно не станет видимым, как показано ниже. :

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as wait


element = wait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "shCountry")))
select = Select(element)
select.select_by_visible_text("United States")
wait(self.driver, 10).until(EC.visibility_of_element_located((By.ID, "shZipCode"))).send_keys("4883")
08.05.2017
  • не работает, я думаю, проблема в раскрывающемся поле, раскрывающееся поле не выбрано, и пока не будет выбрано раскрывающееся поле, поле почтового индекса не появится 08.05.2017
  • но код выбора выпадающего поля работает в интерпретаторе 08.05.2017
  • но я должен был включить это 08.05.2017
  • из импорта selenium.webdriver.support.ui Выберите 08.05.2017
  • и мне нужно было получить текст, который я извлекал, как вы мне показываете, но с помощью xpath, поэтому я повозился с кодом, и это сработало с первого раза. 08.05.2017
  • price1 = ждать(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id=shippingSection]/table/tbody/tr[2]/td[1]/div') )).text и, например, price2 = wait(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id=shippingSection]/table/tbody/tr[2]/ тд[1]/дел'))).текст 08.05.2017
  • мне пришлось написать это так, чтобы получить текст с помощью xpath, большое спасибо 08.05.2017
  • Новые материалы

    Мой процесс подачи заявки в Школе программного обеспечения и дизайна Тьюринга
    Мой последний пост на Medium был в конце августа, и в нем я пообещал написать еще раз, рассказывая историю моего процесса подачи заявки в Школу программного обеспечения и дизайна Тьюринга ...

    Генерация ваших собственных удивительных QR-кодов с использованием Python
    QR-код (код быстрого ответа) — это разновидность матричных штрих-кодов (или двумерных штрих-кодов), изобретенных в 1994 году японской автомобильной компанией Denso Wave . Штрих-код —..

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..