CN108710683A - 一种避免网络连接失败后重复抓取分页内容的方法 - Google Patents
一种避免网络连接失败后重复抓取分页内容的方法 Download PDFInfo
- Publication number
- CN108710683A CN108710683A CN201810483679.2A CN201810483679A CN108710683A CN 108710683 A CN108710683 A CN 108710683A CN 201810483679 A CN201810483679 A CN 201810483679A CN 108710683 A CN108710683 A CN 108710683A
- Authority
- CN
- China
- Prior art keywords
- paging
- content
- link
- main table
- pages
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及SPRING BOOT爬虫技术领域,特别涉及一种避免网络连接失败后重复抓取分页内容的方法。本发明方法如下:1、创建主副两张表,主表用于保存标题、链接及链接对应的分页总页数、当前页数等,副表用于保存分页列表、链接及主表ID等;2、使用爬虫工具定时抓取1中所述的内容,保存到主表中;3、加载主表内容,然后以当前页数开始,总页数为结束,进行循环,根据标题链接与循环值拼接分页URL;4、抓取分页内容时与从副表中读取的数据对比,相同则跳过,继续抓取下一行内容;5、最后把分页的当前页数替换掉主表中的,这样下次抓取的分页就不会重复。本发明解决了网络连接失败后重新启动定时器抓取每个分页内容时容易重复抓取的问题。
Description
技术领域
本发明涉及Spring Boot爬虫技术领域,特别涉及一种避免网络连接失败后重复抓取分页内容的方法。
背景技术
在进行网页情报信息抓取时,经常会有各种各样的原因造成连接不上所要抓取的网站,比如抓取的主机发生断网,或者网页所属的服务器重启等。如果不进行一定的技术处理,那每次定时器启动时就会从分页的第一页重新开始抓取,造成数据库中大量信息的重复;为了解决这些问题,需要实现一种能解决重复抓取的功能。
发明内容
本发明解决的技术问题在于提供一种避免网络连接失败后重复抓取分页内容的方法;解决了网络连接失败后重新启动定时器抓取每个分页内容时容易重复抓取的问题。
本发明解决上述技术问题的技术方案是:1、创建主副两张表,主表用于保存标题、链接及链接对应的分页总页数、当前页数等,副表用于保存分页列表、链接及主表ID等;2、使用爬虫工具定时抓取1中所述的内容,保存到主表中;3、加载主表内容,然后以当前页数开始,总页数为结束,进行循环,根据标题链接与循环值拼接分页URL;4、抓取分页内容时与从副表中读取的数据对比,相同则跳过,继续抓取下一行内容;5、最后把分页的当前页数替换掉主表中的,这样下次抓取的分页就不会重复。从而解决了网络连接失败后重新启动定时器抓取每个分页内容时重复抓取的问题。
所述的方法具体包括如下步骤:
步骤一、创建主副两张表,其中主表用于保存标题、标题的链接及链接对应的分页总页数、当前页数等,副表用于保存分页列表信息、列表的链接及主表的ID等;
步骤二、在项目中配置Quartz定时器,设定一个时间,定时调用爬虫工具抓取步骤一中所述的内容,把其保存到主表中;
步骤三、定义分页查询任务,从数据库中查询出主表的内容,然后以当前页数为开始值,总页数为结束值,进行循环,在循环体内根据标题链接与循环值拼接出分页URL;
步骤四、加载分页URL,使用爬虫工具获取每个列表的链接,并与从副表中读取的当前页的链接进行对比,相同就跳过,然后继续抓取下一行内容;
步骤五、保存完抓取的分页内容后,把当前的页数保存到主表中,替换掉原来的当前分页数,若网络异常就会从这个页数开始,避免了从第一页开始重复抓取。
本发明的有益效果:通过主副表的形式,把每次网络连接失败后的分页所属的当前页数保存到主表中,再次抓取的时候,就从失败后的那一页开始抓取,并且每次抓取分页列表时都与数据库中的内容进行对比,不相同时才开始下一行的抓取,从而达到网络连接失败后重新启动定时器抓取分页内容时不会重复的目的。有效解决了网络连接失败后重新启动定时器抓取每个分页内容时容易重复抓取的问题。
附图说明
下面结合附图对本发明进一步说明:
图1为本发明的流程图。
具体实施方式
如图1所示,本发明采用如下步骤:
步骤一、创建主副两张表,其中主表用于保存标题、标题的链接及链接对应的分页总页数、当前页数等,副表用于保存分页列表信息、列表的链接及主表的ID等;
//创建主表
DROP TABLE IF EXISTS `info_main`;
CREATE TABLE `info_main` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`siteName` varchar(500) DEFAULT NULL,
`mainTitle` varchar(500) DEFAULT NULL COMMENT '需要抓取的标题',
`content` varchar(500) DEFAULT NULL COMMENT '内容',
`mainUrl` varchar(500) DEFAULT NULL COMMENT '主url',
`params` varchar(1000) DEFAULT NULL COMMENT 'url参数',
`jsUrl` varchar(500) DEFAULT NULL COMMENT '脚本url',
`currentPage` int(255) DEFAULT '0' COMMENT '当前页',
`totalPage` int(255) DEFAULT '0' COMMENT '总页数',
`totalNum` int(11) DEFAULT '0' COMMENT '总条数',
`modifyDate` datetime DEFAULT NULL COMMENT '修改日期',
`createDate` datetime DEFAULT NULL COMMENT '创建日期',
`hasAdd` int(2) DEFAULT '0' COMMENT '是否添加, 0: 没有, 1:添加',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
//创建明细表
DROP TABLE IF EXISTS `info_list`;
CREATE TABLE `info_list` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`mainId` bigint(20) DEFAULT NULL,
`listTitle` varchar(500) DEFAULT NULL COMMENT '需要抓取的标题',
`listContent` varchar(500) DEFAULT NULL,
`listUrl` varchar(500) DEFAULT NULL COMMENT '主url',
`jsUrl` varchar(500) DEFAULT NULL COMMENT '脚本url',
`currentPage` int(255) DEFAULT '0' COMMENT '当前页',
`totalPage` int(255) DEFAULT '0' COMMENT '总页数',
`totalNum` int(11) DEFAULT '0' COMMENT '总条数',
`modifyDate` datetime DEFAULT NULL COMMENT '修改日期',
`createDate` datetime DEFAULT NULL COMMENT '创建日期',
`hasAdd` int(2) DEFAULT '0' COMMENT '是否添加, 0: 没有, 1:添加',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=316 DEFAULT CHARSET=utf8;
步骤二、在项目中配置Quartz多任务定时器,设定一个时间,定时调用爬虫工具抓取步骤一中所述的内容,把其保存到主表中;
//1、配置多任务定时器
@Configuration
public class SchedulerSetting implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
public InfoScheduler infoScheduler;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
infoScheduler.scheduleJobs();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
return schedulerFactoryBean;
}
}
//2、配置主任务调用
public class MainJob implements Job {
@Resource
private SpiderService spiderService;
@Override
public void execute(JobExecutionContext context) throwsJobExecutionException {
try {
spiderService.getInfoMain();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//3、在Controller调用,扫描标题部分与对应分页的总页数等信息
@Controller
public class QuartzController extends BaseController {
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
public void scheduleJobs() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
startMainJob(scheduler);
//startListJob(scheduler);
}
private void startMainJob(Scheduler scheduler) throws SchedulerException{
JobDetail jobDetail = JobBuilder.newJob(MainJob.class)
.withIdentity("mainJob", "infoGroup").build();
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0 0 0 0 1#1 ");
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("mainTrigger", "infoGroup")
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail,cronTrigger);
}
}
//4、具体抓取标题等信息
public void getInfoMain() throws IOException {
try {
String INFO_URL = "http://www.***.com/titles";
Document doc = JSoupUtil.getConn(INFO_URL).get();
Elements elementTitles = doc.select("#titles");
String totalPage = doc.select(“#totalPage”).get(0).text();
for (Element e : elementTitles) {
String linkHref = link.attr("href");
String linkText = link.text();
……
InfoMain infoMain = new InfoMain();
infoMain.setMainTitle(linkText);
infoMain.setTotalPage(totalPage);
infoMain.setCurrentPage(1);
//保存到数据库中
infoMainMapper.insert();
}
} catch (ScriptException e) {
e.printStackTrace();
}
}
步骤三、定义分页查询任务,从数据库中查询出主表的内容,然后以当前页数为开始值,总页数为结束值,进行循环,在循环体内根据标题链接与循环值拼接出分页URL;
//1、定义分页查询任务
public class ListJob implements Job {
@Resource
private SpiderService spiderService;
@Resource
private InfoMainService infoMainService;
@Override
public void execute(JobExecutionContext context) throwsJobExecutionException {
try {
//2、从主表数据库中读取信息
List<InfoMain> infoMainList = infoMainService.selectByMap(null);
if(infoMainList != null && infoMainList.size() > 0){
//3、对每个标题对应的内容抓取
for(InfoMain infoMain : infoMainList){
spiderService.getInfoList(infoMain);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//4、拼接url
public void getInfoList(InfoMain infoMain) {
try {
Integer totalPage = infoMain.getTotalPage();
String url = infoMain.getMainUrl() + infoMain.getParams();
Integer curPage = infoMain.getCurrentPage();
if (totalPage != null && totalPage > 0) {
for (int i = curPage + 1; i <= totalPage; i++) {
url = url + i;
……
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
步骤四、加载分页URL,使用爬虫工具获取每个列表的链接,并与从副表中读取的当前页的链接进行对比,相同就跳过,继续抓取下一行内容;
HtmlPage htmlpage = WebClientUtil.getWebClient().getPage(url);
String htmlContent = htmlpage.asXml();
Document doc = Jsoup.parse(htmlContent);
Elements pElements = doc.select("p[align=left]");
for (Element e : pElements) {
//获得全a标签信息
Elements links = e.getElementsByTag("a");
/对链接标签遍历
for (Element link : links) {
String linkHref = link.attr("href");
String linkText = link.text();
//查询数据库记录,判断当前linkHref是否在数据库中,存在的话就不再添加
Map<String, Object> columnMap = new HashMap<String, Object>();
columnMap.put("jsUrl", linkHref);
List<InfoList> infoLists = infoListMapper.selectByMap(columnMap);
if (infoLists != null && infoLists.size() > 0) {
continue;//跳出循环
}
}
}
步骤五、保存完抓取的分页内容后,把当前的页数保存到主表中,替换掉原来的当前分页数,若网络异常就会从这个页数开始,避免了从第一页开始重复抓取;
//保存分页内容
InfoList infoList = new InfoList();
infoList.setHasAdd(0);
infoList.setCurrentPage(i);
……
infoListMapper.insert(infoList);
//更新当前页,其中i为步骤四中循环时的值
InfoMain infoMain = new InfoMain();
infoMain.setCurrentPage(i);
……
infoMainMapper.updateById(infoMain)。
Claims (2)
1.一种避免网络连接失败后重复抓取分页内容的方法,其特征在于:一、创建主副两张表,主表用于保存标题、链接及链接对应的分页总页数、当前页数等,副表用于保存分页列表、链接及主表ID等;二、使用爬虫工具定时抓取一中所述的内容,保存到主表中;三、加载主表内容,然后以当前页数开始,总页数为结束,进行循环,根据标题链接与循环值拼接分页URL;四、抓取分页内容时与从副表中读取的数据对比,相同则跳过,继续抓取下一行内容;五、最后把分页的当前页数替换掉主表中的,这样下次抓取的分页就不会重复;从而解决了网络连接失败后重新启动定时器抓取每个分页内容时容易重复抓取的问题。
2.根据权利要求1所述的基于SPRING BOOT平台的一种避免网络连接失败后重复抓取分页内容的方法,其特征在于:每次网络连接失败后,再次抓取时都从失败后的那一页开始抓取,并且每次抓取分页列表时都与数据库中的内容进行对比,不相同时才开始下一行的抓取;所述的方法具体包括如下步骤:
步骤一、创建主副两张表,其中主表用于保存标题、标题的链接及链接对应的分页总页数、当前页数等,副表用于保存分页列表信息、列表的链接及主表的ID等;
步骤二、在项目中配置Quartz定时器,设定一个时间,定时调用爬虫工具抓取步骤一中所述的内容,把其保存到主表中;
步骤三、定义分页查询任务,从数据库中查询出主表的内容,然后以当前页数为开始值,总页数为结束值,进行循环,在循环体内根据标题链接与循环值拼接出分页URL;
步骤四、加载分页URL,使用爬虫工具获取每个列表的链接,并与从副表中读取的当前页的链接进行对比,相同就跳过,然后继续抓取下一行内容;
步骤五、保存完抓取的分页内容后,把当前的页数保存到主表中,替换掉原来的当前分页数,网络异常后就会从这个页数开始,避免了从第一页开始重复抓取。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810483679.2A CN108710683A (zh) | 2018-05-21 | 2018-05-21 | 一种避免网络连接失败后重复抓取分页内容的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810483679.2A CN108710683A (zh) | 2018-05-21 | 2018-05-21 | 一种避免网络连接失败后重复抓取分页内容的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108710683A true CN108710683A (zh) | 2018-10-26 |
Family
ID=63869124
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810483679.2A Withdrawn CN108710683A (zh) | 2018-05-21 | 2018-05-21 | 一种避免网络连接失败后重复抓取分页内容的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108710683A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111241436A (zh) * | 2019-12-31 | 2020-06-05 | 五八有限公司 | 一种数据请求处理方法、装置、终端设备及存储介质 |
-
2018
- 2018-05-21 CN CN201810483679.2A patent/CN108710683A/zh not_active Withdrawn
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111241436A (zh) * | 2019-12-31 | 2020-06-05 | 五八有限公司 | 一种数据请求处理方法、装置、终端设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Brandman et al. | Crawler-friendly web servers | |
CN102262544B (zh) | 软件升级的方法和装置 | |
KR102055024B1 (ko) | 클라이언트측 최소 다운로드 및 시뮬레이션 페이지 네비게이션 기능 | |
US8370828B2 (en) | Techniques to perform gradual upgrades | |
US20050097107A1 (en) | Seamless Affiliated Link System | |
US20090222404A1 (en) | Querying nonsql data stores with a sql-style language | |
CN101127038A (zh) | 下载网站静态网页的系统及方法 | |
US9330177B2 (en) | System, method and device for internet search based on peer-to-peer network | |
CN103248711A (zh) | 一种文件上传的方法和服务器 | |
CN1249610C (zh) | 资料自动下载之系统及方法 | |
CN102929984A (zh) | 失效网址搜索方法和装置 | |
CN104765592A (zh) | 一种面向网页采集任务的插件管理方法及其装置 | |
CN101471845A (zh) | 数据块副本数量调整方法及元数据服务器节点 | |
CN103475688A (zh) | 用于下载网站数据的分布式方法和系统 | |
US20020052889A1 (en) | Method for managing alterations of contents | |
CN106202492A (zh) | 一种网络文件系统的元数据服务优化方法及系统 | |
CN102945259A (zh) | 一种基于收藏夹的搜索方法和搜索装置 | |
CN1811759A (zh) | 一种对信息建增量索引的方法 | |
CN108710683A (zh) | 一种避免网络连接失败后重复抓取分页内容的方法 | |
KR101287371B1 (ko) | 웹 컨텐츠 수집방법 및 수집장치, 그 기록매체 | |
CN111523151A (zh) | 一种基于区块链技术来保存电子数据的方法及其系统 | |
JP2010186459A (ja) | コンテンツ管理情報収集システム、及びコンテンツ管理情報収集方法 | |
JP5063729B2 (ja) | クローラ管理システム及び方法 | |
CN105653367A (zh) | 遍历计时器的方法及装置 | |
KR100756421B1 (ko) | 해외 과학기술 전자원문 수집/색인/추출 시스템 및 그 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WW01 | Invention patent application withdrawn after publication | ||
WW01 | Invention patent application withdrawn after publication |
Application publication date: 20181026 |