【反反爬】使用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 目录 但是我们这样并不能直接进行使用 需要添加路径 右键点击 然后添加路径 选择模 ...
随机推荐
- 计算机网络OSI七层参考模型和tcp/udp五层参考模型
计算机网络OSI七层参考模型和tcp/udp五层参考模型 目录 一.OSI七层参考模型和TCP/UDP五层参考模型 1.应用层 2.表示层 3.会话层 4.传输层 5.网络层 6.数据链路层 7.物理 ...
- 一次 SSH 攻击与处理小记
这是我在简书看到的一个作者经历,结合小编自己的一些实践,抛砖引玉,给大家分享一下. 有段时间发现集群异常卡顿.担心的事情终于发生了,使用命令 lastb 查看了一下,我的天呢,好多未知的 IP,我随便 ...
- C++别名的使用
c++中的别名使用,类似引用,在别名中,"&"的意思不再是取地址,而是建立一个指针,直接指向数据.这是一个小例子: #include <iostream> us ...
- WPF中关于转换器
实例:关于播放器按钮状态的改变 说明:对Kind(种类)的绑定首先在viewmodel中声明一个属性IsPlay,然后在转换器中实现按钮的状态 转换器 在解决方案中的项目里新建一个Converters ...
- 做副业的我很迷茫,但ChatGPT却治好了我——AI从业者被AI模型治愈的故事
迷茫,无非就是不知道自己要做什么,没有目标,没有方向. 当有一个明确的目标时,往往干劲十足.但做副业过程中,最大的问题往往就是 不知道自己该干什么. 干什么?怎么干?干到什么程度?这是做副业(甚至任何 ...
- 解决Mysql 5.7 不能插入中文的问题
问题的解决方案 问题描述 : 在学习DML插入中文数据时 , 发现出现了以下问题 -- 插入数据 insert into tea (id , name) values (2 , '徐凤年'); -- ...
- SpringBoot 如何优雅的进行全局异常处理?
在SpringBoot的开发中,为了提高程序运行的鲁棒性,我们经常需要对各种程序异常进行处理,但是如果在每个出异常的地方进行单独处理的话,这会引入大量业务不相关的异常处理代码,增加了程序的耦合,同时未 ...
- Vue + Volo.Abp 实现Auth2.0客户端授权模式认证
@ 目录 注册Client Auth2.0授权 创建vue-oidc-client 创建Auth2.0认证跳转 获取令牌 创建回调页面 创建退出登录 最终效果 Volo.Abp的身份服务器模块默认使用 ...
- 微信小程序 - 视图与逻辑
[黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)] https://www.bilibili.com/video/BV1834y1676 ...
- python笔记:第六章函数&方法
1.系统函数 由系统提供,直接拿来用或是导入模块后使用 a = 1.12386 result = round(a,2) print(result) > 1.12 2.自定义函数 函数是结构化编程 ...