文档章节

WebDriver 登陆 Jsoup抓取内容

KongFanhao
 KongFanhao
发布于 2016/04/14 11:23
字数 852
阅读 80
收藏 0
点赞 1
评论 0

 

1. 环境

pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>mybatis</groupId>
	<artifactId>test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>test</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<!-- 添加mybatis-generator插件 -->
	<!-- ——>在Goals框中输入:mybatis-generator:generate 运行mybatis插件 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.mybatis.generator</groupId>
				<artifactId>mybatis-generator-maven-plugin</artifactId>
				<version>1.3.2</version>
				<configuration>
					<verbose>true</verbose>
					<overwrite>true</overwrite>
				</configuration>
			</plugin>
		</plugins>
	</build>


	<dependencies>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.3.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.12</version>
		</dependency>

		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>net.sourceforge.jexcelapi</groupId>
			<artifactId>jxl</artifactId>
			<version>2.6.12</version>
		</dependency>

		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.5.2</version>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.8.3</version>
		</dependency>
		<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-server</artifactId>
			<version>2.53.0</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>


	</dependencies>

</project>

2. 初始化WebDriver的类 DriverFactory.java

 

 

package test;

import java.util.Arrays;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;

public class DriverFactory {

	public static ChromeDriver create() {

		// TODO Auto-generated method stub
		String chromdriver = "C:\\Users\\admin\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe";
		System.setProperty("webdriver.chrome.driver", chromdriver);
		ChromeOptions options = new ChromeOptions();

		DesiredCapabilities capabilities = DesiredCapabilities.chrome();
		capabilities.setCapability("chrome.switches", Arrays.asList("--start-maximized"));
		options.addArguments("--test-type", "--start-maximized");
		ChromeDriver driver = new ChromeDriver(options);
		return driver;
	}

}

 

 

3. 西祠胡同的登陆抓取类

package test;

import java.io.File;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.jetty.http.SSORealm;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import mx4j.log.Log;

public class XiciLogin2 {
	public Logger log = Logger.getLogger(Main.class);
	public static Set<Cookie> cookies = new HashSet<Cookie>();
	public static ChromeDriver driver = DriverFactory.create();

	/** * 抓取到每一个分页上所有详细页链接 * *@param url */
	public List<String> crawlSource(String url) {
		int time = 1;
		System.out.println("开始抓: " + url);
		log.info("开始抓: " + url);
		List<String> sourceUrls = new ArrayList<String>();
		String baseUrl = "http://www.xici.net";
		driver.get(url);
		Document document = Jsoup.parse(driver.getPageSource());
		WebElement webElement = driver.findElement(By.xpath(".//*[@id='board_t']/tbody/tr/td[2]/a"));
		Elements elements = document.select("table#board_t tbody tr");
		System.out.println(elements);
		if (elements != null) {
			for (Element element : elements) {
				if (element.select("td").isEmpty()) {
					continue;
				}
				String targets = element.select("td a[onclick=this.parentNode.className ='visited';]").attr("href");
				if (targets == "" || targets == null) {
					continue;
				}
				targets = baseUrl + targets; // System.out.println(targets);
				sourceUrls.add(targets);
			}
		} else

		{
			System.out.println(url + "中没有详细页链接~~");
		}
		System.out.println(sourceUrls.size());
		if (sourceUrls.size() == 0 && time <= 5) {
			System.out.println("抓不到啦~ 重新抓一下");
			crawlSource(url);
			time++;
		}
		return sourceUrls;
	}

	/** * 解析详细页 出东西 */
	public void crawlTarget(String url) {
		driver.get(url);
		Document document = Jsoup.parse(driver.getPageSource());
		System.out.println("抓" + url + "的标题"); // 取标题 Element element =
		document.select("div#doc_tit h1").first();
		if (element != null) {
			System.out.println("标题:" + element.text());
		} else {
			System.out.println("");
		}
	}

