Python Mechanize не будет правильно обрабатывать перенаправление - PullRequest
1 голос
/ 06 декабря 2011

Я работаю над скребком, используя Mechanize и Beautiful Soup в Python, и по некоторым причинам перенаправления не работают.Вот мой код (я прошу прощения за присвоение имен моим переменным "вещь" и "материал"; я обычно не делаю этого, поверьте мне):

stuff = soup.find('div', attrs={'class' : 'paging'}).ul.findAll('a', href=True)
    for thing in stuff:
        pageUrl = thing['href']
        print pageUrl

        req = mechanize.Request(pageUrl)

        response = browser.open(req)

        searchPage = response.read()

        soup = BeautifulSoup(searchPage)
        soupString = soup.prettify()
        print soupString

В любом случае, продукты на веб-сайте Kraft имеют более одногостраница результатов поиска отображает ссылку для перехода на следующую страницу.Например, в исходном коде this указана следующая страница для линейки соусов и маринадов Kraft, которая перенаправляет на this

В любом случае, thing['href'] имеетстарая ссылка в нем, потому что она очищает веб-страницу для него;можно было бы подумать, что выполнение browser.open() по этой ссылке заставит механизму перейти на новую ссылку и вернуть его в качестве ответа.Однако выполнение кода дает такой результат:

http://www.kraftrecipes.com/products/pages/productinfosearchresults.aspx?catalogtype=1&brandid=1&searchtext=a.1. steak sauces and marinades&pageno=2
Traceback (most recent call last):
File "C:\Development\eclipse\mobile development\Crawler\src\Kraft.py", line 58, in <module>
response = browser.open(req)
File "build\bdist.win-amd64\egg\mechanize\_mechanize.py", line 203, in open
File "build\bdist.win-amd64\egg\mechanize\_mechanize.py", line 255, in _mech_open
mechanize._response.httperror_seek_wrapper: HTTP Error 408: Request Time-out

Я получаю тайм-аут;Я думаю, это потому, что по какой-то причине Mechanize ищет старый URL-адрес и не перенаправляется на новый (я также пробовал это с urllib2 и получил тот же результат).Что здесь происходит?

Спасибо за помощь и дайте мне знать, если вам нужна дополнительная информация.

Обновление: Хорошо, я включил ведение журнала;теперь мой код выглядит так:

req = mechanize.Request(pageUrl)
print logging.INFO

Когда я запускаю его, я получаю следующее:

Аргумент url не является URI (содержит недопустимые символы) u 'http://www.kraftrecipes.com/products/pages/productinfosearchresults.aspx?catalogtype=1&brandid=1&searchtext=a.1. соусы и маринады для стейков & pageno = 2'20

Обновление 2 (которое произошло во время написания первого обновления): оказывается, это были пробелы в моей строке!Все, что мне нужно было сделать, это: pageUrl = thing['href'].replace(' ', "+"), и это прекрасно работает.

1 Ответ

2 голосов
/ 06 декабря 2011

Оба средства открытия urllib2 и mechanize по умолчанию включают обработчик ответов на перенаправление (вы можете проверить просмотр атрибута handlers), поэтому я не думаю, что проблема в том, что ответ на перенаправление неправильно соблюдается.

Чтобы устранить проблему, вы должны перехватить трафик в вашем веб-браузере (в Firefox Live HTTP заголовки и HttpFox полезны для этого)и сравните его с журналами вашего сценария (я бы порекомендовал создать подкласс urllib2.BaseHandler, чтобы создать собственный обработчик для записи всей информации, необходимой для каждого запроса, и добавить обработчик к вашему объекту открывания, используя метод add_handler).

...