13 июл. 2013 г.

Ubuntu, Apache: Кривое удаление

Иногда при кривом удалении(с помощью apt-get autoremove) и последующей установки apache, вас может встретить ошибка:
/etc/init.d/apache2: 51: .: Can't open /etc/apache2/envvars
Способ решения:
sudo apt-get remove --purge apache2 apache2-utils
sudo apt-get install apache2

22 июн. 2013 г.

3 июн. 2013 г.

Python, Ubuntu: Копирование и извлечение данных с буфера обмена

Нам понадобится пакет xclip:
sudo apt-get install xclip
И модуль xerox:
sudo pip install xerox
Взаимодействие с буфером, на программном языке:
import xerox 
xerox.copy(u'copy to clipboard by xerox')
print xerox.paste()
 
Как всегда все просто. 

8 мая 2013 г.

Python, Selenium: Получаем труднодоступные капчи

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

В принципе это убивает возможности работать с ресурсом, посредством curl и httplib. Но selenium почти полностью эмилирует браузер и это нам на руку.

Как вариант мы можем скачать скрин сайта и через PIL сделать срез нужных координат. Ну и дальше полученную часть отправить на сервисы распознавания, либо вбить руками.

Как мы поступаем:
from selenium.webdriver import Firefox
from PIL import Image
 
browser = Firefox()
browser.get(' интересующий сайт ')
browser.save_screenshot('current_page')
current_page_img = Image.open('current_page')
w, h = current_page_img.size
captcha_img = current_page_img.crop((575, 505, w-155, h-1820))
captcha_img.save('captcha', 'jpeg')
Простыми словами. Мы переходим на сайт, сохраняем полный скриншот страницы. Дальше открываем его через PIL.Image и получаем высоту/ширину этого скрина. Потом с помощью crop мы делаем отсечение по координатах.

По параметрам:
575 - срез по левому краю
505 - срез от верха
w-155 - срез по правому краю, мы отсекаем данные от начальной ширины
h-1820 - срез от низа, отнимаем от начальной высоты

Ну вот и все, дальше сохраняем эту капчу и делаем с ней что хотим. Способ достаточно дубовый, но рабочий :)

Python, Selenium, Firefox: Некоторые мелочи

Изменение юзер агента:
from selenium.webdriver import Firefox, FirefoxProfile 
ff_profile = FirefoxProfile()
ff_profile.set_preference('general.useragent.override', ' нужный user agent ')
browser = Firefox(firefox_profile=ff_profile)
browser.get('http://www.whatsmyuseragent.com/')
Изменение прокси:
from selenium.webdriver import Firefox
from selenium.webdriver.common import proxy, desired_capabilities
 
ff_proxy = proxy.Proxy({ 'proxyType'  :   proxy.ProxyType().MANUAL,
                                   'httpProxy'   :   ' нужный прокси ' 
})
modif_capabilities = desired_capabilities.DesiredCapabilities().FIREFOX
ff_proxy.add_to_capabilities(modif_capabilities)
browser = Firefox(capabilities=modif_capabilities)
browser.get('http://hideme.ru/ip/')
Изменения accept-languages:
from selenium.webdriver import Firefox, FirefoxProfile  
ff_profile = FirefoxProfile()
ff_profile.set_preference('intl.accept_languages', 'ru') # ru/en
browser = Firefox(firefox_profile=ff_profile)
browser.get('http://www.vk.com') 
Изменение директории для cache:
from selenium.webdriver import Firefox, FirefoxProfile  
ff_profile = FirefoxProfile()
ff_profile.set_preference('browser.cache.disk.parent_directory', '  путь ')
browser = Firefox(firefox_profile=ff_profile)
browser.get('http://www.vk.com') 

31 мар. 2013 г.

JS: Примитивный редирект

Если вам нужно средиректить пользователя, через некоторое время, то вы можете воспользоваться этим кодом:
<script type="text/javascript">
window.setTimeout("document.location = 'http://google.com';", 3000);
</script>
P.S. 3000 - 3 секунды.

6 мар. 2013 г.

Python, Selenium, Chrome: Способ задания таймаутов

Selenium отличный инструмент для тестирования web-приложений. Но Firefox очень прожорливый браузер и это чересчур заметно после запуска скриптов на несколько часов.

Приятным удивлением был Chrome/Chromium который заметно быстрей, при той же логике работы. Хотя не без косяков. Насколько мне известно, еще до сих пор в ChromeDriver, для Selenium, нету нормальный таймаутов, при загрузке документа. По крайней мере, встроенный метод set_page_load_timeout постоянно отдавал:
selenium.common.exceptions.WebDriverException: Message: '{"status":405,"value":["GET","HEAD","DELETE"]}' 
Но кое-какое решение нашлось, через модуль socket:
socket.setdefaulttimeout(10)
try:
    driver.get('http://google.com')
except socket.timeout:
    driver.quit()
И это вроде единственный из возможных вариантов, если быть точным, единственный известный мне :) Потому что:

1) Исполнение js, а именно window.stop() не происходит, если страница не загруженная полностью.
2) Внутреннего метода по остановке загрузки документа нету. Так как WebDriver, со слов разработчиков, эмулирует только работу пользователя внутри страницы, а не целого браузера. 

19 февр. 2013 г.

Регулярка для поиска ссылок на странице

