webmagic是个神奇的爬虫【三】—— 使用selenium模拟登陆

selenium本身是一种自动化测试工具,可以模拟浏览器进行页面的加载,好处在于能通过程序,自动的完成例如页面登录、AJAX内容获取的的操作。

尤其是获取AJAX生成的动态信息方面,一般爬虫只会获取当前页面的静态信息,不会加载动态生成的内容,但是selenium则完美的帮我们实现了这一功能。

但同样他也有一些不好的地方,就是使用selenium功能的时候,需要事先加载selenium的驱动,在通过selenium本身加载出页面动态生成的内容,以供之后爬取。

 

但是这节我们只讲selenium的一个基本操作:页面登录

后续我们还会讲如何通过selenium进行动态页面的爬取

 

================================================      我是萌萌哒分割线      ======================================================

 

开始撸代码:

 

首先,我们先通过maven,配置好selenium的相关依赖

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

 

 

 

上面是selenium的 相关配置,当然,webmagic本身也对selenium有所集成,相关配置如下:

 

 	<dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-selenium</artifactId>
            <version>${webmagic.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>	<dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-selenium</artifactId>
            <version>${webmagic.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


webmagic的这个配置对selenium有个一套简单的封装,具体使用哪种依赖各位看喜好就可以

 

 

使用selenium对页面尽进行爬取时,首先需要下载相关的浏览器驱动,不同版本的浏览器对应的驱动也不一样

我用的是chrome的驱动,所以也提供一下chromedriver的下载地址,其余如火狐、ie的驱动百度一下都可以轻松找到

chromedriver相关资源

 

 

WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");


爬取之前,需要以上两句加载浏览器驱动和爬取的目标网址

 

以为我已经把驱动放在chrome路径下的bin文件夹中,并且在环境变量path中也把chromedriver的地址加进去,所以我在new ChromeDriver的时候没有带参数

如果不想把驱动配到环境变量中也可以直接吧驱动的路径写成参数传进去就可以(

例:

new ChromeDriver("D://chromedriver.exe")

 

 

 

public class MeipaiProccessor implements PageProcessor {
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000)
            .setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");

    @Override
    public void process(Page page) {
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.meipai.com/");
	//防止页面未能及时加载出来而设置一段时间延迟
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //找到登录按钮,点击
        driver.findElement(By.id("headerLogin")).click();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
        driver.findElement(By.id("userId")).sendKeys("账号");
        driver.findElement(By.id("passwd")).sendKeys("密码");
        driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();

    }

    @Override
    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        List<SpiderListener> spiderListeners = new ArrayList<>();
        SpiderListener spiderListener = new SpiderListener() {
            @Override
            public void onSuccess(Request request) {
                System.out.println("sucsess");
            }

            @Override
            public void onError(Request request) {

            }
        };
        spiderListeners.add(spiderListener);
        Spider.create(new MeipaiProccessor())
                .setSpiderListeners(spiderListeners)
                .addUrl("http://www.meipai.com/")
                .thread(5)
                .start();
    }//防止页面未能及时加载出来而设置一段时间延迟
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //找到登录按钮,点击
        driver.findElement(By.id("headerLogin")).click();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
        driver.findElement(By.id("userId")).sendKeys("账号");
        driver.findElement(By.id("passwd")).sendKeys("密码");
        driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();

    }

    @Override
    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        List<SpiderListener> spiderListeners = new ArrayList<>();
        SpiderListener spiderListener = new SpiderListener() {
            @Override
            public void onSuccess(Request request) {
                System.out.println("sucsess");
            }

            @Override
            public void onError(Request request) {

            }
        };
        spiderListeners.add(spiderListener);
        Spider.create(new MeipaiProccessor())
                .setSpiderListeners(spiderListeners)
                .addUrl("http://www.meipai.com/")
                .thread(5)
                .start();
    }

 

 

 

 

 

以上是对美拍进行模拟登陆的代码,之前配置过一些基础的BasePageProcess类,把site和一些基础的逻辑功能放在里面,然后让爬虫程序只需要完成页面解析的功能,但是当时忘记把BasePageProcess类的代码贴上去,到时有人反映程序跑不起来,所以这次一切从简,实现webmagic最基本的PageProcessor接口,所有的逻辑都在以上程序中体现出来。

 

代码功能比较单一,主要就是通过findElement方法定位到账号密码的输入框,把对应的账号密码输入进去,最后点击登录完成整个模拟登陆的操作。

selenium本身没有什么难理解的东西,而且还能帮助我们更好的完善爬虫的功能。用好它,爬虫的水平必将更上层楼!

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值