2015-03-03 7 views
1

В настоящее время я пытаюсь отправить несколько запросов с объектом mechanize.Browser сразу, и мой подход состоял в том, чтобы запустить некоторые потоки. Каждая нить должна клонировать объект mechanize.Browser и отправлять запросы. Но копирование объекта вызывает TypeError:Клонирование mechanize.Browser дает ошибку

TypeError: object.__new__(cStringIO.StringO) is not safe, use cStringIO.StringO.__new__() 

Но я не могу понять, как заставить его работать. После открытия некоторых страниц я нерест нити и сделать:

newbr = copy.deepcopy(br) 

, который вызывает ошибку.

Любые идеи?

С наилучшими пожеланиями, Крис

+0

Почему вы делаете копии экземпляра «Браузер»? – alecxe

+0

Потому что я хочу перейти по ссылке с несколькими потоками. После ссылки изменяется состояние объекта, так что другие потоки не могут делать то же самое – Lacuno

ответ

1

Я сталкивался с подобной проблемой, так как имя на this SO сообщения.

Одно из решений заключается в том, чтобы перейти по ссылке, а затем использовать функцию br.back(), чтобы вернуться в исходное состояние позже.

Если это не сработает (это не для меня), если вы не против использования других библиотек, вы можете использовать очень хорошую библиотеку requests, чтобы перейти по ссылке. В моем случае я хотел заполнить форму и отправить ее либо post, либо get, что я смог сделать, используя следующий код (например, вместо ссылок следует использовать только незначительные изменения, используя цикл for links in br.links())

import mechanize 
import requests 

def testErrorCodes(br,theCodes): 
    for x in theCodes: 

     br.select_form(nr=0) 

     theAction = br.action 
     payload = {'code': x} 

     response = requests.post(theAction, data=payload) 
     print response.status_code 

br=mechanize.Browser() 
br.set_handle_robots(False) 
response = br.open("http://savanttools.com/test-http-status-codes") 

testErrorCodes(br,[401,402,403,404,500,503,504]) # Prints the error codes 

testErrorCodes(br,[404]) # The browser is still alive and well to be used again! 
Смежные вопросы