【反反爬】使用Jsoup爬取数据保存Excel
本文主要使用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的更多相关文章
- ASP.NET网络爬虫小研究 HtmlAgilityPack基础,爬取数据保存在数据库中再显示再自己的网页中
1.什么是网络爬虫 关于爬虫百度百科这样定义的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些 ...
- python爬取数据保存入库
import urllib2 import re import MySQLdb class LatestTest: #初始化 def __init__(self): self.url="ht ...
- scrapy爬取数据保存csv、mysql、mongodb、json
目录 前言 Items Pipelines 前言 用Scrapy进行数据的保存进行一个常用的方法进行解析 Items item 是我们保存数据的容器,其类似于 python 中的字典.使用 item ...
- jsoup抓取数据
jsoup的主要功能如下: 1. 从一个URL,文件或字符串中解析HTML: 2. 使用DOM或CSS选择器来查找.取出数据: 3. 可操作HTML元素.属性.文本: 接下来介绍jsoup 是如何优雅 ...
- python 抓取数据 存入 excel
import requestsimport datetimefrom random import choicefrom time import timefrom openpyxl import loa ...
- UIPath踩坑记一UIpath中抓取数据后在tableau中无表头
UIpath抓取数据存在Excel中(Excel 应用程序范围),且已设置表头,但是放到tableau中无表头 更换为"写入范围(工作簿)",同时属性设置必须勾选"添加标 ...
- python反反爬,爬取猫眼评分
python反反爬,爬取猫眼评分.解决网站爬取时,内容类似:$#x12E0;样式,且每次字体文件变化.下载FontCreator . 用FontCreator打开base.woff.查看对应字体关系 ...
- jsoup爬取某网站安全数据
jsoup爬取某网站安全数据 package com.vfsd.net; import java.io.IOException; import java.sql.SQLException; impor ...
- 爬取豆瓣电影储存到数据库MONGDB中以及反反爬虫
1.代码如下: doubanmoive.py # -*- coding: utf-8 -*- import scrapy from douban.items import DoubanItem cla ...
- Jsoup爬取网上数据完成翻译
Jsoup使用 首先进入Jsoup下载jar包 然后打开IDEA创建一个普通的java项目 在项目结构里创建 lib 目录 但是我们这样并不能直接进行使用 需要添加路径 右键点击 然后添加路径 选择模 ...
随机推荐
- 程序员的 Windows 工具箱「GitHub 热点速览」
如何精简 Windows 并快速配置开发环境呢?本周特推的 winutil 是一个程序员的 Windows 工具箱,它提供了开发工具的一键安装以及减少系统垃圾的功能,一切为了简洁.高效.同样高效的还有 ...
- 如何编写一个健壮的 npm 包
无脑发布 npm 比如老王我,用npm init新建一个包,改把改把,然后来个npm publish,so easy ️! Too young too naive, baby ! 请容我讲述一些发布过 ...
- Java(instanceof和类型转换)
1.instanceof和类型转换 instanceof 引用类型比较,判断一个对象是什么类型 public static void main(String[] args) { // Object & ...
- Java(类的继承)
1.继承 extends的意思是"扩展".子类是父类的扩展,使用关键字extends来表示. Java里,一个类只能继承一个父类. 继承是类与类之间的一种关系,此外还有依赖.组合. ...
- 数据科学工具 Jupyter Notebook 教程(二)
Jupyter Notebook 是一个把代码.图像.注释.公式和作图集于一处,实现可读性分析的交互式笔记本工具.借助所谓的内核(Kernel)的概念,Jupyter Notebook 可以同时支持包 ...
- P3498 [POI2010]KOR-Beads 题解
前言: 最近在做哈希的题,发现了这道好题,看题解里很多大佬的方法都很巧妙,自己就发一个较为朴素的方法吧. 题意: 题目传送门 给你一个序列,需要求出数 k,使划分的子串长度为 k 时,不同的子串数量最 ...
- API NEWS | Money Lover爆出潜在API漏洞
欢迎大家围观小阑精心整理的API安全最新资讯,在这里你能看到最专业.最前沿的API安全技术和产业资讯,我们提供关于全球API安全资讯与信息安全深度观察. 本周,我们带来的分享如下: Money Lov ...
- 【Netty】02-入门
二. Netty 入门 1. 概述 1.1 Netty 是什么? Netty is an asynchronous event-driven network application framework ...
- java.lang.IndexOutOfBoundsException
原因:一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误 解决方案:用 array[] 的 .length 查看 数组的长度
- PRF评价
PRF评价指标: 精确率P:预测结果正类数量占全部结果的比率: P= $\frac{TP}{TP+FP}$ TP:预测为真且实际为真,FP为预测真实际为假. 召回率R:在所有正类样本中,能回想到的比例 ...