原文链接:
webmagic 基本的方法 - 走看看
WebMagic的结构分为Downloader
、PageProcessor
、Scheduler
、Pipeline
四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能
PageProcessor 需要自己写
Scheduler 除非项目有一些特殊的分布式需求,否则无需自己定制
Pipeline 要保存到数据库需要自己定制
Selectable
方法 说明 示例 xpath(String xpath) 使用XPath选择 html.xpath("//div[@class='title']") $(String selector) 使用Css选择器选择 html.$("div.title") $(String selector,String attr) 使用Css选择器选择 html.$("div.title","text") css(String selector) 功能同$(),使用Css选择器选择 html.css("div.title") links() 选择所有链接 html.links() regex(String regex) 使用正则表达式抽取 html.regex("<div>(.*?)") regex(String regex,int group) 使用正则表达式抽取,并指定捕获组 html.regex("<div>(.*?)",1) replace(String regex, String replacement) 替换内容 html.replace("","")
返回结果
方法 说明 示例 get() 返回一条String类型的结果 String link= html.links().get() toString() 功能同get(),返回一条String类型的结果 String link= html.links().toString() all() 返回所有抽取结果 List links= html.links().all() match() 是否有匹配结果 if (html.links().match()){ xxx; }
Spider
Site
方法 说明 示例 setCharset(String) 设置编码 site.setCharset("utf-8") setUserAgent(String) 设置UserAgent site.setUserAgent("Spider") setTimeOut(int) 设置超时时间,单位是毫秒 site.setTimeOut(3000) setRetryTimes(int) 设置重试次数 site.setRetryTimes(3) setCycleRetryTimes(int) 设置循环重试次数 site.setCycleRetryTimes(3) addCookie(String,String) 添加一条cookie site.addCookie("dotcomt_user","code4craft") setDomain(String) 设置域名,需设置域名后,addCookie才可生效 site.setDomain("github.com") addHeader(String,String) 添加一条addHeader site.addHeader("Referer","https://github.com ") setHttpProxy(HttpHost) 设置Http代理 site.setHttpProxy(new HttpHost("127.0.0.1",8080))
Xsoup
Name Expression Support nodename nodename yes immediate parent / yes parent // yes attribute [@key=value] yes nth child tag[n] yes attribute /@key yes wildcard in tagname /* yes wildcard in attribute /[@*] yes function function() part or a | b yes since 0.2.0 parent in path . or .. no predicates price>35 no predicates logic @class=a or @class=b yes since 0.2.0
另外作者自己定义了几个对于爬虫来说,很方便的XPath函数。但是请注意,这些函数式标准XPath没有的。
Expression Description XPath1.0 text(n) 第n个直接文本子节点,为0表示所有 text() only allText() 所有的直接和间接文本子节点 not support tidyText() 所有的直接和间接文本子节点,并将一些标签替换为换行,使纯文本显示更整洁 not support html() 内部html,不包括标签的html本身 not support outerHtml() 内部html,包括标签的html本身 not support regex(@attr,expr,group) 这里@attr和group均可选,默认是group0 not support
代理
API 说明 HttpClientDownloader.setProxyProvider(ProxyProvider proxyProvider) 设置代理
1.设置单一的普通HTTP代理为101.101.101.101的8888端口,并设置密码为"username","password"
HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
httpClientDownloader.setProxyProvider(SimpleProxyProvider.from(new Proxy("101.101.101.101",8888,"username","password")));
spider.setDownloader(httpClientDownloader);
2.设置代理池,其中包括101.101.101.101和102.102.102.102两个IP,没有密码
HttpClientDownloader httpClientDownloader = new HttpClientDownloader();
httpClientDownloader.setProxyProvider(SimpleProxyProvider.from(
new Proxy("101.101.101.101",8888)
,new Proxy("102.102.102.102",8888)));
HttpRequestBody
API 说明 HttpRequestBody.form(Map<string,object> params, String encoding) 使用表单提交的方式 HttpRequestBody.json(String json, String encoding) 使用JSON的方式,json是序列化后的结果 HttpRequestBody.xml(String xml, String encoding) 设置xml的方式,xml是序列化后的结果 HttpRequestBody.custom(byte[] body, String contentType, String encoding) 设置自定义的requestBody
组件的使用
方法 说明 示例 setScheduler() 设置Scheduler spipder.setScheduler(new FileCacheQueueScheduler("D:datawebmagic")) setDownloader() 设置Downloader spipder.setDownloader(new SeleniumDownloader())) addPipeline() 设置Pipeline,一个Spider可以有多个Pipeline spipder.addPipeline(new FilePipeline())
结果输出方式
类 说明 备注 ConsolePipeline 输出结果到控制台 抽取结果需要实现toString方法 FilePipeline 保存结果到文件 抽取结果需要实现toString方法 JsonFilePipeline JSON格式保存结果到文件 ConsolePageModelPipeline (注解模式)输出结果到控制台 FilePageModelPipeline (注解模式)保存结果到文件 JsonFilePageModelPipeline (注解模式)JSON格式保存结果到文件 想要持久化的字段需要有getter方法