Помогите с чисткой экрана / разбором - PullRequest
3 голосов
/ 26 мая 2011

Я пытался очистить и в конечном итоге проанализировать некоторые данные (в частности, наличие и стоимость) с hostels.com, например http://www.hostels.com/hosteldetails.php/HostelNumber.11890. Проблема в том, что после выбора количества ночей и выбора «Забронировать сейчас» ничего не передается через строку URL (все это делается через Ajax, я верю), я не могу перейти непосредственно к определенной дате или временному интервалу.

Я пытался использовать браузерные эмуляторы, такие как Selenium, IRobotSoft и FakeApp, и хотя мне удалось заставить Selenium и Fake выполнять большую часть работы, захватывая полный исходный код, это было уродливо и все еще утомительно, когда приходилось чистить (и анализировать с другим программным обеспечением) ) несколько страниц в день.

Я также пробовал HTML DOM Parser, PHP Scriptable Web Browser, HTMLUnit, cScrape.php, Crowbar. Либо они не могли справиться с Аяксом, либо мне не повезло заставить их даже бежать.

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

Теперь, проведя много часов, пытаясь заставить это работать. Я все еще чувствую, что не знаю, с чего начать. Может кто-то просто указать мне правильное направление? Должен ли я вернуться и провести больше времени с HTMLUnit? Какую практику лучше использовать для такого сайта?

Спасибо

Ответы [ 4 ]

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

Я пробовал эмуляторы браузера, такие как Selenium, IRobotSoft и FakeApp. Я также пробовал HTML DOM Parser, PHP Scriptable Web Browser, HTMLUnit, cScrape.php, Crowbar.

Вы уже пробовали iMacros?http://wiki.imacros.net/Data_Extraction

Мы используем HTMLUnit для основных веб-сайтов и iMacros для всего сложного и ajaxy.

Вот скрипт, который работает:

URL GOTO=http://www.hostels.com/hostels/ottawa/ottawa-backpackers-inn/11890
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:theForm ATTR=ID:ArrivingField CONTENT=15<SP>Jun<SP>2011
TAG POS=1 TYPE=DIV FORM=NAME:theForm ATTR=CLASS:calIcon
TAG POS=1 TYPE=SELECT FORM=NAME:theForm ATTR=NAME:NumNights CONTENT=%3
TAG POS=1 TYPE=SELECT FORM=NAME:theForm ATTR=NAME:NumNights CONTENT=%4
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:theForm ATTR=VALUE:Book<SP>Now
2 голосов
/ 26 мая 2011

Страница, на которую вы ссылаетесь, похоже, не использует AJAX. Вместо этого то, что вы называете AJAX, является запросом POST (в отличие от того, что передается в URL, который является запросом GET). Я предлагаю вам прочитать разницу между ними. Постарайтесь понять, что происходит, это важнее, чем полагаться на какой-либо сторонний инструмент, который может оказаться очень негибким.

Установите Firebug и посмотрите, какие переменные отправляются в запросе POST. Теперь сделайте то же самое на вашем любимом языке программирования. Разбор HTML ответа для POST-запроса на получение необходимой информации.

Кроме того, +1 за попытку попробовать так много разных решений и не сдаваться.

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

Я действительно в Node.js атм (javascript на стороне сервера, если вы не знакомы), так что это то, что я рекомендую. Что удивительно в использовании его для очистки сайтов, так это то, что вы можете использовать jQuery или любой другой ваш любимый JS-фреймворк для выполнения всей работы по анализу нужной вам информации! Для начала ознакомьтесь со следующими ресурсами:

http://blog.dtrejo.com/scraping-made-easy-with-jquery-and-selectorga

https://github.com/tmpvar/jsdom

https://github.com/chriso/node.io/wiki/Scraping

https://github.com/joshfire/node-crawler

1 голос
/ 26 мая 2011

Я обнаружил, что Celerity (http://celerity.rubyforge.org), библиотека JRuby, которая использует HTMLUnit под капотом, является очень надежным решением для «сбора данных через Интернет».

Celerity, как Ruby, я обнаружил,разработка была намного быстрее по сравнению с полноценной Java (HTMLUnit), а также благодаря «обёртыванию» Celerity в HTMLUnit - я смог перейти к HTMLUnit, так как мне нужно было сделать несколько более тяжелые действия.

Я имел успех на сайтах, которые богаты DHTML, а также используют Ajax, и, хотя я сделал, использовал несколько вызовов sleep () для ожидания ответов Ajax - все работало, как ожидалось.

Попробуйте!

...