{
this.resultTagName = resultTagName;
}
public int getType()
{
return type;
}
public void setType(int type)
{
this.type = type;
}
public int getRequestMoethod()
{
return requestMoethod;
}
public void setRequestMoethod(int requestMoethod)
{
this.requestMoethod = requestMoethod;
}
}
简单说一下:这个规则类定义了我们查询过程中需要的所有信息,方便我们的扩展,以及代码的重用,我们不可能针对每个需要抓取的网站写一套代码。
2、需要的数据对象,目前只需要链接,LinkTypeData.java
package com.zhy.spider.bean;
public class LinkTypeData
{
private int id;
/**
- 链接的地址
*/
private String linkHref;
/**
- 链接的标题
*/
private String linkText;
/**
- 摘要
*/
private String summary;
/**
- 内容
*/
private String content;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getLinkHref()
{
return linkHref;
}
public void setLinkHref(String linkHref)
{
this.linkHref = linkHref;
}
public String getLinkText()
{
return linkText;
}
public void setLinkText(String linkText)
{
this.linkText = linkText;
}
public String getSummary()
{
return summary;
}
public void setSummary(String summary)
{
this.summary = summary;
}
public String getContent()
{
return content;
}
public void setContent(String content)
{
this.content = content;
}
}
3、核心的查询类:ExtractService.java
package com.zhy.spider.core;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.plaf.TextUI;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import com.zhy.spider.bean.LinkTypeData;
import com.zhy.spider.rule.Rule;
import com.zhy.spider.rule.RuleException;
import com.zhy.spider.util.TextUtil;
/**
-
@author zhy
*/
public class ExtractService
{
/**
-
@param rule
-
@return
*/
public static List extract(Rule rule)
{
// 进行对rule的必要校验
validateRule(rule);
List datas = new ArrayList();
LinkTypeData data = null;
try
{
/**
- 解析rule
*/
String url = rule.getUrl();
String[] params = rule.getParams();
String[] values = rule.getValues();
String resultTagName = rule.getResultTagName();
int type = rule.getType();
int requestType = rule.getRequestMoethod();
Connection conn = Jsoup.connect(url);
// 设置查询参数
if (params != null)
{
for (int i = 0; i < params.length; i++)
{
conn.data(params[i], values[i]);
}
}
// 设置请求类型
Document doc = null;
switch (requestType)
{
case Rule.GET:
doc = conn.timeout(100000).get();
break;
case Rule.POST:
doc = conn.timeout(100000).post();
break;
}
//处理返回数据
Elements results = new Elements();
switch (type)
{
case Rule.CLASS:
results = doc.getElementsByClass(resultTagName);
break;
case Rule.ID:
Element result = doc.getElementById(resultTagName);
results.add(result);
break;
case Rule.SELECTION:
results = doc.select(resultTagName);
break;
default:
//当resultTagName为空时默认去body标签
if (TextUtil.isEmpty(resultTagName))
{
results = doc.getElementsByTag(“body”);
}
}
for (Element result : results)
{
Elements links = result.getElementsByTag(“a”);
for (Element link : links)
{
//必要的筛选
String linkHref = link.attr(“href”);
String linkText = link.text();
data = new LinkTypeData();
data.setLinkHref(linkHref);
data.setLinkText(linkText);
datas.add(data);
}
}
} catch (IOException e)
{
e.printStackTrace();
}
return datas;
}
/**
- 对传入的参数进行必要的校验
*/
private static void validateRule(Rule rule)
{
String url = rule.getUrl();
if (TextUtil.isEmpty(url))
{
throw new RuleException(“url不能为空!”);
}
if (!url.startsWith(“http://”))
{
throw new RuleException(“url的格式不正确!”);
}
if (rule.getParams() != null && rule.getValues() != null)
{
if (rule.getParams().length != rule.getValues().length)
{
throw new RuleException(“参数的键值对个数不匹配!”);
}
}
}
}
4、里面用了一个异常类:RuleException.java
package com.zhy.spider.rule;
public class RuleException extends RuntimeException
{
public RuleException()
{
super();
// TODO Auto-generated constructor stub
}
public RuleException(String message, Throwable cause)
{
super(message, cause);
// TODO Auto-generated constructor stub
}
public RuleException(String message)
{
super(message);
// TODO Auto-generated constructor stub
}
public RuleException(Throwable cause)
{
super(cause);
// TODO Auto-generated constructor stub
}
}
5、最后是测试了:这里使用了两个网站进行测试,采用了不同的规则,具体看代码吧
package com.zhy.spider.test;
import java.util.List;
import com.zhy.spider.bean.LinkTypeData;
import com.zhy.spider.core.ExtractService;
import com.zhy.spider.rule.Rule;
public class Test
{
@org.junit.Test
public void getDatasByClass()
{
Rule rule = new Rule(
“http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicIndexQuery”,
new String[] { “query.enterprisename”,“query.registationnumber” }, new String[] { “兴网”,“” },
“cont_right”, Rule.CLASS, Rule.POST);
List extracts = ExtractService.extract(rule);
printf(extracts);
}
@org.junit.Test
public void getDatasByCssQuery()
{
Rule rule = new Rule(“http://www.11315.com/search”,
new String[] { “name” }, new String[] { “兴网” },
“div.g-mn div.con-model”, Rule.SELECTION, Rule.GET);
List extracts = ExtractService.extract(rule);
printf(extracts);
}
public void printf(List datas)
{
for (LinkTypeData data : datas)
{
System.out.println(data.getLinkText());
System.out.println(data.getLinkHref());
System.out.println(“***********************************”);
}
}
}
输出结果:
深圳市网兴科技有限公司
http://14603257.11315.com
荆州市兴网公路物资有限公司
http://05155980.11315.com
西安市全兴网吧
子长县新兴网城
陕西同兴网络信息有限责任公司第三分公司
西安高兴网络科技有限公司
陕西同兴网络信息有限责任公司西安分公司
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)
O等大厂,18年进入阿里一直到现在。**
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-ZUyUHgWf-1713594132515)]
[外链图片转存中…(img-RILX54H5-1713594132516)]
[外链图片转存中…(img-HcUvcAsp-1713594132517)]
[外链图片转存中…(img-mJoA56Ul-1713594132518)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)