肯定有几种方法可以处理您所描述的内容,因此我将介绍两种我认为最适合您的场景的方法
硒
所以您在上面提到了 selenium,它绝对是一个好的、可靠的网络自动化框架,但是为了将它用于多个站点,您可能会遇到一个小问题,即必须为每个单独的站点添加具有不同定位器的特定方法登录、导航和解析站点以获取信息。
例如对于一个网站,您的硒代码可能是
public void LoginSiteA(){
FirefoxDriver fd = new FirefoxDriver();
fd.get(SiteUrlA);
WebElement Username = fd.findElement(By.Id("Unique-ID-1"));
WebElement Password = fd.findElement(By.ID("Unique-ID-2"));
//Set Text on WebElements and submit
}
这会很好用,不幸的是,用于识别每个元素的“唯一 ID”定位器可能(并且很可能会)在网站之间有所不同,并且您必须为每个您想要的网站设置一组单独的定位器支持会很快变得混乱。这让我想到了我的第二种方法
下载原始 HTML 源代码
抓取页面的第二个选项是直接从网站下载 HTML 源代码,这很有效:
- 您可以通过 http 请求进行身份验证
- 因为不需要定位器,所以跨多个网站非常通用
- 它通常比 selenium 更快,因为它不需要呈现网页
在 Java 中你可以这样做
因此,首先,如果该站点需要登录,您将需要处理身份验证,我建议您查看此站点here 以获得至少 NTLM 身份验证的速成课程,但是每个站点的身份验证方法和您可能需要在遇到每种身份验证协议时添加对它们的支持。
使用下面的代码,您可以传入用户名和密码以及 URL,如果一切正常,您可以获取网站的原始 HTML 源代码并根据需要对其进行解析。
static final String kuser = "username"; // your account name
static final String kpass = password; // retrieve password for your account
static class MyAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
// I haven't checked getRequestingScheme() here, since for NTLM
// and Negotiate, the usrname and password are all the same.
System.err.println("Feeding username and password for " + getRequestingScheme());
return (new PasswordAuthentication(kuser, kpass.toCharArray()));
}
}
public static void main(String[] args) throws Exception {
Authenticator.setDefault(new MyAuthenticator());
URL url = new URL(args[0]);
InputStream ins = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
String str;
while((str = reader.readLine()) != null)
System.out.println(str);
}
至于对来自单一来源的大量流量的担忧,您可以联系您将使用您的服务访问的网站,看看 1) 他们是否可以接受,以及 2) 是否有可能将您的服务列入白名单服务的 IP 以获得更大的带宽量,正如您所说,服务可以在您客户的机器上运行,但这可能会导致额外的困难。
如果还有什么我可以帮忙的,请告诉我:)
-詹姆斯