Java编写一个爬虫程序来实现自动化地获取这些信息
优采云 发布时间: 2023-06-12 13:52在旅游和出差的时候,我们经常会需要查询铁路列车的班次、票价和余票信息。而要手动一个一个地查询,不仅费时费力,而且容易出错。那么有没有一种方法可以自动化地获取这些信息呢?答案是肯定的Java编写一个爬虫程序来实现自动化地获取这些信息,我们可以使用Java编写一个爬虫程序来实现自动抓取列车数据的功能。
一、分析需求
在开始编写爬虫程序之前,我们需要先分析一下自己的需求。我们需要获取哪些信息?以及这些信息在网页中的位置和结构是怎样的?通过分析,我们得出以下结论:
1.列车班次信息:包括起点站、终点站、发车时间、到达时间、历时等;
2.票价信息:包括硬座、软座、硬卧、软卧等各种座位类型的价格;
3.余票信息:包括各种座位类型的余票数量。
二、选择目标网站
接下来,我们需要选择一个合适的网站作为爬虫程序的目标。比较合适的网站应该具备以下特点:
1.数据量大,覆盖面广;
2.数据更新及时,准确度高;
3.网站结构清晰,易于抓取。
在这里,我们选择了12306网站作为我们的目标。12306网站是中国铁路客户服务中心官方网站,是查询列车信息和购买车票的主要渠道之一。因此,它的数据量大、更新及时、准确度高,同时网站结构也比较清晰,非常适合我们进行爬虫程序的开发。
三、分析目标网站
在选择目标网站之后,我们需要对其进行分析,以便于编写爬虫程序。在分析过程中,我们需要关注以下几个方面:
1.网站的URL地址规律;
2.网站页面的HTML结构;
3.目标数据在HTML中的位置和结构。
经过仔细分析,我们可以得出以下结论:
1.列车班次信息、票价信息和余票信息都可以通过访问URL `https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=出发日期&leftTicketDTO.from_station=起点站代码&leftTicketDTO.to_station=终点站代码&purpose_codes=ADULT`来获取;
2.数据以JSON格式返回,在HTML中的位置比较容易定位;
3.在获取数据之前,需要先进行身份认证(即登录)。
四、模拟登录
在获取列车数据之前,我们需要先进行登录操作。这里我们使用Java的HttpClient库来模拟登录。
java
//创建HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//创建HttpPost对象
HttpPost httpPost = new HttpPost("https://kyfw.12306.cn/passport/web/login");
//设置请求头信息
httpPost.setHeader("Content-Type","application/x-www-form-urlencoded");
httpPost.setHeader("User-Agent","Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
//设置请求参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username","你的用户名"));
params.add(new BasicNameValuePair("password","你的密码"));
params.add(new BasicNameValuePair("appid","otn"));
httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
//发送POST请求
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
在发送登录请求之后Java爬虫 抓取列车数据,如果登录成功,服务器会返回一个cookie,我们需要将其保存下来以便后续的访问。
java
//获取cookie
Header[] headers = httpResponse.getHeaders("Set-Cookie");
StringBuffer cookieBuffer = new StringBuffer();
for (Header header : headers){
String cookie = header.getValue().split(";")[0];
cookieBuffer.append(cookie).append(";");
}
String cookie = cookieBuffer.toString();
五、抓取数据
在完成登录之后,我们就可以开始抓取列车数据了。我们仍然使用HttpClient库进行网络访问。
java
//创建HttpGet对象
HttpGet httpGet = new HttpGet("https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=出发日期&leftTicketDTO.from_station=起点站代码&leftTicketDTO.to_station=终点站代码&purpose_codes=ADULT");
//设置请求头信息
httpGet.setHeader("User-Agent","Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
httpGet.setHeader("Cookie", cookie);
//发送GET请求
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
在获取到服务器返回的数据之后,我们可以通过JSON解析库将其转换为Java对象。
java
//获取响应体
HttpEntity httpEntity = httpResponse.getEntity();
String responseText = EntityUtils.toString(httpEntity,"UTF-8");
//解析JSON数据
JSONObject jsonObject = new JSONObject(responseText);
JSONArray dataArray = jsonObject.getJSONArray("data");
for (int i =0; i <271317a77c2d77c1e2537adb86be74cb.length();i++){
JSONObject dataObject =271317a77c2d77c1e2537adb86be74cb.getJSONObject(i);
String trainNo = dataObject.getString("train_no");
String fromStationTelecode = dataObject.getString("from_station_telecode");
String toStationTelecode = dataObject.getString("to_station_telecode");
String startStationTelecode = dataObject.getString("start_station_telecode");
String endStationTelecode = dataObject.getString("end_station_telecode");
String startTime = dataObject.getString("start_time");
String arriveTime = dataObject.getString("arrive_time");
String lishi = dataObject.getString("lishi");
String canWebBuy = dataObject.getString("canWebBuy");
String ypInfo = dataObject.getString("yp_info");
String startTrainDate = dataObject.getString("start_train_date");7add6dba8c0313907499ffe176a443a3= dataObject.getString("train_seat_feature");
String locationCode = dataObject.getString("location_code");
String fromStationNo = dataObject.getString("from_station_no");
String toStationNo = dataObject.getString("to_station_no");
String isSupportCard = dataObject.getString("is_support_card");
String controlledTrainFlag = dataObject.getString("controlled_train_flag");
}
六、解析数据
在获取到数据之后,我们需要对其进行解析和处理。比如说,我们需要将列车班次信息、票价信息和余票信息分别提取出来,并保存到数据库中。
七、存储数据
在解析完数据之后Java编写一个爬虫程序来实现自动化地获取这些信息,我们需要将其保存到数据库中。这里我们使用MySQL数据库。
java
//创建数据库连接
Class.forName("com.81c3b080dad537de7e10e0987a4bf52e.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:81c3b080dad537de7e10e0987a4bf52e://localhost:3306/train","root","123456");
//创建PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO train_info (train_no, from_station_telecode, to_station_telecode, start_time, arrive_time, lishi) VALUES (?,?,?,?,?,?)");
//设置参数
preparedStatement.setString(1, trainNo);
preparedStatement.setString(2, fromStationTelecode);
preparedStatement.setString(3, toStationTelecode);
preparedStatement.setString(4, startTime);
preparedStatement.setString(5, arriveTime);
preparedStatement.setString(6, lishi);
//执行SQL语句
preparedStatement.executeUpdate();
八、完善程序
在编写爬虫程序的过程中,我们需要注意以下几个问题:
1.代码的可维护性和可扩展性;
2.网络异常和数据异常的处理;
3.爬虫程序的合法性和道德性。
九、总结
通过上述分析和实践,我们可以发现,编写Java爬虫程序是一件非常有趣和有挑战性的事情。它不仅可以帮助我们自动化地获取所需的数据,节省时间和精力,而且还可以提高我们的编程能力和技术水平。
在实践过程中,我们需要注意代码的规范性、可维护性和可扩展性Java爬虫 抓取列车数据,同时要遵守网络爬虫相关法律法规。最后,如果您对Java爬虫程序开发有任何疑问或建议,欢迎留言讨论。