Попытка заполнить форму с помощью Scrapy FormRequest, неожиданные результаты

Я пытаюсь заполнить форму на www.wetseal.com/Stores, которая позволяет выбрать штат для отображения магазинов.

<form action="http://www.wetseal.com/Stores?dwcont=C73689620" method="post" id="dwfrm_storelocator_state">
                    <fieldset>



                        <div class="form-row required ">            
                            <label for="dwfrm_storelocator_address_states_stateUSCA">               
                                <span>State</span>              
                                <span class="required-indicator">*</span>

                            </label>
                            <select id="dwfrm_storelocator_address_states_stateUSCA" class="input-select required" name="dwfrm_storelocator_address_states_stateUSCA">              
                                <option value="">Select...</option>


                                    <option value="AK">Alaska</option>


                                    <option value="AZ">Arizona</option>


                                    <option value="AR">Arkansas</option>


                                    <option value="CA">California</option>


                                    <option value="CO">Colorado</option>


                                    <option value="CT">Connecticut</option>


                                    <option value="DE">Delaware</option>


                                    <option value="FL">Florida</option>


                                    <option value="GA">Georgia</option>


                                    <option value="HI">Hawaii</option>


                                    <option value="ID">Idaho</option>


                                    <option value="IL">Illinois</option>


                                    <option value="IN">Indiana</option>


                                    <option value="KS">Kansas</option>


                                    <option value="KY">Kentucky</option>


                                    <option value="MD">Maryland</option>


                                    <option value="MA">Massachusetts</option>


                                    <option value="MI">Michigan</option>


                                    <option value="MN">Minnesota</option>


                                    <option value="MS">Mississippi</option>


                                    <option value="MO">Missouri</option>


                                    <option value="NE">Nebraska</option>


                                    <option value="NV">Nevada</option>


                                    <option value="NH">New Hampshire</option>


                                    <option value="NJ">New Jersey</option>


                                    <option value="NM">New Mexico</option>


                                    <option value="NY">New York</option>


                                    <option value="NC">North Carolina</option>


                                    <option value="ND">North Dakota</option>


                                    <option value="OH">Ohio</option>


                                    <option value="OK">Oklahoma</option>


                                    <option value="OR">Oregon</option>


                                    <option value="PA">Pennsylvania</option>


                                    <option value="PR">Puerto Rico</option>


                                    <option value="RI">Rhode Island</option>


                                    <option value="SC">South Carolina</option>


                                    <option value="SD">South Dakota</option>


                                    <option value="TN">Tennessee</option>


                                    <option value="TX">Texas</option>


                                    <option value="VA">Virginia</option>


                                    <option value="WA">Washington</option>


                                    <option value="WV">West Virginia</option>


                                    <option value="WI">Wisconsin</option>

                            </select>
                        </div>                          
                        <button type="submit" name="dwfrm_storelocator_findbystate" value="Search">
                            Search
                        </button>
                    </fieldset>
                </form>

Глядя в Chrome, я вижу, как выполняется запрос и параметры формы:

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

Тем не менее, у меня есть очень простой паук, который, просматривая документы, отправляет FormRequest на этот URL-адрес для заполнения формы (в этом случае я тестирую магазины в Аризоне — AZ):

class WetSealStoreSpider(Spider):
    name = "wetseal_store_spider"
    allowed_domains = ["wetseal.com"]
    start_urls = [
        "http://www.wetseal.com/Stores"
    ]

    def parse(self, response):
        yield FormRequest.from_response(response,
                                    formname='dwfrm_storelocator_state',
                                    formdata={'dwfrm_storelocator_address_states_stateUSCA': 'AZ',
                                              'dwfrm_storelocator_findbystate': 'Search'},
                                    callback=self.parse1)

    def parse1(self, response):
        print response.status
        print response.body

Когда он делает FormRequest, глядя на ответ, все кажется в порядке:

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

Но в методе обратного вызова я вижу это в ответе:

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

Похоже, в конце был сделан запрос GET, и URL-адрес неверен:

'http://www.wetseal.com/Search?q=&dwfrm_storelocator_findbystate=Search&dwfrm_storelocator_address_states_stateUSCA=AZ'

Любая идея, что я делаю неправильно?

Спасибо!


person AlejandroVK    schedule 01.09.2015    source источник


Ответы (2)


Вы используете formname, но у формы нет имени.

Попробуйте вместо этого использовать formxpath='id("dwfrm_storelocator_state")'.

person Artur Gaspar    schedule 01.09.2015
comment
Это сделало это! Как я и подозревал, имя нельзя использовать, я думал, что Scrapy будет достаточно умен, чтобы также посмотреть атрибут id, но это не так: D, спасибо @Artur Gaspar - person AlejandroVK; 01.09.2015

попробуй это

states = response.xpath(
        ".//select[@id='dwfrm_storelocator_address_states_stateUSCA']//option[@value!='']/@value").extract()
    url = self.get_text_from_node(response.xpath("//form[@id='dwfrm_storelocator_state']/@action"))
    for state in states:
        form_data = {'dwfrm_storelocator_address_states_stateUSCA': state,
                     "dwfrm_storelocator_findbystate": "Search"}
        yield FormRequest(url,
                          formdata=form_data,
                          callback=self.your_Callback)
person Muhammad Usman    schedule 02.09.2015