【问题标题】:Python Selenium not working inside scrapyPython Selenium在scrapy中不起作用
【发布时间】:2017-10-06 22:16:58
【问题描述】:

我有一个抓取 ebay 产品的脚本,但是在产品页面中我需要选择一个下拉列表,输入一个邮政编码并单击获取详细信息按钮,所以我使用了 selenium

但由于某种原因,当我在 python 解释器中测试代码时,selenium 在scrapy selenium 中无法正常工作

这是一个例子

代码在实践中运行良好 但是在运行scrapy时

它不选择下拉菜单并跳到下一个请求

SCRAPY OUTPUT 发送键不起作用,因为在运行 scrapy 时未选择下拉菜单,并且在选择下拉字段之前,邮政编码字段将不会出现

这是代码

    # -*- 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>

【问题讨论】:

    标签: python selenium web-scraping scrapy webdriver


    【解决方案1】:

    您似乎正在尝试将值发送到当前不可见的input 字段。当您使用Python shell 执行命令时,您使用的是已经渲染的页面,因此必需的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")
    

    【讨论】:

    • 不工作,我认为问题出在下拉字段中,下拉字段未选择,并且在选择下拉字段之前,邮政编码字段不会出现
    • 但下拉字段选择代码在解释器中工作
    • 但我必须包括这个
    • 从 selenium.webdriver.support.ui 导入选择
    • 我必须得到我正在提取的文本,就像你向我展示的那样,但是使用 xpath,所以我一直在乱搞代码,它第一次工作
    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 2017-09-08
    • 2018-08-25
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2018-12-04
    相关资源
    最近更新 更多