http://webmagic.io/ -----webMagic下载地址.
推荐使用谷歌浏览器),下载时先看自己的谷歌浏览器的版本对应的驱动版本然后再下载(版本不匹配的话,启动直接报错).需要配置浏览器驱动的环境变量在path后追加上chromedriver.exe所在的目录.
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-selenium</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>2.18.0</version>
</dependency>
因为是在摸索所以引了很多的依赖,有些可能不用引,我也懒得再去删了,反正不会报错.
public class Test implements PageProcessor {
//设置一个全局的参数存放登陆cookies
private Set<Cookie> cookies;
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
public Site getSite() {
for (Cookie cookie : cookies) {
site.addCookie(cookie.getName().toString(), cookie.getValue().toString());
}
return site;
}
public static void main(String[] args) throws Exception {
Test test = new Test();
test.Login();
Spider.create(test)
.addUrl("要爬取的页面")
.run();
// .runAsync();
}
public void process(Page page) {
String string = page.getHtml().xpath("body").toString();
String[] split = string.split("<body>");
// ResultItems items = page.getResultItems();
// System.out.println(items.get("name"));
// 部分三:从页面发现后续的url地址来抓取
// page.addTargetRequests(page.getHtml().links().all());
}
// 登陆方法
public void Login() throws IOException {
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("需要自动登陆的页面");
// 定义验证码变量
String verify = null;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//div[@class='layui-input-block']/input")).sendKeys("账号");
driver.findElement(By.id("userPwd")).sendKeys("密码");
//获取点击按钮
WebElement element = driver.findElement(By.xpath("//button[@class='layui-btn layui-btn-fluid']"));
//验证码获取破解....之后奉上
//模拟点击
element.click();
//很重要的一步获取登陆后的cookies
cookies = driver.manage().getCookies();
driver.close();
}
爬虫爬取页面的时候只会爬取静态页面,也就是说只要是js渲染的数据都拿不到的,我们要拿到这些数据只能再次加载这些jsAPI来获取数据(可能还有其他方法,在这里我使用的是该方法).
当我们访问要访问的页面的时候,打开查看器network会发现许多的请求,我们可以从这些请求中获取到数据,因为静态页面中加载不到这些数据,我们就重新加载js. 例如,图中这个方法response返回的值时json格式的数据,如果它被js渲染之后赋值给页面,我们是拿不到的,这时,右键点击该请求copy -- copy link address 将这个链接在新页面打开就会发现数据是我们要的.我们就把该链接添加到webMagic中加载.就可以得到这些数据了.
如果静态页面能直接拿到数据的话,那就更简单了,使用webMagic自带的抓取元素方法直接抓取就行了.(推荐使用xpath方式)基本能完成所有你想要的标签. (祝大家都能爬到自己想要的数据!)