如何从其他网站抓取信息?

问题描述 投票:0回答:1

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

可能最好的方法是使用 selenium 框架或一些类似的网络自动化工具,但由于我没有编程背景,我愿意接受所有建议和建议。

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

web-scraping automation
1个回答
0
投票

肯定有几种方法可以实现您所描述的内容,因此我将介绍两种我认为最适合您的场景的方法


因此,您在上面提到了 selenium,这绝对是一个良好、可靠的 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请求进行身份验证
  • 它在多个网站上非常通用,因为不需要定位器
  • 它通常比 selenium 更快,因为它不需要渲染网页

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

因此,首先,如果该站点需要登录,您将需要处理身份验证,我建议查看此站点此处,以获取至少 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 列入白名单对于更大的带宽量,正如您所说,该服务可以在您客户的计算机上运行,但这可能会导致额外的困难。

如果还有什么需要我帮忙的,请告诉我:)

-詹姆斯

© www.soinside.com 2019 - 2024. All rights reserved.