Для получения полного урла, вы можете использовать эту регулярку:
(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)
Заметьте, если вы работаете пайтоновским модулем re и методом findall, то на выходе у вас будет список, внутри которого - кортеж, который включит в себя:
1) Полный урл. К примеру http://test.ru/test_page.htm
2) Только домен. К примеру test.ru
3) Страницу со слешом. К примеру /test_page.htm
4) Только страницу. К примеру test.htm

17 февр. 2013 г.

Ubuntu, VDS: "perl: warning: Setting locale failed."

После покупки VDS и начала работы, я столкнулся с подобной ошибкой/предупреждением:

perl: warning: Setting locale failed. 
perl: warning: Please check that your locale settings: 
    LANGUAGE = (unset), 
    LC_ALL = (unset), 
    LANG = "en_US.UTF-8"
    are supported and installed on your system. 
perl: warning: Falling back to the standard locale ("C"). 
locale: Cannot set LC_CTYPE to default 
locale: No such file or directory 
locale: Cannot set LC_MESSAGES to default 
locale: No such file or directory 
locale: Cannot set LC_ALL to default locale: No such file or directory

Решение оказалось достаточно простым:

sudo locale-gen en_US.UTF-8

7 февр. 2013 г.

Python, Tkinter: Вывод капчи и ввод значения + скрипт парсинга WordStat

Для получения данных, с WordStat, мне нужно было сначала программным методом вбить значение капчи и только потом работать с полученными данными.

Конечно можно тупо скачать/открыть картинку и указать значение в терминале, через метод raw_input. Но хочется, чтобы все было по-человечески :)

Есть одна особенность, в интернете хватает примеров, по этой фиче. Но модуль ImageTk, который нужен для интерпретации картинки в окне теперь вынесен отдельно с библиотеки PIL, потому его теперь нужно установить и использовать отдельно:

sudo apt-get install python-imaging-tk

В принципе, я не буду описывать все возможности Tkinter, да и сам их знаю мало, так как посмотрел вводную инфу только за час, до написания статьи :) Выложу просто свой код скрипта на dumpz.org

А более подробно почитать про Tkinter, вы можете перейдя по этой ссылке.


P.S. Вся работа скрипта построена на базе замечательной библиотеки Grab(ссылка на офф. сайт), эта либа в своих зависимостях требует Lxml + PyCurl.

У вышеуказанном скрипте - вся работа с капчей построена на базе методов tkinter_captcha и set_captcha.

Tkinter_captcha - подгружает скачанную с Яндекса капчу, интерпретирует ее как объект, с помощью ImageTK и передает у виджет Label.
С помощью виджета Entry - мы создаем в фрейме поле для ввода значения. 
С помощью виджета Button - кнопку, которая после нажатия, через callback, вызывает наш внутренний метод set_captcha.
Последний в свою очередь принимает данные с виджета Entry и добавляет их в переменную + закрывает окно.

Сам скрипт сырой, так как писался 4фан. Но свою задачу делает.

Скрины работы:




28 янв. 2013 г.

Ubuntu: VirtualBox и kernel driver not installed

После обновлений пакетов в Ubuntu, достаточно часто слетает драйвер VirtualBox. Для устранения проблемы пишем в терминал:

sudo dpkg-reconfigure virtualbox-dkms
sudo dpkg-reconfigure virtualbox

25 янв. 2013 г.

PyMongo: Способ выбора случайной записи

Возможно не самый оптимальный способ, но пока не вкурил лучше - использую его :)
import pymongo
from random import randrange
 
collection = pymongo.Connection()[SERVER][BASE]
set = randrange(1, collection.count())
random_data = collection.find().skip(set).limit(10)

set - выводит рандомное число, исходя с подсчетов записей в документе.
skip - срезает документ на нужное количество записей.
limit - устанавливает дальнейший диапазон получения данных.

Как вариант, теперь мы можем обработать данные через цикл:
for line in random_data:
    print line["название_поля"]
Если вам нужна только одна строка, мы можем изменить random_data примерно так:
random_data = collection.find().skip(set).limit(1)[0]["название_поля"]

24 янв. 2013 г.

Ubuntu и MongoDB: mongodb.lock

При запуске сервера, в директории с нахождением БД - MongoDB создает файл mongodb.lock

При окончании работы - эта СУБД удаляет его.

При некорректном завершении работы файл зачастую остается и потом при запуске shell выпадает что-то вроде этого:
Error: couldn't connect to server 127.0.0.1 shell/mongo.js:84
Проблему можно устранить удалением файла mongodb.lock в директории /var/lib/mongodb/

P.S. Этот файл - своеобразная защита. Потому желательно найти причину некорректного завершения работы.

17 янв. 2013 г.

Ubuntu и MongoDB: Изменяем путь хранения данных

Изменить стандартный путь, для хранения баз данных можно через терминал и:
mongod --dbpath <путь>
Если вы хотите сделать сделать изменения не только на одну сессию, а на дефолтную загрузку, тогда перейдите в файл /etc/mongod.conf и измените переменную dbpath.


16 янв. 2013 г.

Ubuntu: Добавляем наши модули в PYTHONPATH

Иногда хочется иметь отдельную директорию, для содержания своих библиотек.
В принципе, все наработки можно помещать в уже прописанные папки PYTHONPATH.

Посмотреть их вы можете с помощью:

import sys  
print sys.path

К тому же можно добавить новые пути:

import sys 
sys.path.append( ' путь ... ' )

Но это локальное добавление и они стираются после окончания сессии с интерпретатором.

Потому, для жесткого указания, пишем в терминале:
export PYTHONPATH=$PYTHONPATH:<Путь>

6 янв. 2013 г.