Клонирование mechanize.Browser выдает ошибку

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

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

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

    newbr = copy.deepcopy(br)

что вызывает ошибку.

Любые идеи?

С уважением, Крис


person Lacuno    schedule 03.03.2015    source источник
comment
Почему вы делаете копии экземпляра Browser?   -  person alecxe    schedule 03.03.2015
comment
Потому что я хочу перейти по ссылке с несколькими потоками. Переход по ссылке изменяет состояние объекта, поэтому другие потоки не могут сделать то же самое.   -  person Lacuno    schedule 03.03.2015


Ответы (1)


Я столкнулся с аналогичной проблемой, описанной в этом сообщении 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!
person StackG    schedule 21.06.2015