机械化:太多值无法解包(预期2)

时间:2019-02-05 06:24:06

标签: python mechanize-python

我试图编写以下代码,我试图在Python 3.7中编写一个代码,该代码只是打开一个Web浏览器,并在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 :(得分:3)

即使以上问题仍然存在,我也已经找到解决该问题的方法。我发布此信息只是为了让读者知道我们也可以这样做:

我们可以使用mechanize软件包,而不是使用webbrowser软件包,并在 Example.py 中编写以下python代码:

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

答案 1 :(得分:1)

我一点也不知道mechanize,但是回溯和变量名(以及一些谷歌搜索)可以提供帮助。

您正在使用字符串列表初始化addheaders。其他一些示例(例如:Mechanize Python and addheader method - how do I know the newest headers?)显示了tuple的列表,这些列表似乎与回溯匹配。例如:

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')]

因此可以正确地将其解压缩为namevalue循环

for name, value in whatever.addheaders:

您必须添加'User-agent'属性名称(除了浏览器名称之外,您还可以传递其他不常见的参数)

答案 2 :(得分:1)

让我尝试部分回答您的问题:

  • 添加“浏览器标题”是正确的。许多服务器可能会完全断开您的连接,因为这是被机器人抓取的明确信号。

  • docs所说的
  • mechanize “是用于程序化Web浏览的工具”
    这意味着它主要用于抓取网页,解析其内容,填写表单,单击内容,发送请求,但不使用带有CSS渲染等部分的“真实”网络浏览器。例如,您无法打开页面并进行屏幕截图,因为其中没有“渲染”的内容,而要实现此目的,您需要保存页面并使用其他解决方案进行渲染。

  • 如果适合您的需要,请检查headless browsers作为一项技术,其中有很多个。在mechanize之外的Python生态系统中,我会检查"headless chromium",因为"phantomjs"不幸地停产了。

但是,如果我理解正确,则需要使用实际的网络浏览器来打开网页,对吗?因此,您实际上需要在系统中使用浏览器来解决这个问题!

案例1:使用本机系统的浏览器

找出浏览器的可执行文件在系统中的位置。例如,我的Firefox可执行文件位于"C:\Program Files\Mozilla Firefox\firefox.exe"add it to your 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:使用硒

然后出现Selenium,我认为这是解决与浏览器相关的问题以及大多数人使用的最成熟的解决方案。我在生产环境中使用过它,效果非常好。它不仅提供了呈现网页的浏览器的UI /前端,而且还允许您以编程方式使用这些网页。

它需要进行一些设置(例如,如果您使用的是Firefox,则需要从其releases page下载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()

我已经测试了这两个代码段,它们均按预期工作。请让我知道所有这些声音,以及是否需要更多其他信息。 ^^

答案 3 :(得分:1)

您在这里:)

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()

答案 4 :(得分:-1)

与上述相同。猜猜我在深入之前没有阅读所有答案。大声笑

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)