webmagic框架
用起来很方便,不用配置,把核心包导入后, 通过实现PageProcessor接口
下面四部分是框架的核心组件
- Downloader负责从互联网上下载页面(一般情况不用我们管,我们只要找到页面指定路径它通过httpClient请求方式获取,框架自动下载)(底层---通过Downloader接口的download方法,然后用HttpClientDownloader去实现它,至于IP,端口等参数,这个框架是通过代理的形式传入,进行http请求,下载web页面)
- PageProcessor负责解析页面,抽取有用信息,以及发现新的链接(这个接口,我们实现它,在方法中想办法获取页面的地址,以及目标页的内容)(底层----也是要实现这个接口中的process()方法,进行需要的数据的提取)
- Scheduler负责管理待抓取的URL,以及一些去重的工作(如果只是控制台输出用不到这个方法,调用这个方法可以把url下载到本地,如果想按自己指定的方式输出需要自己,通过File文件实现本地保存数据)(底层---两个作用---提取URL和去重,我们可以把要加的url放到缓存池中,但底层实现的时候会先对url通过concurrenthashmap进行去重放到set集合中,提取urls这些不重复的地址是存放在LinkBlockingQueue的阻塞队列中)
- Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等(我暂时没用它,它可以把数据持久保存)(底层----实现Pipeline接口,我们可以通过该方法传入的参数,获取我们想要到信息,把参数可以传入进自己写的方法,然后通过File可以保存到本地,也可以通过数据库把信息持久化保存起来)
xpath的相关用法
String contents = page.getHtml().xpath("//*[@id=\"article\"]/p/text()").all().toString();
css的用法
List<String> detailUrlList = page.getHtml().css(list_css_url).links().all();
正则的用法
String match_url = "http://roll\.mil\.news\.sina\.com\.cn/col/zgjq/\w+\.shtml";
page.getUrl().regex(match_url).match();
对于列表页--我们把页面中要用的链接加到下面方法中,为了在详情页获取想要的内容,做铺垫。
page.addTargetRequests(detailUrlList);
spider-------启动爬虫 方法选择性用根据情况来定
// 启动爬虫
Spider.create(new TargetContent())
// 添加初始化的URL
.addUrl("http://roll.mil.news.sina.com.cn/col/zgjq/index_1.shtml")
.scheduler(new FileCacheQueueScheduler("E:\\webmagic\\message"))
// 启动10个线程
.thread(10)
// 运行
.run();
endTime = System.currentTimeMillis();
System.out.println("爬取结束,耗时约" + ((endTime - startTime) / 1000) + "秒,抓取了" + count + "条记录");
site 相关编码 时间间隔 重试次数等
/**
* 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
*/
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
注意点:
使用css() 方式时操作分页时 ----存在硬编码(到最后一页时,结构不一样的话,就会找不到)
使用regex() 方法时 -----没有输出结果时,要多检查正则是否有问题
对于规则url截取时,多用spilt()会很方便
对于不能直接找到内容的页面----我们要区分列表页 和 详情页 if-else 判断就行
webmagic ----xpath 不支持 //ul[1]
不支持同一类型的多个请求一起List<request>
只能单个单个写