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爬虫程序开发有任何疑问或建议,欢迎留言讨论。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线