这里希望安居客的同行的轻喷!!单纯的做测试,玩玩。

就这么糟践你们的服务器了!!!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:采集安居客经纪人详情页的更多相关文章

  1. webmagic学习之路-2:采集安居客经纪人列表

    相比较 1 稍微成熟了一点,会用的东西多了. 正则用的不好,很多东西不会,大神轻喷! package com.action; import java.util.ArrayList; import ja ...

  2. HelloDjango 第 08 篇:开发博客文章详情页

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按 ...

  3. webmagic学习之路-1:采集安居客列表页测试

    ---恢复内容开始--- package com.action; import java.util.ArrayList; import java.util.List; import java.util ...

  4. Python爬虫实战(3):安居客房产经纪人信息采集

    1, 引言 Python开源网络爬虫项目启动之初,我们就把网络爬虫分成两类:即时爬虫和收割式网络爬虫.为了使用各种应用场景,该项目的整个网络爬虫产品线包含了四类产品,如下图所示: 本实战是上图中的“独 ...

  5. python爬虫爬取安居客并进行简单数据分析

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 爬取过程一.指定爬取数据二.设置请求头防止反爬三.分析页面并且与网页源码进行比对四.分析页面整理数据 ...

  6. 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文

    一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...

  7. java爬虫系列第四讲-采集"极客时间"专栏文章、视频专辑

    1.概述 极客时间(https://time.geekbang.org/),想必大家都知道的,上面有很多值得大家学习的课程,如下图: 本文主要内容 使用webmagic采集极客时间中某个专栏课程生成h ...

  8. RPC远程过程调用学习之路(一):用最原始代码还原PRC框架

    RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...

  9. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

随机推荐

  1. <javaScript>谈谈JavaScript中的变量、指针和引用

    1.变量我们可能产生这样一个疑问:编程语言中的变量到底是什么意思呢?事实上,当我们定义了一个变量a时,就是在存储器中指定了一组存储单元,并将这组存储单元命名为a.变量a的值实际上描述的是这组存储单元中 ...

  2. rally task配置文件

    rally task配置文件 Rally本身提供了一些task配置文件,用于提供测试用例中所需的信息包括场景测试中所传入的参数.运行方式是并行还是串行,context等信息.Rally本身提供的tas ...

  3. 配置了configuration.xml之后提示找不到映射关系

    在启动类里面单独增加一个Bean即可解决 @Bean public DatabaseIdProvider getDatabaseIdProvider(){ DatabaseIdProvider dat ...

  4. ASP.NET的IIS映射

    ASP.NET默认扩展名为.aspx,可是我们看到许多网站的扩展名很特别,比如校内的do.个性之余还可以实现简单的伪静态(即把后缀改为html) 不过相对URLRewriter来说,是有点简陋(只能改 ...

  5. Oracle CDC (Change Data Capture)更新数据捕获——概述

    Change Data Capture能高效识别并捕获数据的插入.修改和删除,使更新数据供个人或应用使用. CDC从oracle 9i开始引入,//TODO 在11G R2之后的版本里将取消支持,被O ...

  6. 转 CentOS7使用firewalld打开关闭防火墙与端口

    http://blog.csdn.net/huxu981598436/article/details/54864260 开启端口命令 输入firewall-cmd --query-port=6379/ ...

  7. 在Android初次的前期学习中的二个小例子(2)

    Hello13:SQLite数据库 一.简述SQLite的概念和主要特性 SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,使用非常方便,支持SQL语法标准和数据库事务原则. 相对于Sh ...

  8. NLP基础

    1  自然语言处理三大特征抽取器(CNN/RNN/TF)比较 白衣骑士Transformer:盖世英雄站上舞台 华山论剑:三大特征抽取器比较 综合排名情况 以上介绍内容是从几个不同角度来对RNN/CN ...

  9. Python之滑动窗口

    需求 对于一个数组array = ["n","v","l","f",...,"y","c& ...

  10. URLSearch​Params的注意事项(个人总结)

    官网解释:URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串,一些方法的使用. 前天测试说 有些功能在ie实现不了,顺便把报错发我了:URLSearchParams  ...