网络爬虫之Selenium(可视化)爬虫

前言:今天跟大家分享网络(selenium)爬虫,网络爬虫技术的用处范围非常广泛以及非常强大的一门技术。介绍爬虫之后,跟大家延伸Python这一门技术,因为讲到爬虫,就会联想到Python,自己也会讲一些关于Python的知识。

目录

一、网络爬虫介绍

二、爬虫(selenium可视化爬虫)具体案例:

三、关于Python的简介:


一、网络爬虫介绍

          1、什么是爬虫:

               网络爬虫(web crawler)也叫网页蜘蛛,网络机器人,是一种用来自动浏览万维网的程序或者脚本。爬虫可以验证超链接和HTML代码,用于网络抓取(Web scraping)。网络搜索引擎等站点通过爬虫软件更新自身的网站内容(Web content)或其对其他网站的索引。

          2、爬虫的由来(为什么会有爬虫):

                随着时代的发展,信息时代引领时代潮流,但我们到网上去搜集信息时,查找网上的海量信息就像大海捞针,森罗万象,要提取到对我们有用的信息,我们需要一种能自动获取网页内容并可以按照指定规则提取相应内容的程序,就这样爬虫就诞生了。

          3、爬虫的原理:

              爬虫首先从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。

用eclipce来实现爬虫技术:

         1、将浏览器加载到jvm

         2、创建浏览器对象

         3、打开对应网址对应的网站

          4、爬虫的爬取对象:包括互联网所有可以爬回的数据、文字、视频、图片,以及非结构化数据。

二、爬虫(selenium可视化爬虫)具体案例:

          1、关于python爬虫的说法,这里有一个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多,例如:

      PHP,JAVA,C++,Python等等,到多数程序员选择Python做爬虫,是因为Python相对来说简单,而且功能比较齐全。今天我跟大家分享爬虫在JAVA语言导入selenium做的    

          2、实操:

一、爬虫的准备工作:(用JAVA语言来做爬虫,并且用的是Maven项目,也可以用web项目,)

       步骤:

               1、在Eclipse中创建一个Maven项目,创建之后要将Maven依赖,以及web版本,还有pom.xml、project.Facets配置好。

               2、导入selenium相关依赖

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

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

要是用web项目去爬虫,就要导入相关的jar包:

               3、下载与浏览器版本相同的压缩包,我用的是谷歌浏览器,在网页主界面点击帮助关于即可查看自己所用浏览的版本:

如果没有相同版本的压缩包,就选版本最近的压缩包:我的浏览器版本是95.0.4638.69,没有这个版本就下载相近的版本:

 点进去之后,无论是什么浏览器,都选择chromedriver_win32.zip,这个文件夹:

                4、将下载的驱动包放置到一个英文文件夹中:

就这样爬虫的准备工作就已经完成了。

二、案例来讲解爬虫

       案例一:获取到百度网页:

        1、用JAVA语言做爬虫的思路:

用JAVA来实现爬虫技术:

         1、将浏览器加载到jvm

         2、创建浏览器对象

         3、打开对应网址对应的网站

        2、具体代码:(每行代码的注释我已经备注好了)

package com.zking.selenium;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class demo1 {
	public static void main(String[] args) {
		System.setProperty("webdriver.chrome.driver", "D:\\initpath\\chromedriver.exe");//以键值对的形式设置,
//		webdriver.chrome.driver是那个驱动包,
//		D:\\initpath\\chromedriver.exe是指那个解压文件的路径
		WebDriver driver=new ChromeDriver();//得到一个谷歌浏览器,
		driver.get("http://www.baidu.com");//得到百度页面
	}
}

        3、运行效果:

        案例二:获取博客:爬取博客内容分为爬取博客的标题,博客的摘要以及博客的发布时间:

