Импорт из веб - установить пользовательский агент в Mathematica - PullRequest
17 голосов
/ 22 мая 2011


когда я подключаюсь к своему сайту с помощью 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"

Ответы [ 6 ]

12 голосов
/ 22 мая 2011

Насколько я знаю, вы не можете изменить строку агента пользователя в Mathematica. Однажды я использовал прокси-сервер (CNTLM), чтобы заставить Mathematica общаться с брандмауэром, который использовал аутентификацию NTLM (которую Mathematica не поддерживает). CNTLM также позволяет вам установить строку агента пользователя.

Вы можете найти его по адресу http://cntlm.sourceforge.net/. По сути, вы настроили этот прокси-сервер для работы на своем компьютере и задали его номер порта и IP-адрес в сетевых настройках Mathematica. Прокси добавляет пользовательский агент и обрабатывает проверку подлинности NTLM. Не уверен, как это работает, если у вас нет брандмауэра NTLM. Есть и другие бесплатные прокси, которые могут вам помочь.

РЕДАКТИРОВАТЬ HTTP-прокси Squid , кажется, делает то, что вы хотите. Он имеет директиву конфигурации request_header_replace, которая позволяет изменять содержимое заголовков запросов.

11 голосов
/ 23 мая 2011

Вот способ использования HTTP-клиента Apache через JLink:

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[]
  ]

Вы можете использовать эту функцию следующим образом:

$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/"]

При желании вы можете передать результат ImportString:

ImportString[urlString[$userAgent, "mysite"], "Data"]

Потоковый подход был бы возможен с использованием более сложного кода, но принятый выше строковый подход, вероятно, достаточно хорош, если целевой веб-ресурс не очень велик.

Я пробовал этот код в Mathematica 7 и 8, и я ожидаю, что он работает и в v6. Помните, что нет никаких гарантий, что Mathematica всегда будет включать HTTP-клиента Apache в будущих выпусках.

Как это работает

Несмотря на выражение в Mathematica, решение по существу реализовано на Java. Mathematica поставляется со встроенной средой исполнения Java, а мост между Mathematica и Java представляет собой компонент под названием JLink .

Как это типично для таких кросс-технологических решений, существует значительная сложность, даже когда кода немного. Обсуждение того, как работает код, выходит за рамки этого ответа, но некоторые пункты будут выделены в качестве предложений для дальнейшего чтения.

Код использует HTTP-клиент Apache . Эта библиотека Java была выбрана потому, что она поставляется в качестве незадекларированной части стандартного дистрибутива Mathematica - и она также является той, которую Import использует для внутреннего использования.

Все тело urlString завернуто в JavaBlock. Это обеспечивает правильное освобождение любых объектов Java, созданных в ходе операции, путем координации действий менеджеров памяти Java и Mathematica.

JavaNew используется для создания соответствующих объектов клиента Apache HTTP, HttpClient и GetMethod. Выражения Java, такие как http.getParams(), выражаются в JLink как http@getParams[]. Классы и методы Java описаны в документации клиента Apache HTTP.

Использование MakeJavaObject несколько необычно. Это необходимо в этом случае, поскольку строка Mathematica передается в качестве аргумента, где ожидается Java Object. Если ожидается Java String, JLink автоматически создаст его. Но JLink не может сделать этот вывод, когда ожидается Object, поэтому MakeJavaObject используется, чтобы дать JLink подсказку.

А как насчет URLTools?

Кстати, первым, что я попытался ответить на этот вопрос, было использование Utilities`URLTools`FetchURL. Это выглядело очень многообещающе, так как он принимает опцию под названием "RequestHeaderFields". Увы, это не сработало, потому что нынешняя реализация этой функции использует эту опцию только для глаголов HTTP POST, а не GET. Возможно, какая-то будущая версия Mathematica будет поддерживать опцию GET.

6 голосов
/ 08 августа 2011

Я очень ленив, и curl более гибок в меньшем количестве кода, чем J / Link, без проблем управления объектами.Это пример отправки данных (userPass) на URL-адрес и получения результата в формате JSON.

Import["!curl -A Mozilla/4.0 --data " <> userPass <> " " <> url, "JSON"]

Я выделяю подобные вещи в нечистой функции (если она не чистая), поэтому я знаю, что этоиспорченный, но любой веб-доступ - таким образом.

Поскольку я использую канал, 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, прокси-серверы, куки-файлы, аутентификацию пользователя и пароля (Basic, Digest, NTLM, Negotiate, kerberos ...), возобновление передачи файлов, туннелирование прокси иbusload других полезных трюков.

Со страницы приветствия curl и libcurl .

5 голосов
/ 22 мая 2011

Mathematica выполняет все свои подключения к Интернету через прокси-сервер, указанный пользователем. Если, как предположил Шурд, его настройка - это слишком много работы, вы можете подумать о написании вызова на C / C ++ и последующем вызове из Mathematica. Я не сомневаюсь, что есть много библиотек C, которые делают то, что вы хотите, в несколько строк кода.

Для вызова кода C в Mathematica см. Документацию C Language Interface

4 голосов
/ 16 января 2013

Mathematica 9 имеет новую функцию URLFetch . У него есть опция UserAgent.

2 голосов
/ 23 мая 2011

Вы также можете использовать J / Link для отправки веб-запросов, вызова curl или wget в командной строке.

...