从Web导入 - 在Mathematica中设置用户代理

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配置指令,允许您更改请求标头的内容.

  • +1使用Ragfield的Jlink答案(http://stackoverflow.com/questions/5853134/upload-to-ifile-it-through-mathematica/5862918#5862918)我想你可以建立你想要的任何请求.不使用`Import []`,AFAIK. (3认同)

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选项.

  • @enedene我添加了一个"如何工作"部分,以便提供一些关于你需要阅读的内容的指示. (2认同)

Art*_*lor 6

我非常懒惰,并且在没有对象管理问题的情况下,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 ......),文件传输恢复,代理隧道和大量其他有用的技巧.

来自curl和libcurl欢迎页面.


Jer*_*Kun 5

Mathematica通过用户指定的代理服务器完成所有互联网连接.如果,正如Sjoerd所建议的,设置一个是太多的工作,你可能想考虑用C/C++编写调用,然后从Mathematica调用它.我不怀疑有很多C库可以在几行代码中执行您想要的操作.

要在Mathematica中调用C代码,请参阅C语言界面文档


Kar*_*tik 4

Mathematica 9 具有新的URLFetch函数。它有 UserAgent 选项。