Отправка формы на OKCupid с использованием RoboBrowser

Я пытаюсь написать код Python, который делает следующее:

1) Вход в OKCupid

2) Переход на страницу вопросов пользователей

3) Отвечает на оставшийся без ответа вопрос.

Я использую RoboBrowser для этого. Я могу выполнить шаги 1), 2) и получить форму вопроса, который я хочу отправить, но как только я отправляю (используя отправку в RoboBrowser), кажется, что он не доходит до OKCupid (поскольку вопрос не зарегистрирован как отвечал в моем профиле).

Вот код, который у меня есть. Обратите внимание, что My_RoboBrowser просто позволяет мне передать False в RoboBrowser.open для аргумента проверки.

class My_RoboBrowser(RoboBrowser):
    def __init__(self, auth=None, parser=None, headers=None, user_agent=None, history=True):
        RoboBrowser.__init__(self, parser=None, user_agent=None, history=True)

    def Open(self, vURL, vVerify=True):
        response = self.session.get(vURL, verify=vVerify)
         self._update_state(response)

browser = My_RoboBrowser()
urlL = 'https://okcupid.com/login'

browser.open(url)

form = browser.get_form(id='loginbox_form')

form['username'] = 'Username'
form['password'] = 'Password'
browser.submit_form(form)

urlQ = 'https://www.okcupid.com/profile/USER/questions?low=1'
browser.open(urlQ)

Question_Tag = browser.find_all(class_="not_answered")[0]

ID = Question_Tag.get('data-qid')

#Get the form to fill out
Form = browser.get_form(id='answer_'+str(ID))
Form['my_answer'].value = '1'
Form['their_answer'].value = ['1']
Form['importance'].value = '1'
browser.submit_form(Form)

Также, если это полезно, когда я смотрю на объект формы Form в блокноте IPython, он говорит:

<RoboForm my_answer=, their_answer=[], importance=>

до отправки и

<RoboForm my_answer=1, their_answer=['1'], importance=1>

после.

Наконец, если это полезно, ниже приведен код для одной из форм, на которые я пытаюсь ответить (которая была получена путем проверки элемента)

<form id="answer_179268" name="answer_179268" class="answer_area okform initialized"> 
<div class="container my_answer">  
   <input id="my_answer_1_179268" name="my_answer" value="1" false="" type="radio"> 
   <label class="radio" for="my_answer_1_179268">
      <span class="icon"></span>
         Yes
      </label>  
      <input id="my_answer_2_179268" name="my_answer" value="2" false="" type="radio"></input> 
   <label class="radio" for="my_answer_2_179268">
      <span class="icon"></span>
      No
      </label>  
   </div> 
<div class="container acceptable_answers">  
   <div class="title"> 
      <p>Answer(s) you’ll accept</p> 
   </div>   
   <label class="checkbox acceptable_answer" for="their_answer_1_179268">
      <input id="their_answer_1_179268" class="acceptable_answer" name="their_answer" value="1" false="" type="checkbox"></input>
      <span class="icon"></span>
       Yes
       </label>   

<label class="checkbox acceptable_answer" for="their_answer_2_179268">
   <input id="their_answer_2_179268" class="acceptable_answer" name="their_answer" value="2" false="" type="checkbox"></input?
      <span class="icon"></span>
       No
      </label>    
<label class="checkbox irrelevant" for="their_answer_any_179268">
   <input id="their_answer_any_179268" class="irrelevant" name="their_answer" value="irrelevant" type="checkbox"></input>
      <span class="icon"></span>
      Any of the above
      </label> 
   </div> 
<div class="container importance"> 
   <div class="title"> 
      <p>Importance</p> 
   </div> 
<div class="importance_radios">  
   <input id="importance_179268_5" name="importance" value="5" false="" type="radio"></input>
   <label class="importance_5 radio" for="importance_179268_5" data-count="5">
      <span class="icon"></span> 
      <div class="bar"></div> 
      <span class="label"></span> 
   </label>  
      <input id="importance_179268_4" name="importance" value="4" false="" type="radio"></input>
   <label class="importance_4 radio" for="importance_179268_4" data-count="4">
      <span class="icon"></span> 
   <div class="bar"></div> 
      <span class="label">A little</span> 
   </label>  
      <input id="importance_179268_3" name="importance" value="3" false="" type="radio"></input>
   <label class="importance_3 radio" for="importance_179268_3" data-count="3">
      <span class="icon"></span> 
   <div class="bar"></div> 
      <span class="label">Somewhat</span> 
</label>  
   <input id="importance_179268_2" name="importance" value="2" false="" type="radio"> </input>
<label class="importance_2 radio" for="importance_179268_2" data-count="2">
      <span class="icon"></span> 
   <div class="bar"></div> 
      <span class="label"></span> 
</label>  
      <input id="importance_179268_1" name="importance" value="1" false="" type="radio"> </input>
   <label class="importance_1 radio" for="importance_179268_1" data-count="1">
      <span class="icon"></span> 
   <div class="bar"></div> 
      <span class="label">Very</span> 
</label>  
</div> 
   <div class="irrelevant_message"> 
   <span class="irrelevant_text">Irrelevant</span> 
      <span class="message_text">(Because you’ll accept any answer, this question is marked irrelevant)</span> 
   </div> 
</div> 
<div id="explanation_container_179268" class="container explanation"> 
   <div id="answer_179268_explanationContainer" class="inputcontainer textarea noresize empty">
      <textarea id="answer_179268_explanation" class="noresize" placeholder="Explain your answer (optional)" false=""></textarea>
    <span class="message empty" style="height: 0"></span>
   <div class="icon"></div>
</div> 
</div>  
<button id="submit_btn_179268" class="submit_btn flatbutton disabled small">Answer</button>
<button id="cancel_btn_179268" class="cancel_btn flatbutton silver small">Cancel</button> 
   <a class="skip_btn inner" href="javascript:void(0)" draggable="false">Skip question</a>  
   <div id="public_container_179268" class="answer_privately">  
   <label class="checkbox" for="private_179268">
   <input id="private_179268" false="" type="checkbox"></input>
      <span class="icon"></span> 
       <span class="text">Answer privately</span> 
   </label> 
   </div>  
</form>

2 ответа

Я видел несколько случаев, когда кто-то не мог отправить, потому что сайт использовал Javascript для отправки форм. Другими словами, они могли использовать Robobrowser или Mechanize, чтобы войти в систему и заполнить форму, но сама форма не могла быть отправлена ​​- так как представление основывалось на JS. Это может быть вашей проблемой здесь. Если это так, попробуйте использовать Selenium.

Скорее всего, вы можете проверить, используется ли JS для отправки в инспекторе вашего браузера. <ctrl + shift + i / network / *clear* inspector's network panel before clicking submit / click submit / check type for your Post>

Я думаю, что так я и проверил, но другие здесь знают лучше, чем я. Удачи!

Вы должны взглянуть на https://github.com/IvanMalison/okcupyd. Это позволит вам сделать это без использования браузера.

Другие вопросы по тегам