webmagic学习之路-3:采集安居客经纪人详情页
这里希望安居客的同行的轻喷!!单纯的做测试,玩玩。
就这么糟践你们的服务器了!!!sorry!
这次学会了webmagic 设置处理的访问HTML返回代码,因为之前一直404的页面process根本都不会进来,纳闷很久,也百度了半天。
看源码看了好半天,才知道原来有这个方法设置进process的状态码,让我看源码的决心来源于 我用logger 打印的内容告诉我,webmagic已经获取了404,只是没处理而已。
也同时学会了 scheduler
package com.action; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.management.JMException;
import javax.swing.plaf.synth.SynthSpinnerUI; import org.apache.commons.collections.bag.SynchronizedSortedBag;
import org.apache.log4j.Logger;
import org.bson.Document; import com.model.AgentListByNumModel;
import com.model.AgentListModel;
import com.model.Model_AnjukeList;
import com.mongodb.BasicDBObject;
import com.util.Constants;
import com.util.GetDate;
import com.util.MysqlUtils;
import com.util.MD5With32;
import com.util.MongoDBUtil; import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.downloader.AbstractDownloader;
import us.codecraft.webmagic.downloader.Downloader;
import us.codecraft.webmagic.monitor.SpiderMonitor;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.PriorityScheduler;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable; public class GetAnjukeAgentByNum implements PageProcessor { static Logger logger = Logger.getLogger(GetAnjukeAgentByNum.class);
static AgentListByNumModel anjukeList;
static List<String> list = new ArrayList<String>();
static List<AgentListByNumModel> list_insert = new ArrayList<AgentListByNumModel>();
static BasicDBObject doc = null;
static int num = 0;
private Site site = Site.me().setSleepTime(1000).setRetryTimes(3).setCharset("UTF-8").setUserAgent(
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36");
@Override
public Site getSite() {
// TODO Auto-generated method stub
Set<Integer> acceptStatCode = new HashSet<Integer>();
acceptStatCode.add(200);
acceptStatCode.add(404);
site = site.setAcceptStatCode(acceptStatCode);
return this.site;
}
@Override
public void process(Page page) {
if(page.getStatusCode()==404
||page.getHtml().xpath("//div[@class='p_1180 p_crumbs']/a[2]/text()").get().replace("经纪人", "").equals("")
||(page.getHtml()+"").contains("经纪人店铺暂时关闭")){
String spider_urls = page.getUrl() +"";
anjukeList = new AgentListByNumModel("", "", "", "", "anjuke", GetDate.getDay0(),
spider_urls, "", spider_urls, "", "", "", "", "", "");
list_insert.add(anjukeList);
MysqlUtils.InsertAnjukeAgentByNum(list_insert);
list_insert.clear();
}else{
if((page.getHtml()+"").contains("访问验证-安居客")){
num = num+1;
System.out.println("被封次数 : "+num);
}
String zone = "";
String street = "";
String contact = "";
String city = page.getHtml().xpath("//div[@class='p_1180 p_crumbs']/a[2]/text()").get().replace("经纪人", "");
String name = page.getHtml().xpath("//div[@class='p_1180 p_crumbs']/a[4]/text()").get().replace("的店铺", "");
String staffNo = page.getUrl() + "";
String company = page.getHtml().xpath("//div[@class='section service']/dl/dd/p[1]/a/text()").get();
String company_url = page.getHtml().xpath("//div[@class='section service']/dl/dd/p[1]/a/@href").get();
String store = page.getHtml().xpath("//div[@class='section service']/dl/dd/p[2]/a/text()").get();
String store_url = page.getHtml().xpath("//div[@class='section service']/dl/dd/p[2]/a/@href").get();
String comms = page.getHtml().xpath("//dl[@class='item last']/dd/a/text()").all() + "";
comms = comms.replace("[", "").replace("]", "");
String contacts = page.getHtml().xpath("//head/meta[3]/@content").get();
Pattern p = Pattern.compile(Constants.reg_phone);
Matcher m = p.matcher(contacts);
if (m.find()) {
contact = m.group(0);
}
Object[] zs = page.getHtml().xpath("//div[@class='section service']/dl[3]/dd/a/text()").all().toArray();
if (zs == null || zs.length == 0) {
String zss = page.getHtml().xpath("//div[@class='details-item']/span[@class='comm-address']/@title").get();
if (zss!=null&&(zss.contains("[") && zss.contains(" "))) {
zss = zss.substring(zss.indexOf("["), zss.indexOf("]"));
zss = zss.substring(1, zss.indexOf(" "));
if (zss.contains("-")) {
zone = zss.split("-")[0];
street = zss.split("-")[1];
}
}
anjukeList = new AgentListByNumModel("", city, zone, street, "anjuke", GetDate.getDay0(),
page.getUrl() + "", name, staffNo, company, company_url, store, store_url, contact, comms);
list_insert.add(anjukeList);
} else {
for (int i = 0; i < zs.length; i++) {
if ((zs[i] + "").contains("-")) {
String[] zss = zs[i].toString().split("-");
zone = zss[0];
street = zss[1];
}
anjukeList = new AgentListByNumModel("", city, zone, street, "anjuke", GetDate.getDay0(),
page.getUrl() + "", name, staffNo, company, company_url, store, store_url, contact, comms);
list_insert.add(anjukeList);
}
}
if(list_insert.size()>0){
MysqlUtils.InsertAnjukeAgentByNum(list_insert);
list_insert.clear();
}
} } public static void main(String[] args) {
MysqlUtils.SelectSpiderID();
PriorityScheduler scheduler = new PriorityScheduler();
Spider spider = Spider.create(new GetAnjukeAgentByNum()).setScheduler(scheduler).addPipeline(new ConsolePipeline());
for (int n = 0; n < 100000; n++) {
if(Constants.map_id.containsKey(n+"")){
System.out.println("contain : " +n);
continue;
}
String url = "https://junranfangchan.anjuke.com/gongsi-jjr-" + n + "/";
scheduler.push(new Request(url), spider);
}
System.out.println("total task num :" +scheduler.getTotalRequestsCount(spider));
spider.thread(25).run();
// Spider.create(new GetAnjukeAgentByNum()).addUrl("https://junranfangchan.anjuke.com/gongsi-jjr-99988/")
// .addPipeline(new ConsolePipeline()).thread(1).run();
//
}
}
webmagic学习之路-3:采集安居客经纪人详情页的更多相关文章
- webmagic学习之路-2:采集安居客经纪人列表
		
相比较 1 稍微成熟了一点,会用的东西多了. 正则用的不好,很多东西不会,大神轻喷! package com.action; import java.util.ArrayList; import ja ...
 - HelloDjango 第 08 篇:开发博客文章详情页
		
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按 ...
 - webmagic学习之路-1:采集安居客列表页测试
		
---恢复内容开始--- package com.action; import java.util.ArrayList; import java.util.List; import java.util ...
 - Python爬虫实战(3):安居客房产经纪人信息采集
		
1, 引言 Python开源网络爬虫项目启动之初,我们就把网络爬虫分成两类:即时爬虫和收割式网络爬虫.为了使用各种应用场景,该项目的整个网络爬虫产品线包含了四类产品,如下图所示: 本实战是上图中的“独 ...
 - python爬虫爬取安居客并进行简单数据分析
		
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 爬取过程一.指定爬取数据二.设置请求头防止反爬三.分析页面并且与网页源码进行比对四.分析页面整理数据 ...
 - 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文
		
一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...
 - java爬虫系列第四讲-采集"极客时间"专栏文章、视频专辑
		
1.概述 极客时间(https://time.geekbang.org/),想必大家都知道的,上面有很多值得大家学习的课程,如下图: 本文主要内容 使用webmagic采集极客时间中某个专栏课程生成h ...
 - RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
		
RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...
 - Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
		
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
 
随机推荐
- 用socket.io实现websocket的一个简单例子
			
socket.io 是基于 webSocket 构建的跨浏览器的实时应用. 逛博客发现几个比较好的 一.用socket.io实现websocket的一个简单例子 http://biyeah.iteye ...
 - python小白之list使用笔记
			
List常见用法 list拆分 I=array([4.,2.]) print(I[:,newaxis])#将原本在一个列表里的两个数拆为两个不同列表里 list合并 法一 运算符重载 num=[1, ...
 - 重画GoogleClusterTrace数据
			
由于项目计划书写作需要,重画了Qi Zhang, Mohamed Faten Zhani, Raouf Boutaba, Joseph L. Hellerstein, Dynamic Heteroge ...
 - C# 后台服务 web.config 中 项“ConnectionString”已添加。问题
			
是自己在一网站下建了虚拟目录.原本网站为空,后来自己改了路径,有了默认配置很久后打开原本ok的虚拟目录,坑爹了.杯具了.代码:ConfigurationManager.ConnectionString ...
 - ProbCog[github]使用心得
			
1. After installing ProbCog,you can run blnquery and mlnquery. If the terminal warns that 'command n ...
 - [Http] Difference between POST and GET?
			
What is the difference between POST and GET HTTP requests? GET and POST are two different types of H ...
 - k8s 网络模型解析之实践
			
一. 实践说明 首先我们先创建一组资源,包括一个deployment和一个service apiVersion: apps/v1 kind: Deployment metadata: name: ng ...
 - vue中如何编写可复用的组件?
			
原文地址 Vue.js 是一套构建用户界面的渐进式框架.我们可以使用简单的 API 来实现响应式的数据绑定和组合的视图组件. 从维护视图到维护数据,Vue.js 让我们快速地开发应用.但随着业务代码日 ...
 - 【并行计算-CUDA开发】CUDA bank conflict in shared memory
			
http://hi.baidu.com/pengkuny/item/c8070b388d75d481b611db7a 以前以为 shared memory 是一个万能的 L1 cache,速度很快,只 ...
 - 【DSP开发】DSP通用并行端口uPP
			
这是翻译TI官方文档<KeyStone Architecture Universal Parallel Port (uPP)>SPRUHG9有关通用并行端口uPP的内容(除寄存器部分) ...