本文主要使用Jsoup爬取XXX房屋信息,抓取一些房屋信息,比如房屋楼盘、户型、价格、地址等信息,然后保存到Excel,便于对比和筛选,选出符合预期的好房。

  注意,有些网站有防爬取机制,需要设置动态更换代理IP进行重试。

 1         <dependency>
2 <groupId>org.slf4j</groupId>
3 <artifactId>slf4j-api</artifactId>
4 <version>1.7.25</version>
5 </dependency>
6 <dependency>
7 <groupId>org.slf4j</groupId>
8 <artifactId>slf4j-simple</artifactId>
9 <version>1.7.25</version>
10 </dependency>
11
12 <dependency>
13 <groupId>org.jsoup</groupId>
14 <artifactId>jsoup</artifactId>
15 <version>1.11.3</version>
16 </dependency>
17
18 <dependency>
19 <groupId>com.squareup.okhttp3</groupId>
20 <artifactId>okhttp</artifactId>
21 <version>3.3.0</version>
22 </dependency>
23
24 <dependency>
25 <groupId>org.apache.poi</groupId>
26 <artifactId>poi</artifactId>
27 <version>4.1.2</version>
28 </dependency>
29
30 <dependency>
31 <groupId>org.apache.poi</groupId>
32 <artifactId>poi-ooxml</artifactId>
33 <version>4.1.2</version>
34 </dependency>

pom.xml

爬取数据的部分代码


 1 public static List<List<String>> getData(String urls) throws Exception {
2
3 // 读取数据
4 List<List<String>> data = Lists.newArrayList();
5
6 // 代理ip和端口,需动态替换(可以本地新建一个ip列表,动态读取,获取失败替换代理ip即可)
7 String ip = "xxx.xxx.xxx.xxx";
8 int port = 80;
9
10 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ip, port));
11 URL url = new URL(urls);
12 URLConnection urlConnection = url.openConnection(proxy);
13 urlConnection.setUseCaches(false);
14 urlConnection.connect();
15 InputStream is = urlConnection.getInputStream();
16 BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
17 StringBuffer bs = new StringBuffer();
18 String l = null;
19 while ((l = buffer.readLine()) != null) {
20 bs.append(l);
21 }
22 System.out.println(bs.toString());
23
24 Document doc = Jsoup.parse(bs.toString());
25 Elements els = doc.body().getElementsByClass("list-item");
26 for (Element el : els) {
27 List<String> rowData = Lists.newArrayList();
28 Elements titleEls = el.getElementsByClass("house-title");
29 log.info("# 标题:{}", titleEls.get(0).getElementsByTag("a").text());
30 rowData.add(titleEls.get(0).getElementsByTag("a").text());
31
32 Elements itemEls = el.getElementsByClass("details-item");
33 Elements itemSpanEls = itemEls.get(0).getElementsByTag("span");
34 log.info("# 户型:{}", itemSpanEls.get(0).text());
35 rowData.add(itemSpanEls.get(0).text());
36 log.info("# 面积:{}", itemSpanEls.get(1).text());
37 rowData.add(itemSpanEls.get(1).text());
38 log.info("# 楼层:{}", itemSpanEls.get(2).text());
39 rowData.add(itemSpanEls.get(2).text());
40 log.info("# 年限:{}", itemSpanEls.get(3).text());
41 rowData.add(itemSpanEls.get(3).text());
42
43 String[] address = itemEls.get(1).getElementsByTag("span").text().split(" ");
44 if (address==null || address.length == 0) {
45 continue;
46 }
47 log.info("# 楼盘:{}", address[0]);
48 log.info("# 地址:{}", address[1]);
49 rowData.add(address[0]);
50 rowData.add(address[1]);
51
52 Elements priceEls = el.getElementsByClass("pro-price");
53 Elements priceSpanEls = priceEls.get(0).getElementsByTag("span");
54 log.info("# 总价:{}", priceSpanEls.get(0).getElementsByTag("strong").text());
55 rowData.add(priceSpanEls.get(0).getElementsByTag("strong").text());
56 log.info("# 单价:{}", priceSpanEls.get(1).text());
57 rowData.add(priceSpanEls.get(1).text());
58 data.add(rowData);
59 }
60
61 return data;
62 }

数据写入excel的代码

 1 public static void writeExcel(List<String> titleList, List<List<String>> dataList) throws Exception {
2 //open file.
3 File excel = new File("D:\\Users\\Desktop\\data.xls");
4 excel.deleteOnExit();
5 excel.createNewFile();
6 FileOutputStream fos = new FileOutputStream(excel);
7
8 Workbook book = new HSSFWorkbook();
9
10 //create Sheet named "Sheet_1". 0 means this is 1st page.
11 Sheet sheet = book.createSheet("安居客房源信息");
12
13 // 写入标题
14 Row titleRow = sheet.createRow(0);
15 for (int x = 0; x < titleList.size(); x++) {
16 Cell cell0 = titleRow.createCell(x);
17 cell0.setCellValue(titleList.get(x));
18 }
19
20 // 写入数据
21 for (int i = 0; i < dataList.size(); i++) {
22 int row = i + 1;
23 Row dataRow = sheet.createRow(row);
24 List<String> rowData = dataList.get(i);
25 for (int j = 0; j < titleList.size(); j++) {
26 Cell dataCell = dataRow.createCell(j);
27 dataCell.setCellValue(rowData.get(j));
28 }
29 }
30
31 book.write(fos);
32 book.close();
33
34 log.info("# write data success");
35 }