	public static void main(String[] args) {
		PropertyConfigurator.configure("log4j.properties");
		XiciLogin2 xc = new XiciLogin2();
		String site = "http://www.xici.net/b1513005/";
		try {
			xc.xiciLogin(); //
			xc.crawlTarget("http://www.xici.net/d191739198.htm");
			xc.getMaxPageNum("http://www.xici.net/b1468535/");
			int page = 1; //
			int maxPageNum = xc.getMaxPageNum(site);
			do {
				String sourceUrl = site + page;
				System.out.println("分页: " + sourceUrl);
				List<String> targetsList = xc.crawlSource(sourceUrl);
				if (targetsList.isEmpty()) {
					System.out.println("没抓到详细页!!");
				} else {
					for (String target : targetsList) {
						try {
							xc.crawlTarget(target);
							Thread.sleep(3000);
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
				page++;
				Thread.sleep(3500);
			} while (page <= 15);
		} catch (

		Exception e) {
			e.printStackTrace();
		}
	}

	/** * 获取当前入口site的最大分页数 **/
	public int getMaxPageNum(String site) {
		Document document = null;
		int maxPageNum = 0;
		try {
			document = Jsoup.connect(site).get();
			Element element = document.select("div#page").first();
			String s = element.text();
			if (s.contains("共")) {
				s = s.split("共")[1];
				s = s.split("页")[0];
			}
			System.out.println(s);
			maxPageNum = Integer.parseInt(s);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return maxPageNum;
	}

	public void xiciLogin() throws Exception {
		System.setProperty("webdriver.chrome.driver",
				"C:\\Users\\admin\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe");
		driver.get("http://account.xici.net/login");
		WebElement user = driver.findElement(By.name("username"));
		WebElement pwa = driver.findElement(By.name("password")); // 分别将用户名和密码文本框清空
																	// user.clear();
		pwa.clear(); // 输入用户名和密码 user.sendKeys("*******");
		pwa.sendKeys("*********"); // 找到登陆按钮点击 //
		driver.findElement(By.name("TANGRAM__PSP_3__submit")).click();
		driver.findElement(By.xpath("html/body/div[3]/div[2]/div[2]/form/div[4]/button")).click();
		// 输出title System.out.println(driver.getTitle()); cookies =
		driver.manage().getCookies();
		System.out.println(cookies);
		for (Cookie cookie2 : cookies) {
			driver.manage().addCookie(cookie2);
			System.out.println(cookie2);
		} // 能打开15页说明登陆成功 //
		driver.get("http://www.xici.net/b1402132/15");
	}
}
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
KongFanhao
粉丝 5
博文 75
码字总数 42265
作品 0
海淀
程序员
网抓取工具和技巧

偶尔会有需求提取竞争对手的网站数据,而且网站一般会有一些防护程序抓取的方案。 工具: httpclient:有点笨重的工具,入门还是要些门槛 jsoup:轻量强大 webdriver:谷歌出品的精品,可以抓取...

fir01 ⋅ 2015/03/20 ⋅ 1

Java爬虫实战—利用xpath表达式抓取页面信息

前言 之前有写过如何利用Jsoup去爬取页面信息《Java爬虫实战——利用Jsoup爬取网页资源》,那里主要是借助Jsoup的Selector语法去定位和筛选页面信息,那样使用起来有一定的局限性,并且不太方...

测试开发栈 ⋅ 2017/09/12 ⋅ 0

Python模拟登陆万能法-微博|知乎

Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法。你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆。本文讲的是登陆所有网站的一种方法,并不局限于微博与知...

_周小董 ⋅ 2017/12/02 ⋅ 0

jsoup使用样式class抓取数据时空格的处理

最近在研究用android和jsoup抓取小说数据,jsoup的使用可以参照http://www.open-open.com/jsoup/;在抓纵横中文网永生这本书的目录内容时碰到了问题, 永生的书简介url http://book.zongheng....

Airship ⋅ 2015/03/07 ⋅ 0

使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的...

日期:2012-7-20 来源:GBin1.com 在线演示 本地下载 如果你曾经开发过内容聚合类网站的话,使用程序动态整合来自不同页面或者网站内容的功能肯定对于你来说非常熟悉。通常使用java的话,我们...

gbin1 ⋅ 2012/07/20 ⋅ 0

nutch-ajax 发布基于 Nutch&Solr 的文档更新

项目提供一份比较详细的“基于Nutch&Solr定向采集解析和索引搜索的整合技术指南文档”,可通过以下两种方式查看参考文档内容: 直接获取项目内容后,在document目录下根据自己熟悉的编辑器查...

xautlx ⋅ 2015/05/04 ⋅ 3

Nutch 组件扩展--nutch-ajax

Nutch AJAX page Fetch, Parse, Index Plugin 项目简介 基于Apache Nutch 2.3 和 Htmlunit, Selenium WebDriver 等组件扩展,实现对于 AJAX 加载类型页面的完整页面内容抓取,以及特定数据项...

xautlx ⋅ 2015/02/26 ⋅ 0

java抓取动态生成的网页--吐槽

最近在做项目的时候有一个需求:从网页面抓取数据,要求是首先抓取整个网页的html源码(后期更新要使用到)。刚开始一看这个简单,然后就稀里哗啦的敲起了代码(在这之前使用过Hadoop平台的分...

开源oschina ⋅ 2014/10/16 ⋅ 0

xautlx/nutch-ajax

Nutch AJAX page Fetch, Parse, Index Plugin 项目简介 基于Apache Nutch 2.3和Htmlunit, Selenium WebDriver等组件扩展,实现对于AJAX加载类型页面的完整页面内容抓取,以及特定数据项的解析...

xautlx ⋅ 2015/02/26 ⋅ 0

jsoup 1.3.1 发布,性能的改善和内存优化

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

红薯 ⋅ 2010/08/23 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 27分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 50分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 51分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 58分钟前 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部