Импорт из Интернета — установка пользовательского агента в 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"


person enedene    schedule 22.05.2011    source источник


Ответы (6)


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

person Kartik    schedule 15.01.2013

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

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

ИЗМЕНИТЬ http://www.squid-cache.org/Download/, кажется, делает то, что вы хотите. Он имеет директиву конфигурации request_header_replace, которая позволяет вам изменять содержимое заголовков запросов.

person Sjoerd C. de Vries    schedule 22.05.2011
comment
+1 Использование ответа Рэгфилда Jlink (stackoverflow.com/questions/5853134/) Я думаю, вы можете создать любой запрос, какой захотите. Не использую Import[ ], насколько я знаю. - person Dr. belisarius; 22.05.2011
comment
@belisarius У меня есть прокси Squid на моем сервере, я попытаюсь настроить его, чтобы изменить юзерагент. Спасибо всем за ваши ответы. - person enedene; 23.05.2011
comment
@enedene Не за что. Прокси и решения J/Link (см. ответ WReach) должны работать. Выбирайте, что проще для вас! - person Dr. belisarius; 24.05.2011
comment
@enedene для прокси-сервера Squid вам, вероятно, придется использовать параметр request_header_replace, например: request_header_replace User-Agent Nutscrape/1.0 (CP/M; 8-bit) - person Sjoerd C. de Vries; 24.05.2011
comment
Да, нашел в справке по squid, к сожалению, придется компилировать из исходников, так как для использования request_header_replace нужно перекомпилировать squid с параметром --enable-http-violations. Я, вероятно, попробую это на выходных, когда никто не использует squid на сервере. - person enedene; 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.

person WReach    schedule 23.05.2011
comment
Теперь это решение, которое очень легко использовать. Тем не менее, мне нужно искать помощь, чтобы понять, как это работает. - person enedene; 24.05.2011
comment
@enedene Я добавил раздел «Как это работает», чтобы дать несколько советов о том, что вам нужно прочитать. - person WReach; 24.05.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, прокси, файлы cookie, аутентификацию пользователя и пароля (Basic, Digest, NTLM, Negotiate, kerberos...), возобновление передачи файлов, туннелирование прокси и множество других полезных трюков.

На странице приветствия curl и libcurl.

person Art Taylor    schedule 08.08.2011
comment
@Mr.Wizard В Википедии есть статья: en.wikipedia.org/wiki/CUR. Также man curl содержит много информации (о чем угодно, кроме окон). Возможно, слишком много информации на самом деле. - person acl; 14.08.2011
comment
Хорошая точка зрения. Я добавил сводку со страницы curl/libcurl и связал ее. Их слова лучше моих. :-) - person Art Taylor; 14.08.2011

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

Для вызова кода C в Mathematica см. документацию по интерфейсу языка C.

person JeremyKun    schedule 22.05.2011
comment
это тоже хорошо. Сначала я попытаюсь найти что-нибудь для python, так как мне удобнее использовать python, чем C. - person enedene; 24.05.2011
comment
Хорошо, для моей цели я вижу, что могу запускать внешние программы из mathematica, поэтому я напишу код на python, а затем просто импортирую строку, которую python получит в качестве вывода, и буду использовать mathematica для остальной части. Спасибо всем, вы все предоставили интересные решения, которые расширят набор возможных реализаций моих будущих проблем. - person enedene; 24.05.2011

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

person Joshua Martell    schedule 23.05.2011
comment
Не могли бы вы опубликовать пример использования J/Link для изменения пользовательского агента? - person Dr. belisarius; 23.05.2011