【问题标题】:How to scrape information from another site?如何从其他网站抓取信息?
【发布时间】:2019-05-21 14:15:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: web web-scraping automation scrape


    【解决方案1】:

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


    所以您在上面提到了 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 以获得更大的带宽量,正如您所说,服务可以在您客户的机器上运行,但这可能会导致额外的困难。

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

    -詹姆斯

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      相关资源
      最近更新 更多