先跟大家讲一讲思路:(注意:要用到找规律的思想

              1、首先获取到跳转到我的博客网页的网站

              2、获取到最近全部的博客元素,注意只有三十篇。 

              3、获取每篇文章的标题、摘要以及发布时间的Xpath。

              4、遍历最近博客数组,之后将以上三个元素内容全部打印出来。

先从网上抓一篇博客,就拿自己的博客做案例:

1、首先获取到跳转到我的博客网页的网站:

    我的博客的网站为:"https://blog.csdn.net/m0_53151031?t=1"

相关代码:

		System.setProperty("webdriver.chrome.driver", "D:\\inits\\chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		driver.get("https://blog.csdn.net/m0_53151031?t=1");

2、获取到最近全部的博客元素,注意只有三十篇:

根据节点找到对应的元素数组方法:(列一行代码)

List<WebElement> elements = driver.findElements(By.className("blog-list-box"));

获取到该节点里全部的博客:

List<WebElement> elements = driver.findElements(By.className("blog-list-box"));
//获取到该节点里面全部元素,返回的是一个元素数组。
System.out.println(elements.size());//元素数组长度

运行结果:

跳转过程中: 

最近博客篇数为30:

3、获取每篇文章的标题、摘要以及发布时间的Xpath。

首先讲解一下怎么获取到对应元素的Xpath:(以获取摘要内容为例:) 

3.1获取关于标题的Xpath:

获取单个节点的方法:

driver.findElement(By.xpath());

第一篇博客标题的Xpath:

[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[1]/h4

获取一篇标题还不够,我将要获取到全部标题的Xpath,这就要使用到了找规律的思想,找三篇博客的Xpath进行对比:

第一篇博客标题的Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[1]/h4
第二篇博客标题的Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[1]/h4
第三篇博客标题的Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[1]/h4

可以得出规律,在每一篇博客标题的Xpath中,发现在atricle前的数字是依次增加的。

所以可以写出得到最近全部博客标题的Xpath,在遍历的时候将数字替换成i;

博客标题的遍历:WebElement titleEle = driver.findElement(
                    By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
                            + "]/article/a/div[1]/h4"));

3.2获取关于摘要、发布时间Xpath:

摘要Xpath:

第一个摘要Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[2]
第二个摘要Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[2]
第三个摘要Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[2]

可以写出得到最近全部摘要的Xpath,在遍历的时候将数字替换成i;

博客摘要的遍历:WebElement summaryEle = driver.findElement(
                    By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
                            + "]/article/a/div[2]"));

发布时间Xpath:

第一个发布时间Xpath: [@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[3]/div[2]/span[3]
第二个发布时间Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[3]/div[2]/span[3]
第三个发布时间Xpath:[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[3]/div[2]/span[3]

 

所以可以写出得到最近全部博客发布时间的Xpath,在遍历的时候将数字替换成i;

博客发布时间的遍历:WebElement timeEle = driver.findElement(
                    By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
                            + "]/article/a/div[3]/div[2]/span[3]"));

4、遍历最近博客数组:

代码:

package com.zking.selenium;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class demo2 {
	public static void main(String[] args) {
		System.setProperty("webdriver.chrome.driver", "D:\\inits\\chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		driver.get("https://blog.csdn.net/m0_53151031?t=1");

		List<WebElement> elements = driver.findElements(By.className("blog-list-box"));
		System.out.println(elements.size());
		for (int i = 1; i < elements.size(); i++) {
			WebElement titleEle = driver.findElement(
					By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
							+ "]/article/a/div[1]/h4"));
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[1]/h4
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[1]/h4
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[1]/h4
			System.out.println(titleEle.getText());//输出总共有多少博客
			// 播客摘要
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[2]
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[2]
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[2]
			WebElement summaryEle = driver.findElement(
					By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
							+ "]/article/a/div[2]"));
			System.out.println(summaryEle.getText());//注意这里必须打印该元素的文本内容

			// 发布时间
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[1]/article/a/div[3]/div[2]/span[3]
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[2]/article/a/div[3]/div[2]/span[3]
			//*[@id="floor-user-profile_485"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[3]/article/a/div[3]/div[2]/span[3]

			WebElement timeEle = driver.findElement(
					By.xpath("//*[@id=\"floor-user-profile_485\"]/div/div[2]/div/div[2]/div/div[2]/div/div/div[" + i
							+ "]/article/a/div[3]/div[2]/span[3]"));
			System.out.println(timeEle.getText());
		}
	}
}

注意事项:注意遍历数组时,数字是从1开始:

运行结果:

        案例三:获取二进制文件:比如图片、音乐、视频。

                      这个案例是讲解如何获取网站图片:

1、注意:接下来的代码可以抓取没有对应网站限制的资源

网站限制的方式有以下三种:

1、在某一时间段/min访问60次,会被拉入黑名单--->IP黑名单

2、对应网站会甄别,是人工访问,还是程序访问,是程序访问,就会被访问

3、携带请求的session

2、二进制文件资源抓取的思路

1、按照文字抓取的方式,获取资源的具体地址

2、根据具体地址,通过IO流下载到本地

      2.1将具体地址的资源转换成输入流

      2.2将对应资源写到本地,需要构建输出流

 3.代码:

3.1、按照文字抓取的方式,获取资源的具体地址:

System.setProperty("webdriver.chrome.driver", "D:\\inits\\chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		driver.get("https://m.ivsky.com/");

3.2、根据具体地址,通过IO流下载到本地

         3.2.1:将具体地址的资源转换成输入流:

	// 通过统一资源定位符,获取资源对象
		URL url = new URL(src);
		// 将资源对象转换成输入流
		InputStream in = url.openStream();

         3.2.1:将对应资源写到本地,需要构建输出流:

		// 获取图片格式
		src = src.substring(src.lastIndexOf("."));// 下载图片格式
		FileOutputStream fout = new FileOutputStream("D:/novel/" + UUID.randomUUID().toString() + src);//构建输入流
		BufferedOutputStream bout = new BufferedOutputStream(fout);//buffer增加效益
		byte[] b = new byte[1024];
		while (true) {
			int len = in.read();//.read()方法返回的是0到255范围的内的int字节值
			System.out.println(len);
			if (len == -1)//到达流末尾而没有可用的字节,就会停止下载
				break;
			bout.write(b, 0, len);三个参数分别是:b:读取文件字节值最大值为1024,0:读取文件从0开始,len:每次读取文件时,写入的字节长度。
		}

.write() 这个方法的意思是:读取一个文件从0开始,最大值只有1024,但是一个文件字节值只有10,那么就只读取到10就把该文件给读取完了,如果该文件字节值比1024还要大,分两种情况:1、读到1024就停止对该文件的读取2如果想要继续读,就要定义b的大小。根据文件的最大值来定,可以是2048

4.运行效果:

nove文件夹为空:

运行之后结果:

4.1、对应资源网站:

4.2、运行过程中的控制台:

  运行结果之后:novel文件夹就下好了图片。 

        案例四:爬取音乐,和爬取图片是一样的原理。

1、二进制文件资源抓取的思路

1、按照文字抓取的方式,获取资源的具体地址

2、根据具体地址,通过IO流下载到本地

      2.1将具体地址的资源转换成输入流

      2.2将对应资源写到本地,需要构建输出流

2、代码:

package com.zking.selenium;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.UUID;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class demo4 {
	public static void main(String[] args) throws Exception {
		System.setProperty("webdriver.chrome.driver", "D:\\inits\\chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		driver.get("https://houzi8.com/peiyue/qingyinyue-0-0-0-0-0?usid=22876&bd_vid=10917515020733932303");

		/*
		 * 二进制文件资源抓取 1.按照文字爬取的方式,获取到资源的具体地址 ①、将具体地址的资源转换成输入流 ②、将对应资源写到本地,需要构建输出流
		 * selenium jsoup
		 */
		List<WebElement> audioEles = driver.findElements(By.className("play-button-wrapper"));//获取整个音乐---->数组
		for (WebElement audioEle : audioEles) {
			audioEle.click();
			WebElement playEle = driver.findElement(By.xpath("//*[@id=\\\"wavesurferPlayer\\\"]/audio"));//找到对应的Xpath
			System.out.println(playEle.getAttribute("src"));//获取资源路径
			downloadImg(playEle.getAttribute("src"));
		}
	}

	private static void downloadImg(String src) throws Exception {
		// 通过统一资源定位符,获取资源对象
		URL url = new URL(src);
		// 将资源对象转换成输入流
		InputStream in = url.openStream();
		src = src.substring(src.lastIndexOf("."));
		FileOutputStream fout = new FileOutputStream("D:/novel1/" + UUID.randomUUID().toString() + src);//下载到本地路径
		BufferedOutputStream bout = new BufferedOutputStream(fout);
		byte[] b = new byte[1024];
		while (true) {
			int len = in.read(b);
			if (len == -1)
				break;
			bout.write(b, 0, len);
		}
	}

}

三、关于Python的简介:

         1、Python的起源:

              python这么强大的语言是由荷兰数学和计算机科学研究学会的Guido va Rossum于1990年代初设计。其中Guido发明的pathon语言的历程

              1989年,Guido创立了Python语言

              2005年12月 ,Guido在google公司任职,

              2012年12月7日,Dropbox宣布吉多·范罗苏姆加入Dropbox公司。

              Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。

              像 Perl 语言一样,Python 源代码同样遵循 GPL(GNU General Public License)协议。

              现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。

              Python 2.7 被确定为最后一个 Python 2.x 版本,它除了支持 Python 2.x 语法外,还支持部分 Python 3.1 语法。

              Python 3.0 于 2008 年 12 月 3 日发布,此版不完全兼容之前的 Python 源代码。不过,很多新特性后来也被移植到旧的Python 2.6/2.7版本。

              Python 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。

              那么彻底的起源是什么呢,也就是说,有Guido参与设计的一个语言ABC 是一个非常强大而且的优美的语言,可惜的是ABC是属于那种非开发性的,后来Guido就发明了Pathoy这门强大的语言。

         2、Python是什么:度娘上是这样说道:

              Python是一种计算机程序设计语言,作为一门叫做ABC语言的替代品,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。以及python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python这个单词原意是蟒蛇,可以想象为一条蟒蛇爬到对应网页上进行爬取数据。

也可以进行细讲:

              Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

              Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。

              Python 是交互式语言: 这意味着,您可以在一个 Python 提示符 >>> 后直接执行代码。

              Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。

         3、Python的十大特点:

              3.1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。

              3.2.易于阅读:Python语言简洁

              3.3.易于维护:Python的成功在于它的源代码是相当容易维护的。

              3.4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好。

              3.5.互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。

              3.6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。

              3.7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。

              3.8.数据库:Python提供所有主要的商业数据库的接口。

              3.9.GUI编程:Python支持GUI可以创建和移植到许多系统调用。

              3.10.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。

         4、Python主要用途:

              1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

         5、Python作用:

              1、系统编程

              2、图形处理

              3、数学处理

              4、文本处理

              5、数据库编程

              6、网络编程            

总结:爬虫这一门技术,涉及到各行语言,但是我们说到爬虫,第一个就会联想到Python爬虫,其他语言也可以做爬虫,PHP,JAVA,C++,Python等等。我今天跟大家分享的是使用在JAVA导入selenium做的爬虫,做爬虫技术的时候,个人觉得找到对应的节点,还有根据找到节点之间的规律,那么爬虫技术就不难了。当然在做爬虫之前的准备工作也很重要!

爬虫知识就分享到这里了,希望对你有所帮助,有纰漏之处请大神多加指点。

        

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值