如何从另一个站点抓取信息?

时间:2019-05-21 14:15:43

标签: web web-scraping automation scrape

我的想法是创建一个网站,使用户可以从其注册到的其他站点中查找信息。当这些网站提供登录凭据时,这些信息将从这些网站爬到我们的数据库中。整个想法是使他们能够在一个地方/一个地点轻松访问他们想要的东西,那将是我们的网站。

可能最好的方法是使用Selenium框架或类似的Web自动工具,但是由于我没有编程背景,因此我乐于接受所有建议。

您是否认为有可能做到这一点,并且可以通过Web应用程序(通过我们自己的服务器)完成此操作,还是用户仍然需要安装某种桌面应用程序?我可以考虑从桌面进行抓取的唯一原因是,如果大量流量来自单个IP地址,则某些站点可能会阻止它。

1 个答案:

答案 0 :(得分:0)

肯定有两种方法可以处理您所描述的内容,因此我将介绍两种我认为最适合您的情况的方法


因此您在上面提到了硒,它绝对是一个不错的,可靠的Web自动化框架,但是,为了将其用于多个站点,您可能会遇到一个小问题,即必须为每个站点为每个站点添加具有不同定位符的特定方法。登录,浏览和解析站点以获取信息。

例如对于一个网站,您的硒代码可能是

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请求进行身份验证
  • 由于不需要定位器,因此跨多个网站非常通用
  • 通常它比硒更快,因为它不需要呈现网页

您可以在Java中执行此操作的方式可能是这样

因此,首先,如果需要登录该站点,则需要进行身份验证,建议您至少在NTLM身份验证下访问该站点here进行崩溃,但是每个站点的身份验证可能有所不同方法,您可能需要在遇到每种身份验证协议时增加对它们的支持。

使用下面的代码,您可以传入用户名,密码和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具有更大的带宽量,但是该服务有可能在您的客户端计算机上运行,​​但这可能会带来其他困难。

如果还有其他需要帮助的地方,请告诉我:)

-詹姆斯

相关问题