zoukankan      html  css  js  c++  java
  • Java爬虫(Jsoup与WebDriver)

    一、Jsoup爬虫

    jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

    以博客园首页为例

    1、idea新建maven工程

    pom.xml导入jsoup依赖

    <dependency>
          <groupId>org.jsoup</groupId>
          <artifactId>jsoup</artifactId>
          <version>1.12.1</version>
    </dependency>

    jsoup代码

    package com.blb;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    import java.io.IOException;
    
    public class jsoup {
    
        public static void main(String[] args) {
    
            //博客园首页url
            final String url=  "https://www.cnblogs.com";
            try {
                //先获得的是整个页面的html标签页面
                Document doc= Jsoup.connect(url).get();
                System.out.println(doc);
                //可以通过元素的标签获取html中的特定元素
                Elements title = doc.select("title");
                String t = title.text();
                System.out.println(t);
                //可以通过元素的id获取html中的特定元素
                Element site_nav_top = doc.getElementById("site_nav_top");
                String s = site_nav_top.text();
                System.out.println(s);
    } catch (IOException e) { e.printStackTrace(); } } }

    该方式有个很大的局限性,就是通过jsoup爬虫只适合爬静态网页,所以只能爬当前页面的信息。

    二、Webdriver技术

    Selenium是一个浏览器自动化操作框架。selenium主要由三种工具组成。
    1.第一个工具——SeleniumIDE,是Firefox的扩展插件,支持用户录制和回访测试。录制/回访模式存在局限性,对许多用户来说并不适合。

    2.因此第二个工具——Selenium WebDriver提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序。

    3.最后一个工具——SeleniumGrid帮助工程师使用Selenium API控制分布在一系列机器上的浏览器实例,支持并发运行更多测试。

    在项目内部,它们分别被称为“IDE”、“WebDriver”和“Grid”。

    什么是 Webdriver ?
    官网介绍:
    WebDriver is a clean, fast framework for automated testing of webapps.(WebDriver是一个干净、快速的web应用自动测试框架。)

    WebDriver针对各个浏览器而开发,取代了嵌入到被测Web应用中的JavaScript。与浏览器的紧密集成支持创建更高级的测试,避免了JavaScript安全模型导致的限制。除了来自浏览器厂商的支持,WebDriver还利用操作系统级的调用模拟用户输入。WebDriver支持Firefox(FirefoxDriver)、IE (InternetExplorerDriver)、Opera (OperaDriver)和Chrome (ChromeDriver)。 它还支持Android (AndroidDriver)和iPhone (IPhoneDriver)的移动应用测试。它还包括一个基于HtmlUnit的无界面实现,称为HtmlUnitDriver。WebDriver API可以通过Python、Ruby、Java和C#访问,支持开发人员使用他们偏爱的编程语言来创建测试。

    WebDriver如何工作

    WebDriver是W3C的一个标准,由Selenium主持。

    具体的协议标准可以从http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Reference 查看。

    从这个协议中我们可以看到,WebDriver之所以能够实现与浏览器进行交互,是因为浏览器实现了这些协议。这个协议是使用JOSN通过HTTP进行传输。

    它的实现使用了经典的Client-Server模式。客户端发送一个requset,服务器端返回一个response。

    我们明确几个概念。

    Client

    调用 WebDriverAPI的机器。

    Server

    运行浏览器的机器。Firefox浏览器直接实现了WebDriver的通讯协议,而Chrome和IE则是通过ChromeDriver和InternetExplorerDriver实现的。

    Session

    服务器端需要维护浏览器的Session,从客户端发过来的请求头中包含了Session信息,服务器端将会执行对应的浏览器页面。

    WebElement

    这是WebDriverAPI中的对象,代表页面上的一个DOM元素。


    实现:

    1.下载浏览器驱动,用的是Chrome浏览器,下载地址http://chromedriver.storage.googleapis.com/index.html,按对应浏览器版本号下载

    2、idea新建maven工程

    pom.xml导入入selinium依赖

     <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>3.141.59</version>
     </dependency>

    代码实现:

    package com.blb;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.select.Elements;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    public class chrome {
    
        public static void main(String[] args) {
            //下载的chromedriver位置
            System.setProperty("webdriver.chrome.driver","D:\idea_workspace\Jsoup\src\main\chromedriver.exe");
            //实例化ChromeDriver对象
            WebDriver driver = new ChromeDriver();
            String url="https://search.51job.com/list/000000,000000,0000,00,9,99,%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%2588,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=";
            //打开指定网站
            driver.get(url);
            //解析页面
            String pageSource =driver.getPageSource();
            Document jsoup = Jsoup.parse(pageSource);
            //定义选择器规则
            String rule="#resultList > div:nth-child(4) > p > span > a";
            //通过选择器拿到元素
            Elements select = jsoup.select(rule);
            String s=select.text();
            System.out.println(s);
            //模拟浏览器点击
            driver.findElement(By.cssSelector(rule)).click();
           
        }
    }

    爬取电影资源:

    package com.blb;

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;


    public class getMovie {

    private static final String url="http://www.zuidazy5.com";

    public static void main(String[] args) {
    System.setProperty("webdriver.chrome.driver","D:\idea_workspace\Jsoup\src\main\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get(url);
    String pageSource = driver.getPageSource();
    Document jsoup = Jsoup.parse(pageSource);
    String rule1="body > div.xing_vb > ul> li > span.xing_vb4 > a";
    Elements select = jsoup.select(rule1);
    //遍历当前页的所有电影详情入口
    for (Element e:select)
    {
    //获取电影详情页链接
    String href = e.attr("href");
    //进入每个电影详情页面
    driver.get(url+href);
    String pageSource2= driver.getPageSource();
    Document jsoup2 = Jsoup.parse(pageSource2);

    //定义获取电影信息元素的规则
    String mname="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodh > h2";
    String mpic="body > div.warp > div:nth-child(1) > div > div > div.vodImg > img";
    String mdirector="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(2) > span";
    String mactor="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(3) > span";
    String marea="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(5) > span";
    String mlanguage="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(6) > span";
    String mshowtime="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(7) > span";
    String mscore="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodh > label";
    String mtimelength="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(8) > span";
    String mlastmodifytime="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(9) > span";
    String minfo="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li.cont > div > span.more";
    String mplayaddress1="#play_1 > ul > li";
    String mplayaddress2="#play_2 > ul > li";
    String msv="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodh > span";

    //获取元素信息
    String sv=jsoup2.select(msv).text();
    String name = jsoup2.select(mname).text();
    String pic = jsoup2.select(mpic).attr("src");
    String director=jsoup2.select(mdirector).text();
    String actor=jsoup2.select(mactor).text();
    String area=jsoup2.select(marea).text();
    String language=jsoup2.select(mlanguage).text();
    String showtime=jsoup2.select(mshowtime).text();
    String score=jsoup2.select(mscore).text();
    String timelength=jsoup2.select(mtimelength).text();
    String lastmodifytime=jsoup2.select(mlastmodifytime).text();
    String info=jsoup2.select(minfo).text();
    String playaddress1 = jsoup2.select(mplayaddress1).text();
    String playaddress2=jsoup2.select(mplayaddress2).text();

    //打印电影名
    System.out.println(name);
    }
    }
    }

     为了不显示浏览器爬取过程,可以将 chromedriver.exe 换成无头浏览器 phantomjs.exe

    下载地址:https://phantomjs.org/download.html

  • 相关阅读:
    浏览器输入一个url到整个页面显示出来经历了哪些过程?
    ajax
    为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
    jQuery中ready方法的实现
    this+call、apply、bind的区别与使用
    内存泄漏、垃圾回收机制、哪些情况会导致内存泄漏
    浏览器同源策略和跨域方法
    node.js
    JS原型、原型链、构造函数、实例与继承
    JS常用操作节点的方法
  • 原文地址:https://www.cnblogs.com/yangy1/p/12727634.html
Copyright © 2011-2022 走看看