2012-06-26 4 views
2

Я пытаюсь очистить HTML-код (с разрешения автора). Я использовал PHP библиотеку suggested here, и она работала хорошо, пока я не обнаружил ссылку, которая выглядит следующим образом:Скребок HTML с обратной почтой JavaScript

<a href="javascript:__doPostBack('dgItem$_ctl2$_ctl0','')"> 

который я считаю некоторые asp.net вещь. Когда я нажимаю на него, он не изменяет URL-адрес, он просто загружает на страницу новый контент, который я также хотел бы очистить.

Как я могу обойти это?

Я предполагаю, что мне нужно будет имитировать щелчок, но я не могу этого сделать при обработке необработанного HTML, мне нужен какой-то интерпретатор браузера/JS, нет?

Есть ли подходящая библиотека для этой задачи? Я не ограничиваюсь PHP, но это предпочтительнее.

+0

Чтение [эта статья] (http://blog.databigbang.com/web-scraping-ajax-and-javascript-sites/) сейчас ... – mpen

+0

Возможно, вас заинтересует [этот проект] (http: /scraperblog.blogspot.com/2012/11/introducing-pgbrowser.html) – pguardiario

+0

@pguardiario: Он говорит, что это формы и файлы cookie, но нет упоминания о JS. – mpen

ответ

1

В итоге я использовал Python с веб-драйвером Selenium Firefox. Поскольку я использую настоящий браузер, я могу делать все, что может сделать FF.

7

__doPostBack() действительно вещь ASP.NET. Вот что делает эта функция:

var theForm = document.forms['FORMNAME']; 
if (!theForm) { 
    theForm = document.FORMNAME; 
} 
function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 

В принципе, он устанавливает значения двух скрытых полей (__EVENTTARGET и __EVENTARGUMENT) до соответствующих значений параметров. Затем он представляет форму.

Если вы хотите, вы можете продолжить использование PHP-парсера PHP для выполнения этой работы, но когда вы столкнетесь с одной из этих ссылок __doPostBack(), вам придется обработать запрос POST вручную. На высоком уровне вы будете выглядеть примерно так:

  1. Получить текущие значения формы. Вам, вероятно, придется перебирать каждый элемент input и т. Д. И добавлять значения в массив. Если на странице нет текстовых полей, флажков и т. Д., Вы должны оставлять только скрытые поля. NET внедряется по умолчанию (например, __VIEWSTATE, __EVENTVALIDATION и т. Д.).
  2. Вывести значения, прошедшие в doPostBack(), и перезаписать существующие значения для __EVENTTARGET и __EVENTARGUMENT.
  3. Сделайте свой запрос POST. Я не уверен, что (если что-нибудь) библиотека, которую вы ищете, обеспечивает этот способ, но популярный способ сделать это с PHP будет через расширение cURL. Например, см. http://davidwalsh.name/execute-http-post-php-curl.
  4. Получите HTML-результат и проанализируйте его как обычно.

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

Это не будет весело, но это будет работать для этого случая. Если вам нужно иметь дело с более сложными делами, связанными с JS, или если вы просто хотите обработать это по-другому, есть (как вы упомянули) библиотеки, которые в основном управляют браузерами и обрабатывают эти вещи для вас. Два, которые приходят на ум в первую очередь являются:

Есть и другие варианты, но я не знаю ни одного, которые собираются быть быстро и легко интегрировать в существующий PHP-скрипт.

+0

Только что начал PHP-скрипт, поэтому я не слишком обеспокоен, если мне нужно начинать сначала, но мне нравится синтаксис этой библиотеки, подобный jQuery. Я собираюсь изучить 2 библиотеки, которые вы предложили, и если они не работают, я могу попробовать взломать сообщение, как вы предложили. Благодаря! – mpen

Смежные вопросы