杨鸿炜---第二次作业
这个作业属于哪个课程 | 首页 - 至诚软工实践F班 - 福州大学至诚学院 - 班级博客 - 博客园 (cnblogs.com) |
---|---|
这个作业要求在哪里 | 第二次作业:个人编程 - 作业 - 至诚软工实践F班 - 班级博客 - 博客园 (cnblogs.com) |
这个作业的目标 | 通过自身学习,初步掌握网络爬虫技术 |
Github 地址 | mofei1234/java-fiddle (github.com) |
一、准备工作
- 首次接触fiddle抓包软件
- 通过老师给予的PPT以及百度查询深入了解fiddle,并学会如何使用fiddle
- 安装fiddle进行实操
二、爬虫实现思路
- 对访问的网页使用fiddle进行抓包
- 爬取到的数据使用java进行解析
三、项目开始
1.对fiddle进行配置并打开小程序中的朴朴小程序用fiddle找到所要的数据并截取头文件
2.开始网上翻阅有关Java爬虫方面的资料
先百度查阅java如何爬虫,然后在去B站上各种up主的解释和解析,了解java中String和JSON是如何进行转换的,之后开始实行操作,用java语言编写爬虫并输出数据
3.开始实操
首先先编写将朴朴页面的数据导入idea并使用java语言实现数据的引入和输出
package pupu;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Pupushop {
public String httpRequest(String requestUrl) {
StringBuffer buffer = null;
BufferedReader bufferedReader = null;
InputStreamReader inputStreamReader = null;
InputStream inputStream = null;
HttpURLConnection httpUrlConn = null;
try {
// 建立get请求
URL url = new URL(requestUrl);
httpUrlConn = (HttpURLConnection) url.openConnection();
httpUrlConn.setDoInput(true);
httpUrlConn.setRequestMethod("GET");
// 获取输入流
inputStream = httpUrlConn.getInputStream();
inputStreamReader = new InputStreamReader(inputStream, "utf-8");
bufferedReader = new BufferedReader(inputStreamReader);
// 从输入流读取结果
buffer = new StringBuffer();
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if(bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inputStreamReader != null){
try {
inputStreamReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(httpUrlConn != null){
httpUrlConn.disconnect();
}
}
return buffer.toString();
}
}
并用以下代码进行测试,能否正常获取朴朴数据以及输出数据
之后便完整的编写代码,其中包括String和JSON的相互转化,时间截取的循环代码,数据获取代码,及获取价格浮动代码,最后完成输出获取数据,完成实验要求
package pupu;
import com.alibaba.fastjson.JSONObject;
import com.sun.deploy.net.MessageHeader;
import sun.plugin.com.Utils;
import java.io.IOException;
import java.sql.SQLOutput;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
String url = "https://j1.pupuapi.com/client/product/storeproduct/detail/deef1dd8-65ee-46bc-9e18-8cf1478a67e9/2266f16d-b00c-4739-acf3-3b06fd5017f0";
Main m = new Main();
m.getOut(url);
}
public void getOut(String url) throws IOException, InterruptedException {
Main main = new Main();
JSONObject jsonObject = JSONObject.parseObject(new Pupushop().httpRequest(url));
JSONObject d = jsonObject.getJSONObject("data");
Object name = (String) d.get("name");
Object spec = (String) d.get("spec");
Object price = (double) ((Integer) d.get("price")) / 100;
Object market_price = (double) ((Integer)(d.get("market_price"))) / 100;
Object share_content = d.get("share_content");
System.out. println(" ---------------------商品:" + name + "-------------------");
System.out.println("规格:" + spec);
System.out.println("价格∶" + price);
System.out.println("原价/折扣价︰"+market_price+" /"+price);
System.out.println("详细信息:" + share_content);
System.out.println(" ---------------------" + name +"的价格波动------------------");
while (true){
System.out.println("当前时间为:"+DateTime()+",价格为:"+price);
TimeIntervalTest();
}
}
public static String DateTime(){
//将现在的时间通过LocalDateTime解析为字符串类型并返回
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.now();
String date = dateTime.format(formatter);
return date;
}
public double getData(String str){
//把字符转json
JSONObject dataObject = JSONObject.parseObject(str);
JSONObject data = dataObject.getJSONObject("data");
return Double.parseDouble(data.get("price").toString())/100.00;
}
public void TimeIntervalTest() throws InterruptedException {
// 开始时间
long time = System.currentTimeMillis();
// 执行时间(2s)
Thread.sleep(2000);
// 结束时间
long time1 = System.currentTimeMillis();
}
}
四、GitHub连接与上传
五、课后思考
完成课题后并再一次在网上查询java爬虫的知识,发现JSONSerializer.toJSON()这个功能会比我使用String和JSON转化方法更方便,更快捷,再一次学到了新知识
六、课后总结
本次作业通过自身学习,零基础开始学习网上爬虫技能。一开始确实是比较艰难,编写过程中磕磕碰碰,出现过许许多多的问题,用引入数据流那边开始就学习和查阅了较多的时间,思考了许久,皇天不负有心人,编写了出来,之后主页面的输出、获取和转化代码在编写的过程中就没那么多的磕磕碰碰,虽然有少许不顺,出现数据类型不同无法转化的情况,向舍友咨询之后并解决问题,完成本次课题作业。
对于我来说本次的作业确实有难度,有涉及到许多未涉及过得问题和代码,虽然一 一解决了,但依然心有余悸吧。