Программа Python для расширения коротких URL-адресов, которая интегрируется с Stata
У меня есть набор данных, содержащий тысячи твитов. Некоторые из них содержат URL-адреса, но большинство из них в классических сокращенных формах, используемых в Twitter. Мне нужно что-то, что получает полные URL-адреса, чтобы я мог проверить наличие некоторых конкретных сайтов. Я решил проблему в Python следующим образом:
import urllib2
url_filename='C:\Users\Monica\Documents\Pythonfiles\urlstrial.txt'
url_filename2='C:\Users\Monica\Documents\Pythonfiles\output_file.txt'
url_file= open(url_filename, 'r')
out = open(url_filename2, 'w')
for line in url_file:
tco_url = line.strip('\n')
req = urllib2.urlopen(tco_url)
print >>out, req.url
url_file.close()
out.close()
Что работает, но требует, чтобы я экспортировал свои URL-адреса из Stata в файл.txt, а затем повторно импортировал полные URL-адреса. Есть ли какая-нибудь версия моего скрипта Python, которая позволила бы мне интегрировать задачу в Stata с помощью команды shell? У меня довольно много разных файлов.dta, и в идеале я бы хотел не добавлять их все только для выполнения этой задачи.
Заранее спасибо за любой ответ!
1 ответ
Конечно, это возможно, не покидая Stata. Я использую Mac под управлением OS X. Детали вашей операционной системы могут отличаться, я полагаю, это Windows.
Метод Python и Stata
Скажем, у нас есть следующая тривиальная программа Python, называемая hello.py
:
#!/usr/bin/env python
import csv
data = [['name', 'message'], ['Monica', 'Hello World!']]
with open('data.csv', 'w') as wsock:
wtr = csv.writer(wsock)
for i in data:
wtr.writerow(i)
wsock.close()
Эта "программа" просто записывает некоторые поддельные данные в файл с именем data.csv в рабочем каталоге скрипта. Теперь убедитесь, что скрипт исполняемый: chmod 755 hello.py
,
Из Stata вы можете сделать следующее:
! ./hello.py
* The above line called the Python program, which created a data.csv file.
insheet using data.csv, comma clear names case
list
+-----------------------+
| name message |
|-----------------------|
1. | Monica Hello World! |
+-----------------------+
Это простой пример. Полный процесс для вашего случая будет:
- Записать файл на диск с URL, используя
outsheet
или какая-то другая команда - использование
!
вызвать скрипт Python - Прочитайте вывод в Stata, используя
insheet
или жеinfile
или какая-то другая команда - Очистите, удалив файлы с
capture erase my_file_on_disk.csv
Дайте мне знать, если это не ясно. Он отлично работает на *nix; как я уже сказал, Windows может быть немного другой. Если бы у меня была коробка с Windows, я бы ее протестировал.
Pure Stata Solution (отчасти взломать)
Кроме того, я думаю, что то, чего вы хотите достичь, может быть полностью выполнено в Stata, но это взлом. Вот две программы. Первый просто открывает файл журнала и делает запрос на URL (который является первым аргументом). Второй читает этот файл журнала и использует регулярные выражения, чтобы найти URL, на который был перенаправлен Stata.
capture program drop geturl
program define geturl
* pass short url as first argument (e.g. http://bit.ly/162VWRZ)
capture erase temp_log.txt
log using temp_log.txt
copy `1' temp_web_file
end
Вышеуказанная программа не закончится, потому что copy
Команда не удастся (намеренно). Это также не убирает после себя (преднамеренно). Поэтому я создал следующую программу, чтобы прочитать, что произошло (и получить перенаправление URL).
capture program drop longurl
program define longurl, rclass
* find the url in the log file created by geturl
capture log close
loc long_url = ""
file open urlfile using temp_log.txt , read
file read urlfile line
while r(eof) == 0 {
if regexm("`line'", "server says file permanently redirected to (.+)") == 1 {
loc long_url = regexs(1)
}
file read urlfile line
}
file close urlfile
return local url "`long_url'"
end
Вы можете использовать это так:
geturl http://bit.ly/162VWRZ
longurl
di "The long url is: `r(url)'"
* The long url is: http://www.ciwati.it/2013/06/10/wdays/?utm_source=twitterfeed&
* > utm_medium=twitter
Вы должны запускать их один за другим. Использование этого решения может привести к неприятным последствиям, но оно находит URL-адрес, который вы ищете. Могу ли я предложить другой подход - связаться со службой сокращения и получить хорошие данные?
Если кто-то в Stata читает это, было бы неплохо иметь copy
вернуть информацию заголовка ответа HTTP. Делать это целиком в Stata немного не так. Лично я бы использовал Python полностью для такого рода вещей и использовал бы Stata для анализа данных, как только у меня было все, что мне нужно.