Механизация: слишком много значений для распаковки (ожидается 2) - PullRequest
0 голосов
/ 05 февраля 2019

Я пытался написать следующий код, я пытаюсь написать код в Python 3.7, который просто открывает веб-браузер и веб-сайт, которому он подается в Command Line:

Example.py

import sys

from mechanize import Browser
browser = Browser()

browser.set_handle_equiv(True)
browser.set_handle_gzip(True)
browser.set_handle_redirect(True)
browser.set_handle_referer(True)
browser.set_handle_robots(False)

# pretend you are a real browser
browser.addheaders = [('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36')]

listOfSites = sys.argv[1:]
for i in listOfSites:
    browser.open(i)

Я ввел следующую команду в cmd:

python Example.py https://www.google.com

И у меня есть следующая трассировка:

Traceback (most recent call last):
  File "Example.py", line 19, in <module>
    browser.open(i)
  File "C:\Python37\lib\site-packages\mechanize\_mechanize.py", line 253, in open
    return self._mech_open(url_or_request, data, timeout=timeout)
  File "C:\Python37\lib\site-packages\mechanize\_mechanize.py", line 283, in _mech_open
    response = UserAgentBase.open(self, request, data)
  File "C:\Python37\lib\site-packages\mechanize\_opener.py", line 188, in open
    req = meth(req)
  File "C:\Python37\lib\site-packages\mechanize\_urllib2_fork.py", line 1104, in do_request_
    for name, value in self.parent.addheaders:
ValueError: too many values to unpack (expected 2)

Я очень новичок в Python.Это мой первый код здесь.Я застрял с вышеупомянутой трассировкой, но пока не нашел решения.Я также искал много вопросов о SO сообществе, но, похоже, они не помогли.Что мне делать дальше?

ОБНОВЛЕНИЕ:

Как предложил @ Jean-François-Fabre, в своем ответе я добавил 'User-agent' в заголовок,теперь нет отслеживания, но все же есть проблема, из-за которой мою ссылку нельзя открыть в браузере.

Вот как addheader выглядит сейчас:

browser.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36')]

Ответы [ 5 ]

0 голосов
/ 11 февраля 2019

Вот, пожалуйста:)

import sys
from mechanize import Browser, Request


browser = Browser()

browser.set_handle_equiv(True)
browser.set_handle_gzip(True)
browser.set_handle_redirect(True)
browser.set_handle_referer(True)
browser.set_handle_robots(False)

# setup your header, add anything you want
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1', 'Referer': 'http://whateveritis.com'}


url_list = sys.argv[1:]
for url in url_list:
    request = Request(url=url, data=None, headers=header)
    response = browser.open(request)
    print(response.read())
    response.close()
0 голосов
/ 11 февраля 2019

Позвольте мне попытаться ответить на ваш вопрос по частям:

  • Вы правильно добавили "Заголовки браузера".Многие серверы могут напрямую разорвать ваше соединение, поскольку это явный признак того, что бот сканируется.

  • mechanize, как указано в docs ",инструмент для программного просмотра веб-страниц ".
    Это означает, что он в основном используется для сканирования веб-страниц, анализа их содержимого, заполнения форм, щелчка мышью по вещам, отправки запросов, но без использования" настоящего "веб-браузера с частямитакие как рендеринг CSS.Например, вы не можете открыть страницу и сделать снимок экрана, так как там нет чего-то «отрендеренного», и для этого вам нужно сохранить страницу и отобразить ее, используя другое решение.

  • Если вам это подходит, проверьте безголовые браузеры в качестве технологии, их много .В экосистеме Python, кроме mechanize, я бы проверил "хром без головы" , так как "phantomjs" , к сожалению, больше не поддерживается.

Но если я правильно понимаю, вам нужен реальный веб-браузер, чтобы открыть веб-страницу, верно?По этой причине вам действительно нужен браузер в вашей системе, чтобы позаботиться об этом!

Случай 1: Используйте браузер вашей родной системы

