ene*_*ene 17 browser import user-agent wolfram-mathematica
当我使用Mathermatica(Import["mysite","Data"])连接到我的站点并查看我的Apache日志时,我看到:
99.XXX.XXX.XXX - - [22/May/2011:19:36:28 +0200] "GET / HTTP/1.1" 200 6268 "-" "Mathematica/8.0.1.0.0 PM/1.3.1"
我可以将它设置为这样(当我连接到真正的浏览器时):
99.XXX.XXX.XXX - - [22/May/2011:19:46:17 +0200] "GET /favicon.ico HTTP/1.1" 404 183 "-" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24"
Sjo*_*ies 12
据我所知,你无法在Mathematica中更改用户代理字符串.我曾经使用代理服务器(CNTLM)让Mathematica与使用NTLM身份验证的防火墙(Mathematica不支持)进行通信.CNTLM还允许您设置用户代理字符串.
您可以在http://cntlm.sourceforge.net/找到它.基本上,您将此代理服务器设置为在您自己的计算机上运行,并在Mathematica网络设置中设置其端口号和IP地址.代理添加用户代理内容并处理NTLM身份验证.如果您没有NTLM防火墙,不确定它是如何工作的.还有其他免费代理可能适合您.
编辑的鱿鱼HTTP代理似乎做你想要什么.它具有request_header_replace配置指令,允许您更改请求标头的内容.
WRe*_*ach 11
以下是通过JLink使用Apache HTTP客户端的方法:
Needs["JLink`"]
ClearAll@urlString
urlString[userAgent_String, url_String] :=
JavaBlock@Module[{http, get}
, http = JavaNew["org.apache.commons.httpclient.HttpClient"]
; http@getParams[]@setParameter["http.useragent", MakeJavaObject@userAgent]
; get = JavaNew["org.apache.commons.httpclient.methods.GetMethod", url]
; http@executeMethod[get]
; get@getResponseBodyAsString[]
]
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式使用此功能:
$userAgent =
"Mozilla/5.0 (X11;Linux i686) AppleWebKit/534.24 (KHTML,like Gecko) Chrome/11.0.696.68 Safari/534.24";
urlString[$userAgent, "http://www.htttools.com:8080/"]
Run Code Online (Sandbox Code Playgroud)
ImportString如果需要,您可以将结果提供给:
ImportString[urlString[$userAgent, "mysite"], "Data"]
Run Code Online (Sandbox Code Playgroud)
使用更复杂的代码可以实现流式处理,但上面采用的基于字符串的方法可能已经足够好,除非目标Web资源非常大.
我在Mathematica 7和8中尝试了这个代码,我希望它也适用于v6.请注意,无法保证Mathematica在将来的版本中始终包含Apache HTTP客户端.
这个怎么运作
尽管在Mathematica中表达了,但该解决方案基本上是用Java实现的.Mathematica内置了Java运行时环境,Mathematica和Java之间的桥梁是一个名为JLink的组件.
这种跨技术解决方案的典型特征是,即使代码不多,也存在相当大的复杂性.讨论代码如何详细工作超出了这个答案的范围,但将强调一些项目作为进一步阅读的建议.
该代码使用Apache HTTP客户端.选择这个Java库是因为它作为标准Mathematica发行版的未公开部分发布 - 它也恰好是Import内部使用的那个.
整个身体urlString被包裹着JavaBlock.这可确保通过协调Java和Mathematica内存管理器的活动来正确释放在操作过程中创建的任何Java对象.
JavaNew用于创建相关的Apache HTTP客户端对象,HttpClient以及GetMethod.Java表达式http.getParams()在JLink中表示为http@getParams[].Apache HTTP客户端文档中记录了Java类和方法.
使用MakeJavaObject有点不寻常.在这种情况下需要将Mathematica字符串作为Object期望Java的参数传递.如果需要Java String,JLink会自动创建一个.但JLink无法在Object预期时进行此推断,因此MakeJavaObject用于为JLink提供提示.
那么URLTools呢?
顺便说一句,我试图回答这个问题的第一件事是使用Utilities`URLTools`FetchURL.它看起来非常有前景,因为它需要一个选项"RequestHeaderFields".唉,这不起作用,因为该函数的当前实现仅对HTTP POST动词使用该选项 - 而不是GET.也许Mathematica的未来版本将支持GET选项.
我非常懒惰,并且在没有对象管理问题的情况下,curl在比J/Link更少的代码中更灵活.这是将数据(userPass)发布到URL并以JSON格式检索结果的示例.
Import["!curl -A Mozilla/4.0 --data " <> userPass <> " " <> url, "JSON"]
Run Code Online (Sandbox Code Playgroud)
我在一个不纯的函数中隔离了这种东西(除非它是纯粹的)所以我知道它被污染了,但任何web访问都是这样的.
因为我使用管道,MMA无法推断出文件的类型.ref/Import提到«Import ["!prog","format"]从管道导入数据.»和«默认情况下,文件的格式是从其名称中的文件扩展名推断出来的,或者是FileFormat从其内容中推断出来的.»因此,必须指定"CSV","JSON"等作为格式参数.否则你会看到一些奇怪的结果.
curl是一个命令行工具,用于使用URL语法传输数据,支持DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP,RTSP,SCP,SFTP,SMTP, SMTPS,TELNET和TFTP.curl支持SSL证书,HTTP POST,HTTP PUT,FTP上传,基于HTTP表单的上传,代理,cookie,用户+密码认证(基本,摘要,NTLM,协商,kerberos ......),文件传输恢复,代理隧道和大量其他有用的技巧.
| 归档时间: |
|
| 查看次数: |
1996 次 |
| 最近记录: |