когда я подключаюсь к своему сайту с помощью 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"
Импорт из Интернета — установка пользовательского агента в Mathematica
Ответы (6)
В Mathematica 9 появилась новая функция URLFetch. У него есть опция UserAgent.
Насколько я знаю, вы не можете изменить строку пользовательского агента в Mathematica. Однажды я использовал прокси-сервер (CNTLM), чтобы заставить Mathematica взаимодействовать с брандмауэром, использующим аутентификацию NTLM (которую Mathematica не поддерживает). CNTLM также позволяет вам установить строку пользовательского агента.
Вы можете найти его по адресу http://cntlm.sourceforge.net/. По сути, вы настраиваете этот прокси-сервер для работы на своей машине и устанавливаете его номер порта и IP-адрес в сетевых настройках Mathematica. Прокси-сервер добавляет элементы пользовательского агента и обрабатывает аутентификацию NTLM. Не уверен, как это работает, если у вас нет брандмауэра NTLM. Есть и другие бесплатные прокси, которые могут вам подойти.
ИЗМЕНИТЬ http://www.squid-cache.org/Download/, кажется, делает то, что вы хотите. Он имеет директиву конфигурации request_header_replace
, которая позволяет вам изменять содержимое заголовков запросов.
Import[ ]
, насколько я знаю.
- person Dr. belisarius; 22.05.2011
request_header_replace User-Agent Nutscrape/1.0 (CP/M; 8-bit)
- person Sjoerd C. de Vries; 24.05.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
используется для создания соответствующих объектов HTTP-клиента Apache, HttpClient
и GetMethod
. Выражения Java, такие как http.getParams()
, выражаются в JLink как http@getParams[]
. Классы и методы Java описаны в документации HTTP-клиента Apache.
Использование MakeJavaObject
несколько необычно. В данном случае это необходимо, так как строка Mathematica передается в качестве аргумента, а ожидается Java Object
. Если бы ожидался 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"]
Я изолирую такие вещи в нечистой функции (если только она не чистая), поэтому я знаю, что она испорчена, но любой доступ в Интернет таков.
Поскольку я использую трубку, 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, аутентификацию пользователя и пароля (Basic, Digest, NTLM, Negotiate, kerberos...), возобновление передачи файлов, туннелирование прокси и множество других полезных трюков.
На странице приветствия curl и libcurl.
man curl
содержит много информации (о чем угодно, кроме окон). Возможно, слишком много информации на самом деле.
- person acl; 14.08.2011
Mathematica осуществляет все свои подключения к Интернету через указанный пользователем прокси-сервер. Если, как предложил Sjoerd, настройка слишком трудоемка, вы можете подумать о том, чтобы написать вызов на C/C++, а затем вызвать его из Mathematica. Я не сомневаюсь, что существует множество библиотек C, которые делают то, что вам нужно, в нескольких строках кода.
Для вызова кода C в Mathematica см. документацию по интерфейсу языка C.
Вы также можете использовать J/Link для отправки веб-запросов или вызова curl или wget в командной строке.