Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Mechanize模拟支持JavaScript的浏览器?_Javascript_Python_Mechanize_User Agent_Keep Alive - Fatal编程技术网

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

如何通过Mechanize模拟支持JavaScript的浏览器?,javascript,python,mechanize,user-agent,keep-alive,Javascript,Python,Mechanize,User Agent,Keep Alive,我正在使用Python脚本(Mechanize)登录到代理门户。我可以成功登录。我可以通过read()函数检查 但是,成功登录后,我无法通过代理访问被阻止的站点。所以我检查了FF中的HTTP头,发现连接:Keep-alive。但是在mechanize中,我找到了连接:close。我尝试使用browser.addheaders完全模仿FF中的HTTP头,但效果不太好:( 在深入挖掘之后,我发现了一些建议,建议服务器关闭连接,因为mechanize无法完全模拟浏览器,因为网页包含的JS不受mecha

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

但是,成功登录后,我无法通过代理访问被阻止的站点。所以我检查了FF中的HTTP头,发现
连接:Keep-alive
。但是在
mechanize
中,我找到了
连接:close
。我尝试使用
browser.addheaders
完全模仿FF中的HTTP头,但效果不太好:(

在深入挖掘之后,我发现了一些建议,建议服务器关闭连接,因为mechanize无法完全模拟浏览器,因为网页包含的JS不受
mechanize

那么,有没有一种方法可以模拟(让服务器感觉)mechanize是一种浏览器(支持JS),即使它不支持JS?

顺便说一句,我不需要JS,我可以如上所述成功登录。请不要建议使用PhantomJS。我需要一个Python包来完成这项工作,而不是一个无头浏览器

更新:

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')]
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')]
机械化添加头:

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
另一件让我抓狂的事情是,从
mechanize
发送的
连接是
:close
,即使我已将其设置为
保持活动状态
,正如您在linux的
addheaders
中看到的那样

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

您可以通过快速的
sudopip安装selenium来获取它

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

import selenium
from selenium import webdriver

try:
    browser = webdriver.Firefox()
    browser.get('mikekus.com')
except KeyboardInterrupt:
    browser.quit()
这是可行的,因为selenium实际上打开了一个浏览器。但是,如果你想隐藏浏览器,那么你不必看到它,也不必把它放在任务栏上

我建议使用以下设置,它将使用
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()
我将把填写登录表单等留给你,因为如果你像每个人一样阅读文档,那就很简单了

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


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

HTTP头中没有关于JS的内容。Keep alive可能与此无关。你可能应该发布HTTP头(请求和响应)在工作版本和非工作版本中。编辑会话cookie或其他内容,但检查它是否存在。@SergeySalnikov,谢谢你的回答。我不是说HTTP头中有关于JS的内容。我只是说,从HTTP头中我可以看出服务器关闭了连接。这可能是因为服务器n告诉我
mechanize
不是浏览器。它可以告诉我,因为它看不到对JS的支持。因此它将
mechanize
识别为非浏览器。你是说服务器在没有任何回复的情况下关闭连接吗?@SergeySalnikov,当然不是。我是说,当我检查服务器HTTP头时,它有
connection:close
a据我所知,HTTP服务器无法检测客户端javascript支持。最常用的检测客户端的方法是通过用户代理头属性。如果您按照@Sergeysalnikov的建议发布请求/响应头,那就太好了。感谢您的详细回答。实际上,我已经在使用
Selenium
XVFB
。但是r由于某种原因,我不能用它们来解决发布的问题。我只需要用
mechanize
解决这个问题,再次感谢是什么阻止了你使用它们?如果可以,你使用的是什么代理?也许我可以为你做些测试在进一步调查后,你不能用mechanize访问javascript,但是,如(),如果您将用户_代理设置为较旧的浏览器,您可能可以通过,但不需要javascript。祝您好运。1black1,谢谢您的回答,看起来很有希望:)我会尝试使用这种较旧的浏览器,我会让您知道它是否起作用,因此您可以将其作为答案发布,然后获得奖励:)。但这可能是在周一,因为我现在要离开办公室1BLACK1,添加一个旧的用户代理不起作用。看起来像@Sergey Salnikov建议的那样,mechanize永远不能有
保持活动的连接。然后我只剩下
Xvfb