我试图编写以下代码,我试图在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')]
答案 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')]
因此可以正确地将其解压缩为name
和value
循环
for name, value in whatever.addheaders:
您必须添加'User-agent'
属性名称(除了浏览器名称之外,您还可以传递其他不常见的参数)
答案 2 :(得分:1)
让我尝试部分回答您的问题:
添加“浏览器标题”是正确的。许多服务器可能会完全断开您的连接,因为这是被机器人抓取的明确信号。
mechanize
“是用于程序化Web浏览的工具” 。
这意味着它主要用于抓取网页,解析其内容,填写表单,单击内容,发送请求,但不使用带有CSS渲染等部分的“真实”网络浏览器。例如,您无法打开页面并进行屏幕截图,因为其中没有“渲染”的内容,而要实现此目的,您需要保存页面并使用其他解决方案进行渲染。
如果适合您的需要,请检查headless browsers作为一项技术,其中有很多个。在mechanize
之外的Python生态系统中,我会检查"headless chromium",因为"phantomjs"不幸地停产了。
但是,如果我理解正确,则需要使用实际的网络浏览器来打开网页,对吗?因此,您实际上需要在系统中使用浏览器来解决这个问题!
找出浏览器的可执行文件在系统中的位置。例如,我的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将打开新窗口,其中一个窗口用于您提供的每个链接。
然后出现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)