我想知道是否可以“自动化”输入条目以搜索表单并从结果中提取匹配项的任务。例如,我有一份期刊文章列表,我想为其获取 DOI(数字对象标识符);为此,我会手动访问期刊文章搜索页面(例如,http ://pubs.acs.org/search/advanced),输入作者/标题/卷(等),然后从其返回结果列表中找到该文章,然后选择 DOI 并将其粘贴到我的参考列表中。我经常使用 R 和 Python 进行数据分析(我受到 RCurl 上的一篇文章的启发),但对 Web 协议了解不多……这可能吗(例如使用 Python 的 BeautifulSoup 之类的东西?)。是否有任何很好的参考可以远程完成与此任务类似的任何事情?我对学习网络抓取和一般网络抓取工具和完成这项特定任务一样感兴趣......感谢您的时间!
4 回答
Beautiful Soup 非常适合解析网页 - 这是您想要做的一半。Python、Perl 和 Ruby 都有一个版本的 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()
使用机械化和美丽的汤,您有一个很好的开始。我会考虑的一个额外工具是 Firebug,在这个快速 ruby 抓取指南中使用:
http://www.igvita.com/2007/02/04/ruby-screen-scraper-in-60-seconds/
Firebug 可以加快您构建用于解析文档的 xpath 的速度,从而为您节省大量时间。
祝你好运!
Python 代码:用于搜索表单。
# import
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
# Create a new instance of the Firefox driver
driver = webdriver.Firefox()
# go to the google home page
driver.get("http://www.google.com")
# the page is ajaxy so the title is originally this:
print driver.title
# find the element that's name attribute is q (the google search box)
inputElement = driver.find_element_by_name("q")
# type in the search
inputElement.send_keys("cheese!")
# submit the form (although google automatically searches now without submitting)
inputElement.submit()
try:
# we have to wait for the page to refresh, the last thing that seems to be updated is the title
WebDriverWait(driver, 10).until(EC.title_contains("cheese!"))
# You should see "cheese! - Google Search"
print driver.title
finally:
driver.quit()
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
(改编自 Joe Albahri 的“C# in a nutshell”)
有许多用于网页抓取的工具。有一个很好的 Firefox 插件,叫做 iMacros。它工作得很好,根本不需要编程知识。免费版本可以从这里下载: https ://addons.mozilla.org/en-US/firefox/addon/imacros-for-firefox/ iMacros 最好的一点是它可以让你在几分钟内开始,并且它也可以从 bash 命令行启动,也可以从 bash 脚本中调用。
更高级的步骤是 selenium webdrive。我选择 selenium 的原因是它以非常适合初学者的方式记录在案。阅读以下页面:
会让您立即启动并运行。Selenium 支持 java、python、php、c,所以如果你熟悉这些语言中的任何一种,你就会熟悉所有需要的命令。我更喜欢 selenium 的 webdrive 变体,因为它会打开一个浏览器,以便您检查字段和输出。使用 webdrive 设置脚本后,您可以轻松地将脚本迁移到 IDE,从而无头运行。
要安装 selenium,您可以通过键入命令来完成
sudo easy_install selenium
这将处理依赖项和您所需的一切。
为了交互式地运行你的脚本,只需打开一个终端,然后输入
python
您将看到 python 提示符,>>>,然后您可以输入命令。
这是一个示例代码,您可以将其粘贴到终端中,它将在 google 搜索单词 cheeses
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();
}}
我希望这能给你一个良好的开端。
干杯:)