运行方法(建议第一次先不获取所有数据,只获取第一页数据,用来看实际效果,不然ip被封了无法继续使用)

 1 public static void main(String[] args) {
2 try {
3 String url = "file:///D:/Users/Desktop/test.html";
4 // url = "https://hanchuanshi.anjuke.com/sale/p1-rd1/#filtersort";
5
6 List<List<String>> data = Lists.newArrayList();
7 for (int i = 1; i <= 50; i++) {
8 url = "https://hanchuanshi.anjuke.com/sale/p" + i + "-rd1/#filtersort";
9 data.addAll(getData(url));
10 }
11
12 List<String> titleList = Arrays.asList("标题", "户型", "面积", "楼层", "年限", "楼盘", "地址", "总价", "单价");
13 writeExcel(titleList, data);
14 } catch (Exception e) {
15 e.printStackTrace();
16 }
17 }
												

【反反爬】使用Jsoup爬取数据保存Excel的更多相关文章

  1. ASP.NET网络爬虫小研究 HtmlAgilityPack基础,爬取数据保存在数据库中再显示再自己的网页中

    1.什么是网络爬虫 关于爬虫百度百科这样定义的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些 ...

  2. python爬取数据保存入库

    import urllib2 import re import MySQLdb class LatestTest: #初始化 def __init__(self): self.url="ht ...

  3. scrapy爬取数据保存csv、mysql、mongodb、json

    目录 前言 Items Pipelines 前言 用Scrapy进行数据的保存进行一个常用的方法进行解析 Items item 是我们保存数据的容器,其类似于 python 中的字典.使用 item ...

  4. jsoup抓取数据

    jsoup的主要功能如下: 1. 从一个URL,文件或字符串中解析HTML: 2. 使用DOM或CSS选择器来查找.取出数据: 3. 可操作HTML元素.属性.文本: 接下来介绍jsoup 是如何优雅 ...

  5. python 抓取数据 存入 excel

    import requestsimport datetimefrom random import choicefrom time import timefrom openpyxl import loa ...

  6. UIPath踩坑记一UIpath中抓取数据后在tableau中无表头

    UIpath抓取数据存在Excel中(Excel 应用程序范围),且已设置表头,但是放到tableau中无表头 更换为"写入范围(工作簿)",同时属性设置必须勾选"添加标 ...

  7. python反反爬,爬取猫眼评分

    python反反爬,爬取猫眼评分.解决网站爬取时,内容类似:$#x12E0;样式,且每次字体文件变化.下载FontCreator . 用FontCreator打开base.woff.查看对应字体关系 ...

  8. jsoup爬取某网站安全数据

    jsoup爬取某网站安全数据 package com.vfsd.net; import java.io.IOException; import java.sql.SQLException; impor ...

  9. 爬取豆瓣电影储存到数据库MONGDB中以及反反爬虫

    1.代码如下: doubanmoive.py # -*- coding: utf-8 -*- import scrapy from douban.items import DoubanItem cla ...

  10. Jsoup爬取网上数据完成翻译

    Jsoup使用 首先进入Jsoup下载jar包 然后打开IDEA创建一个普通的java项目 在项目结构里创建 lib 目录 但是我们这样并不能直接进行使用 需要添加路径 右键点击 然后添加路径 选择模 ...

随机推荐

  1. AcWing 1019. 庆功会

    为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员. 期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力. 输入格式 第一行二个数n,m,其中n代表 ...

  2. AcWing 1024. 装箱问题

    有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积(正整数). 要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入格式 第一行是一个整数 V,表示箱子容量. 第二行是一个 ...

  3. 使用git 将本地代码上传码市私用仓库操作

    1  现在在登录码市建立项目 2   本地建立一个文件夹,然后使用git bash 3   初始化本地库  git init 4,进入刚刚在码云新建的项目里,复制框框里的路径 5,然后在回到本地新建的 ...

  4. mysql 有关账号登录和重新设置密码操作

    #进入mysql客户端$mysqlmysql> select user(); #查看当前用户mysql> exit # 也可以用\q quit退出 # 默认用户登陆之后并没有实际操作的权限 ...

  5. Android BottomNavigation底部导航栏使用

    原文地址: Android BottomNavigation底部导航栏使用 - Stars-One的杂货小窝 基本使用 本文侧重点记录一些特殊的样式设置,所以基本使用这里就简单概述一下,详细图文可以去 ...

  6. 走近高德驾车ETA(预估到达时间)

    1. 什么是驾车ETA 临近节假,长途自驾返乡的你是否曾为无法预知路上到底有多堵而纠结?通勤上班,作为有车一族的你是否在为路况变幻莫测的早晚高峰而烦恼?外出旅行,赶火车.赶飞机的你是否还在为担心错过班 ...

  7. 【Shell】字符串

    单引号和双引号 shell 字符串可以用单引号 '',也可以用双引号 "",也可以不用引号. 单引号的特点 单引号里不识别变量 单引号里不能出现单独的单引号(使用转义符也不行),但 ...

  8. STM32软件I2C驱动MPU6050

    STM32软件I2C驱动MPU6050 STM32F103C8T6基于Keil MDK标准库 硬件接线 这里没有什么复杂的地方,采用MPU6050的现成模块.模块的SCL接B10,SDA接B11,这里 ...

  9. 【Git】常用命令汇总

    一.仓库管理 git init:本地初始化 git clone:克隆远程仓库 git remote:远程仓库管理 git remote:查看远程仓库的信息 git remote -v:显示更详细的信息 ...

  10. ObjectInputStream_报错问题

    报错: Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: CE ...