Узнайте, где исполняемый файл вашего браузера лежит в вашемсистема.Например, мой исполняемый файл Firefox находится в "C:\Program Files\Mozilla Firefox\firefox.exe" и , добавьте его в PATH .

. Когда вы используете Windows, используйте меню «Пуск», чтобы перейти к Advanced System Settings --> Advanced --> Environment Variables, и добавьтепуть выше к вашей переменной PATH.

Если вы используете Linux, export PATH=$PATH:"/path/to/your/browser" позаботится обо всем.

Тогда ваш код может работать так же просто, как

import subprocess
import sys

listOfSites = sys.argv[1:]
links = ""
for i in listOfSites:
    links += "-new-tab " + i
print(links)
subprocess.run(["firefox", links])

Firefox откроет новые окна, по одному на каждую из предоставленных вами ссылок.

Пример 2. Использование селена

Затем наступает Селен , который, на мой взгляд, является наиболее зрелым решением проблем, связанных с браузером, и тем, что использует большинство людей.Я использовал его в производственных условиях с очень хорошими результатами.Он предоставляет как пользовательский интерфейс / интерфейс браузера, который отображает веб-страницы, так и позволяет программно работать с этими веб-страницами.

Требуется некоторая настройка (например, если вы используете Firefox, выВам нужно будет загрузить исполняемый файл geckodriver со страницы релизов , а затем снова добавить его в переменную PATH.

Затем вы определяете свой веб-драйвер, порождаете по одному для каждого из сайтов.вам нужно посетить и get веб-страницу. Вы также можете сделать снимок экрана в качестве доказательства правильности отображения страницы.

from selenium import webdriver
import sys

listOfSites = sys.argv[1:]
for i in listOfSites:
    driver = webdriver.Firefox()
    driver.get('http://'+i)
    driver.save_screenshot(i+'-screenshot.png')

# When you're finished
# driver.quit()

Я протестировал оба этих фрагмента кода, и ониработать как положено. Пожалуйста, дайте мне знать, как все это звучит, и если вам нужна дополнительная информация ..! ^^

0 голосов
/ 05 февраля 2019

Я только что нашел способ обойти эту проблему, даже если вышеуказанная проблема все еще существует.Я публикую это только для того, чтобы читатели знали, что мы можем сделать это и так:

Вместо использования пакета mechanize мы можем использовать пакет webbrowser и написать следующий код Python в Example.py :

import webbrowser
import sys

#This is an upgrade suggested by @Jean-François Fabre
listOfSites = sys.argv[1:]

for i in listOfSites:
    webbrowser.open_new_tab(i)

Затем мы можем запустить этот код Python, выполнив следующую команду в терминале / командной строке:

python Example.py https://www.google.com https://www.bing.com

Эта команда, упомянутая выше в примере, будет открывать два сайта одновременно.Один из них Google, а другой Bing

0 голосов
/ 07 февраля 2019

То же, что и выше.Думаю, я не прочитал все ответы, прежде чем копаться. LOL

import sys
import webbrowser

from mechanize import Browser
browser = Browser()

browser.set_handle_equiv(True)
browser.set_handle_gzip(True)
browser.set_handle_redirect(True)
browser.set_handle_referer(True)
browser.set_handle_robots(False)

# pretend you are a real browser
browser.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36')]

listOfSites = sys.argv[1:]
for i in listOfSites:
    webbrowser.open(i)
0 голосов
/ 05 февраля 2019

Я вообще не знаю mechanize, но могут помочь трассировка и имена переменных (и некоторые поиски в Google).

Вы инициализируете addheaders списком строк.В некоторых других примерах (например: Механизация Python и метод addheader - как узнать новейшие заголовки? ) показан список tuple s, которые, похоже, соответствуют трассировке.Пример:

browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

, поэтому он правильно распаковывается в name и value в цикле

for name, value in whatever.addheaders:

Вы должны добавить имя свойства 'User-agent' (вы можете передать другое меньшеобщие параметры, чем имя браузера)

...