爬虫框架webmagic模块构成:
Downloader:下载器
PageProcess:页面解析的业务逻辑
Pipeline:数据持久化。
Scheduler:url队列
课程计划:
爬虫的高级技术:
1)Quartz定时器
2)代理的使用
3)selenium+无头浏览器,实现动态爬虫
4)综合案例
二、定时器
1、Timer
2、Quartz:定时框架
功能强大,使用繁琐。
3、spring中使用定时
也是使用Quartz框架。
在Springboot框架中使用定时器:
1)@Scheduled
在需要定期执行的方法上添加此注解。
2)在Springboot的引导类
@EnableScheduling
4、需求,定时向控制台输出当前时间的代码:
//测试定时器用法的类
@Component
public class SchedulerTest {
@Scheduled(
//fixedDelay = 1000,固定延迟,固定延迟多长时间执行。long类型
//fixedDelayString = "1000",固定延迟执行,同fixedDelay,数据类型是String类型。
//fixedRate = 1000,固定周期执行
//fixedRateString = "1000",字符串类型的值,使用方法同fixedRate
//复杂的周期执行应该使用cron表达式:
// cron属性的值就是cron表达式,就是一个字符串。
// 在此注解中不支持年份,表达式只能是6段
cron = "0/2 * * * * ? "
)
//每隔多少时间,输出一次当前时间。
public void printTime() {
System.out.println(new Date().toLocaleString());
}
}
延时:如果上一个方法没有执行完,就等待。
周期:如果上一个方法没有执行完,也要立即执行。
@Scheduled
fixedDelay:固定延迟,固定延迟多长时间执行。long类型
fixedDelayString:固定延迟执行,同fixedDelay,数据类型是String类型。
fixedRate:固定周期执行
fixedRateString:字符串类型的值,使用方法同fixedRate
复杂的周期执行应该使用cron表达式:
cron属性的值就是cron表达式,就是一个字符串。
在此注解中不支持年份,表达式只能是6段
2.3.corn表达式
cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。这些子表达式是分开的空白,代表:
- Seconds(秒)
- Minutes (分)
- Hours (时)
- Day-of-Month(一个月中的某一天)
- Month(月)
- Day-of-Week(一周中的星期几)
- Year (可选字段)(年)
例 “0 0 12 ? * WED” 在每星期三下午12:00 执行,
“*” 代表整个时间段
每一个字段都有一套可以指定有效值,如
Seconds (秒) :可以用数字0-59 表示,
Minutes(分) :可以用数字0-59 表示,
Hours(时) :可以用数字0-23表示,
Day-of-Month(天) :可以用数字1-31 中的任一一个值,但要注意一些特别的月份
Month(月) :可以用0-11 或用字符串:
JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
Day-of-Week(天) :可以用数字1-7表示(1 = 星期日)或用字符口串:
SUN, MON, TUE, WED, THU, FRI, SAT
“/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行
“?”:表示每月的某一天,或第周的某一天
“L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”
最简单的生成方式,使用cron在线生成器:
http://cron.qqe2.com/
三、代理的使用
1、应用场景
防止服务器识别出爬虫。
2、获得代理服务器
可以找一些免费的代理服务器
米扑代理(推荐)
https://proxy.mimvp.com/free.php
西刺免费代理IP
http://www.xicidaili.com/
3、使用方法
在webmagic框架中使用代理。
应该创建一个Downloader对象,配置代理服务器。
1、创建一个PageProcessor对象。
2、创建一个Downloader对象,可以使用HttpClientDownloader
3、在Downloader对象中配置代理服务器。
4、使用Spider类组装爬虫。执行爬虫
5、使用代理,需要加额外的扩展jar
<!--WebMagic扩展-->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.downloader.HttpClientDownloader;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.proxy.Proxy;
import us.codecraft.webmagic.proxy.ProxyProvider;
import us.codecraft.webmagic.proxy.SimpleProxyProvider;
public class MyPageProcessor implements PageProcessor {
@Override
public void process(Page page) {
String html = page.getHtml().get();
page.putField("html", html);
}
@Override
public Site getSite() {
return Site.me();
}
public static void main(String[] args) {
//创建一个Downloader组件
HttpClientDownloader downloader = new HttpClientDownloader();
//在Downloader对象中配置代理服务器地址,设置代理的对象
ProxyProvider proxyProvider = SimpleProxyProvider.from(
new Proxy("117.191.11.109", 8080)
);
//为下载组件,赋予代理服务器对象
downloader.setProxyProvider(proxyProvider);
//使用Spider类组装爬虫
Spider.create(new MyPageProcessor())
//设置Downloader组件
.setDownloader(downloader)
.addUrl("http://www.itcast.cn")
.start();
}
}
四、使用selenium+无头浏览器
1、selenium
前端测试框架
java
.net
python
node.js
通过代码控制浏览器。
2、无头浏览器,就是没有图像界面的浏览器。也就是后台运行。
phantomjs:无头浏览器,不再更新。将来会被淘汰。(了解)
普通浏览器的无头浏览模式:
chrome(推荐使用)
Firefox
3、chrome
1)先安装chrome浏览器
2)然后安装chrome浏览器的驱动selenium的驱动,应该放到chrome浏览器所在的目录下。
注意:网上人说Selenium已经不再支持PhantomJS浏览器了推荐使用chrome或者Firefox来进行测试。这些文章大多都是使用python的文章,在java中还是可以使用的。当然在java中也可以使用chrome的无头模式或者的Firefox的无头模式。
如果使用Chrome需要下载对应版本的chromedriver驱动文件,具体版本参考:
https://www.cnblogs.com/JHblogs/p/7699951.html
3)编写代码
1、向工程中添加jar包。selenium的jar包即可。
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.13.0</version>
</dependency>
2、创建浏览器的配置参数。
3、创建一个WebDriver对象,代表浏览器。
4、使用WebDriver对象控制浏览器。
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class ChromeTest {
public static void main(String[] args) {
//创建配置参数,并且设置无头浏览器驱动的名字和路径
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86