2009-07-23 1 views
5

Мне было интересно, можно ли «автоматизировать» задачу ввода записей для поиска форм и извлечения совпадений из результатов. Например, у меня есть список журнальных статей, для которых я хотел бы получить DOI (идентификатор цифрового объекта); вручную для этого я бы зашел на страницу поиска статей в журналах (например, http://pubs.acs.org/search/advanced), введите авторов/заголовок/объем (и т. д.), а затем найдите статью из списка возвращаемых результатов и выберите DOI и вставьте это в мой список ссылок. Я регулярно использую R и Python для анализа данных (я был вдохновлен сообщением о RCURL), но мало знаю о веб-протоколах ... возможно ли это (например, используя что-то вроде BeautifulSoup от Python?). Есть ли хорошие ссылки для того, чтобы делать что-то отдаленно похожее на эту задачу? Мне так же интересно узнать о веб-соскабливании и инструментах для веб-очистки в целом, как и для выполнения этой конкретной задачи ... Спасибо за ваше время!веб-скребок для заполнения (и извлечения) форм поиска?

+0

У вас есть хорошее решение этой проблемы? Я нашел это после запроса аналогичного (дублирующего?) Вопроса здесь http://stackoverflow.com/questions/9711539/can-i-query-the-digital-object-identifier-for-a-list-of-citations –

+0

@ Дэвид - нет, извините. Не получили достаточно далеко с любым вариантом для комментариев ... – hatmatrix

ответ

9

Beautiful Soup отлично подходит для разбора webpages-, что половина того, что вы хотите сделать. Python, Perl, и Руби все имеют версию Mechanize, и это другая половина:

http://wwwsearch.sourceforge.net/mechanize/

механизировать давайте вы контролируете браузер:

# Follow a link 
browser.follow_link(link_node) 

# Submit a form 
browser.select_form(name="search") 
browser["authors"] = ["author #1", "author #2"] 
browser["volume"] = "any" 
search_response = br.submit() 

С Mechanize и Beautiful Soup у вас есть отличный старт. Один дополнительный инструмент, который я бы рассмотреть Firebug, используемый в этом кратком руководстве рубина очищающего:

http://www.igvita.com/2007/02/04/ruby-screen-scraper-in-60-seconds/

Firebug может ускорить вашу конструкцию XPaths для разбора документов, экономя некоторое время серьезного.

Удачи вам!

+0

Отлично! Спасибо, очень полезно! – hatmatrix

+0

Стивен! Отметьте мне ответ! Я участвую в коллективе до 100 очков :-) – mixonic

+0

Я пытаюсь! Я только что получил OpenID, но он говорит мне, что у меня должно быть 15 репутации, чтобы проголосовать? Извините, первый раз на stackoverflow ... это сложно? – hatmatrix

1
WebRequest req = WebRequest.Create("http://www.URLacceptingPOSTparams.com"); 

req.Proxy = null; 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 

// 
// add POST data 
string reqString = "searchtextbox=webclient&searchmode=simple&OtherParam=???"; 
byte[] reqData = Encoding.UTF8.GetBytes (reqString); 
req.ContentLength = reqData.Length; 
// 
// send request 
using (Stream reqStream = req.GetRequestStream()) 
    reqStream.Write (reqData, 0, reqData.Length); 

string response; 
// 
// retrieve response 
using (WebResponse res = req.GetResponse()) 
using (Stream resSteam = res.GetResponseStream()) 
using (StreamReader sr = new StreamReader (resSteam)) 
    response = sr.ReadToEnd(); 

// use a regular expression to break apart response 
// OR you could load the HTML response page as a DOM 

(адаптировано из Джо Albahri в «C# в двух словах»)

+0

Спасибо - приятно знать, что это возможно! ...Я предполагаю. (не слишком знакомы с .NET, хотя я слышал, что это все ярость ...) – hatmatrix

0

Существует множество инструментов для веб-соскабливания. Существует хороший плагин firefox под названием iMacros. Он отлично работает и не нуждается ни в каких знаниях программирования. Бесплатная версия может быть загружена отсюда: https://addons.mozilla.org/en-US/firefox/addon/imacros-for-firefox/ Лучшая вещь в iMacros - это то, что она может начать вас через несколько минут, а также может быть запущена из командной строки bash и также может быть вызвана из сценариев bash.

Более продвинутым шагом будет selenium webdrive. Причина, по которой я выбрал селен, заключается в том, что он хорошо документирован для новичков. только следующее: page:

поможет вам быстро и быстро запустить вас. Selenium поддерживает java, python, php, c, поэтому, если вы знакомы с любым из этих языков, вы будете знакомы со всеми необходимыми командами. Я предпочитаю изменение седана webdrive, так как он открывает браузер, так что вы можете проверить поля и выходы. После настройки скрипта с помощью webdrive вы можете легко перенести сценарий в IDE, тем самым бегая без головы.

Чтобы установить селен можно сделать с помощью команды

sudo easy_install selenium 

Это будет заботиться о зависимостях и все необходимые для вас.

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

python 

вы увидите питон подсказку, >>> и вы можете ввести команды.

Вот пример кода, который можно вставить в терминале, он будет искать Google для слова сыры

package org.openqa.selenium.example; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.ui.ExpectedCondition; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class Selenium2Example { 
    public static void main(String[] args) { 
     // Create a new instance of the Firefox driver 
     // Notice that the remainder of the code relies on the interface, 
     // not the implementation. 
     WebDriver driver = new FirefoxDriver(); 

     // And now use this to visit Google 
     driver.get("http://www.google.com"); 
     // Alternatively the same thing can be done like this 
     // driver.navigate().to("http://www.google.com"); 

     // Find the text input element by its name 
     WebElement element = driver.findElement(By.name("q")); 

     // Enter something to search for 
     element.sendKeys("Cheese!"); 

     // Now submit the form. WebDriver will find the form for us from the element 
     element.submit(); 

     // Check the title of the page 
     System.out.println("Page title is: " + driver.getTitle()); 

     // Google's search is rendered dynamically with JavaScript. 
     // Wait for the page to load, timeout after 10 seconds 
     (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver d) { 
       return d.getTitle().toLowerCase().startsWith("cheese!"); 
      } 
     }); 

     // Should see: "cheese! - Google Search" 
     System.out.println("Page title is: " + driver.getTitle()); 

     //Close the browser 
     driver.quit(); 
    }} 

Я надеюсь, что это может дать вам фору.

Cheers :)

+0

Сначала вы говорите пользователю, чтобы установить Selenium Client для Python; но ваш код-пример - это код Java. Это смущает. – knb

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