如何通过Mechanize模拟支持JavaScript的浏览器?

时间:2016-01-27 14:41:26

标签: javascript python mechanize user-agent keep-alive

我正在使用Python脚本(Mechanize)登录代理门户。我可以成功登录。我可以从read()函数检查一下。

但是,成功登录后,我无法通过代理访问被阻止的网站。所以我检查了FF的HTTP头,发现Connection: Keep-alive。但是从mechanize开始,我找到了Connection: close。我尝试使用browser.addheaders完全模仿HTTP标头,但是这不起作用:(

经过深入挖掘后,我发现了一些服务器关闭连接的建议,因为机械化无法完全模拟浏览器,因为网页包含JS mechanize不支持

那么,有没有办法模仿(让服务器感觉)机械化是浏览器(支持JS),即使它没有?

顺便说一下,我不需要JS,我可以像上面提到的那样成功登录。请不要建议PhantomJS。 我需要一个Python包才能完成这项工作而不是无头浏览器。

更新

FireFox标题:

GET xxx HTTP/1.1
Host: xxx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: DSLastAccess=1454082611
Connection: keep-alive


HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Set-Cookie: DSEPAgentInstalled=; path=/; expires=Tue, 31-Jan-2006 16:18:32 GMT; secure
Date: Fri, 29 Jan 2016 16:18:32 GMT
x-frame-options: SAMEORIGIN
Connection: Keep-Alive
Keep-Alive: timeout=15
Pragma: no-cache
Cache-Control: no-store
Expires: -1
Transfer-Encoding: chunked

机械化添加标题:

browser.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),\
            ('Accept-Language', 'en-US,en;q=0.5'),\
            ('Accept-Encoding', 'gzip, deflate'),\
            ('Host', 'xxx.net'),\
            ('Connection','keep-alive'),\
            ('Cookie', 'DSLastAccess=1454082611'),\
            ('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0')]

机械化标题

send: 'CONNECT xxx.net:443 HTTP/1.0\r\n'
send: '\r\n'
send: 'GET xxx.cgi HTTP/1.1\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nHost: xxx.net\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0\r\nConnection: close\r\nCookie: DSLastAccess=1454082611\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Type: text/html; charset=utf-8
header: Set-Cookie: DSEPAgentInstalled=; path=/; expires=Tue, 31-Jan-2006 16:31:03 GMT; secure
header: Date: Fri, 29 Jan 2016 16:31:03 GMT
header: x-frame-options: SAMEORIGIN
header: Connection: close
header: Pragma: no-cache
header: Cache-Control: no-store
header: Expires: -1

另一件令我疯狂的事情是,来自Connection的已发送mechanize: close即使我已将其设为keep-alive,您可以在{addheaders中看到1}}

1 个答案:

答案 0 :(得分:8)

对于Linux

最重要的是,我知道有些人不仅仅想要切换到另一个选项。但是,我相信如果您想在登录后完全访问该页面(由于没有javascript支持而导致当前失败),您应该考虑使用Selenium

您可以快速sudo pip install selenium抓住它。

访问网页就像宣布浏览器一样简单,然后告诉浏览器转到所需的网页。在这里,我附上了一个基本的示例,使您的浏览器转到网页,使用的页面严重依赖于javascript:

import selenium
from selenium import webdriver

try:
    browser = webdriver.Firefox()
    browser.get('mikekus.com')
except KeyboardInterrupt:
    browser.quit()

这很有效,因为selenium实际上会打开一个浏览器。但是,如果您希望隐藏浏览器,那么您不必查看它并将其放在任务栏中。

我建议使用pyvirtualdisplay进行以下设置,这将使用visible=0隐藏浏览器。值得注意的是pyvirtualdisplay是Xvfb的包装器,因此也需要你安装它。您可以使用sudo apt-get install xvfb

来获取它
import selenium
from selenium import webdriver
from pyvirtualdisplay import Display


try:
    display = Display(visible=0, size=(800, 600))
    display.start()
    browser = webdriver.Firefox()
    browser.get('mikekus.com')

except KeyboardInterrupt:
    browser.quit()
    display.stop()

我将填写登录表格等等。对于您来说,如果您阅读文档非常简单,就像每个人都应该这样。 Navigating With Selenium

当然,在您的情况下,您尝试访问代理,然后访问另一个站点。此方法意味着您可以通过访问页面上的字段将代理从代理页面本身引导到网页。我确定有一点时间你可以继续导航到多个页面和页面元素,再次进行一些研究。

我希望这会有所帮助。祝你好运。