笔者生活、工作在南京,因此首先想到如何抓取南京相关的数据。
1. 数据来源
百度搜索“南京房产交易数据”,发现查询结果还不错,第一条就是我们想要:
数据地址:http://www.njhouse.com.cn/index_tongji.php
经过不断的尝试,发现这个网站虽然看起来技术不咋地,但是数据还算是靠谱。
看起来下面这些数据值得我们去解释:
(1) 准实时交易统计数据
另外我们还可以从其他页面解析出其他的数据。比如:
(2)南京各个区的住宅类销售数据:
网页地址:http://www.njhouse.com.cn/index.php (注意:一定要带index.php 不然会被重定向到其他页面去啦)
还有其他的数据,可以根据你的需求进行相应的解析。
文章来源:http://www.flyml.net/2016/10/15/house-stat-parse-nanjing-data/
2. 构建WebMagic的Processor
(1) 创建Site对象并设置正确的编码参数
1 2 3 4 |
private Site site = Site.me() .setCharset("gb2312") .setRetryTimes(3) .setSleepTime(100); |
大概解释一下:
- 如果访问失败,会重试3次
- 如果需要访问多个页面,会暂停100毫秒
- 设置解析的字母编码为gb2312
在爬取目标页面的时候,如果出现乱码,常见的一个错误就是编码格式问题。我们在IDE之中创建项目,推荐的是UTF-8编码,比较通用。但是网上的页面,可能就会使用各种编码。那么我们如何查看对应页面的编码呢?
首先我们可以从网页源码来查看。 还是使用Chrome的开发者工具,F12.结果看下图:
显然,我们需要设置编码格式为GB2312.
但是有的网页源码是看不到这个的,比如我们想去解析今日销售排行榜(链接)的时候,可以使用下图的这种方法:
可以看到,content-type里面设置的编码格式为GBK.
因为GBK实际上是兼容GB2312的,因此我们也省事了,全部都是用GB2312
(2)调用相应的Jfinal数据存储插件
需要在Pom之中加入相应的依赖:
1 2 3 4 5 6 7 8 9 10 11 12 |
<!-- https://mvnrepository.com/artifact/com.jfinal/jfinal --> <dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal</artifactId> <version>2.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.19</version> </dependency> |
相应的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private DruidPlugin druidPlugin = null; private ActiveRecordPlugin activeRecordPlugin = null; private void startDB() { druidPlugin = new DruidPlugin( "jdbc:mysql://10.64.34.44/flyml_house_stat?characterEncoding=utf-8", "skyaiduser", "skyaid8.6"); druidPlugin.start(); activeRecordPlugin = new ActiveRecordPlugin(druidPlugin); activeRecordPlugin.addMapping("njhouse_simple_summary", NJHouseSimpleSummary.class); activeRecordPlugin.addMapping("njhouse_supply_summary", NJHouseSupplySummary.class); activeRecordPlugin.addMapping("njhouse_yearly_deal_stat", NJHouseYearlyStat.class); activeRecordPlugin.start(); } private void stopDB() { activeRecordPlugin.stop(); activeRecordPlugin = null; druidPlugin.stop(); druidPlugin = null; } |
(3)使用Chrome获取基础CSS selector
通过工具获取的css selector 一般只能针对单个元素,但是比如我们需要获取一个table之中的所有的td,就需要自行修改css selector的值了。
这是一个还不错的参考文档:http://www.w3school.com.cn/cssref/css_selectors.asp
在Chrom的Console tag之中可以直接测试css selector, 这也是我觉得css选择器相比xpath更方便的一个地方。可以使用下面两个函数
1 2 |
document.querySelectorAll() document.querySelector() |
其他部分感觉并没有太需要说明的地方~
文章来源:http://www.flyml.net/2016/10/15/house-stat-parse-nanjing-data/
3. 启动爬虫
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static void main(String[] args) { NJHouseProcessor processor = new NJHouseProcessor(); processor.startDB(); Spider.create(processor) .addUrl(new String[]{ "http://www.njhouse.com.cn/index_tongji.php", "http://www.njhouse.com.cn/index.php", "http://www.njhouse.com.cn/fdc_show1.php?chk=2"}) .thread(1) .run(); processor.stopDB(); } |
即:
- 需要爬取3个页面
- 只启用单线程爬虫
这个网站的访问速度还是很给力的。 跑一轮下来,也就几秒钟的时间。而且笔者目前发现这个网站似乎对爬虫还是很友好的 :)
请各位大神不要把这个网站搞垮就好~
本文为原创文章,转载请注明出处:http://www.flyml.net

文章评论