【发布时间】:2016-05-04 13:53:50
【问题描述】:
我正在使用 Python 脚本 (Mechanize) 登录代理门户。我可以成功登录。我可以从read() 函数中检查。
但是,成功登录后,我无法访问代理阻止的站点。所以我检查了FF的HTTP头,发现Connection: Keep-alive。但是从mechanize,我找到了Connection: close。我尝试使用browser.addheaders 完全模仿FF 中的HTTP 标头,但这并不奏效:(
经过深入研究,我发现了一些服务器关闭连接的建议,因为机械化无法完全模拟浏览器,因为网页包含mechanize不支持的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
机械化 addheaders:
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 发送的Connection 是: close,尽管我已将其设置为keep-alive,正如您在addheaders 中看到的那样
【问题讨论】:
-
HTTP 标头中没有关于 JS 的内容。 Keep-alive 在这里可能无关紧要。您可能应该在工作版本和非工作版本中发布 HTTP 标头(请求和响应)。编辑会话 cookie 或其他内容,但检查它是否存在。
-
@SergeySalnikov,感谢您的回复。我并不是说 HTTP 标头中有关于 JS 的内容。我只是说从 HTTP 标头中我可以看出服务器关闭了连接。这可能是因为服务器可以判断
mechanize不是浏览器。它可以说是因为它没有看到对 JS 的支持。所以它将mechanize识别为不是浏览器 -
你的意思是服务器关闭连接没有任何回复?
-
@SergeySalnikov,当然不会。我的意思是当我检查服务器 HTTP 标头时,它有
Connection: close -
据我所知,HTTP 服务器无法检测到客户端 JavaScript 支持。检测客户端最常见的方法是通过 User-Agent 标头属性。如果您按照@SergeySalnikov 的建议发布请求/响应标头,那就太好了
标签: javascript python mechanize user-agent keep-alive