Application4.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package space.anyi;
  2. import org.apache.http.client.config.RequestConfig;
  3. import org.apache.http.client.methods.CloseableHttpResponse;
  4. import org.apache.http.client.methods.HttpGet;
  5. import org.apache.http.impl.client.CloseableHttpClient;
  6. import org.apache.http.impl.client.HttpClients;
  7. import org.apache.http.util.EntityUtils;
  8. import org.jsoup.Jsoup;
  9. import org.jsoup.nodes.Document;
  10. import org.jsoup.nodes.Element;
  11. import org.jsoup.select.Elements;
  12. import us.codecraft.webmagic.Page;
  13. import us.codecraft.webmagic.Request;
  14. import us.codecraft.webmagic.Site;
  15. import us.codecraft.webmagic.Spider;
  16. import us.codecraft.webmagic.model.HttpRequestBody;
  17. import us.codecraft.webmagic.processor.PageProcessor;
  18. import java.nio.charset.StandardCharsets;
  19. import java.sql.*;
  20. import java.time.LocalDate;
  21. import java.util.HashMap;
  22. import java.util.Map;
  23. import java.util.Objects;
  24. import java.util.regex.Matcher;
  25. import java.util.regex.Pattern;
  26. public class Application4 implements PageProcessor {
  27. //初始url
  28. static String indexUrl = "http://ztb.chinays.gov.cn/ceinwz/WebInfo_List.aspx?newsid=81&jsgc=01100000&zfcg=&tdjy=&cqjy=&qtjy=&PubDateSort=1&ShowPre=1&CbsZgys=0&zbfs=&qxxx=0&showqxname=0&NewsShowPre=1&wsjj=0&showCgr=0&ShowOverDate=0&showdate=1&FromUrl=zbgg";
  29. static int total = 1;
  30. static int index = 1;
  31. public static final String baseUrl = "http://ztb.chinays.gov.cn";
  32. public static Pattern pattern = Pattern.compile("(\\d{4})(年|/|-|\\.)(\\d{1,2})(月|/|-|\\.)(\\d{1,2})");
  33. private static final Map<String, Map<String,Object>> context = new HashMap<>();
  34. //配置
  35. private Site site = new Site()
  36. .setTimeOut(100 * 1000) //超时时间
  37. .setRetryTimes(3) //重试请求次数
  38. .setRetrySleepTime(3000) //重试间隔时间 请求头
  39. .setUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36");
  40. public static String doGet(String url) throws Exception {
  41. String result = "";
  42. CloseableHttpClient httpClient = HttpClients.createDefault();
  43. HttpGet httpGet = new HttpGet(url);
  44. RequestConfig requestConfig = RequestConfig.custom()
  45. .setConnectTimeout(10 * 1000).setSocketTimeout(60 * 1000)
  46. .build();
  47. httpGet.setConfig(requestConfig);
  48. CloseableHttpResponse response = null;
  49. try {
  50. response = httpClient.execute(httpGet);
  51. if (response.getStatusLine().getStatusCode() == 200) {
  52. String content = EntityUtils.toString(response.getEntity(), "UTF-8");
  53. result = content;
  54. }
  55. } finally {
  56. if (response != null) {
  57. response.close();
  58. }
  59. httpClient.hashCode();
  60. }
  61. return result;
  62. }
  63. public static String urlClean(String url,String baseUrl,String currentUrl){
  64. String result = "";
  65. if (url.startsWith("/")) {
  66. //根路径开始
  67. result = baseUrl + url;
  68. }else if (url.startsWith("./")){
  69. //当前同级目录
  70. result = currentUrl.substring(0, currentUrl.lastIndexOf("/")) + url.substring(url.indexOf("./") + 1);
  71. }else if (url.startsWith("../")){
  72. //多级目录,取最后的uri拼接到baseUrl,等价于所有 "../" 替换成 "/"
  73. result = baseUrl + result.substring(result.lastIndexOf("../") + 2);
  74. }else {
  75. //等价于当前目录
  76. result = currentUrl.substring(0,currentUrl.lastIndexOf("/") + 1) + url;
  77. }
  78. return result;
  79. }
  80. @Override
  81. public void process(Page page) {
  82. String currentUrl = page.getUrl().toString();
  83. if (currentUrl.contains("WebInfo_List")) {
  84. String rawText = page.getRawText();
  85. Document document = Jsoup.parse(rawText);
  86. //总页数
  87. Elements eachTags = document.select("table.myGVClass tr:has(a)");
  88. if (eachTags != null && eachTags.size() > 0) {
  89. for (Element eachTag : eachTags) {
  90. //解析详情页url
  91. String href = eachTag.select("a").first().attr("href");
  92. String link = "";
  93. link = urlClean(href,baseUrl,currentUrl);
  94. String title = eachTag.select("a").first().text().trim();
  95. //有可能出現 ”2026-10-14 [正在进行]“
  96. String dateStr = eachTag.select("td.fFbDate").first().text().trim();
  97. Matcher matcher = pattern.matcher(dateStr);
  98. if (matcher.find()) {
  99. String month = matcher.group(3).length() == 2 ? matcher.group(3) : "0" + matcher.group(3);
  100. String day = matcher.group(5).length() == 2 ? matcher.group(5) : "0" + matcher.group(5);
  101. dateStr = matcher.group(1) + "-" + month + "-" + day;
  102. }
  103. System.out.println(title);
  104. System.out.println(link);
  105. //数据库是否已存在
  106. String querySql = "select DETAIL_LINK from XIN_XI_INFO_TEST where DETAIL_LINK = ?";
  107. try(Connection connection = MyDao.getConnection();
  108. PreparedStatement prepareStatement = connection.prepareStatement(querySql);){
  109. prepareStatement.setString(1,link);
  110. ResultSet resultSet = prepareStatement.executeQuery();
  111. if (resultSet.next()) {
  112. System.out.println("跳过" + link);
  113. resultSet.close();
  114. continue;
  115. }
  116. resultSet.close();
  117. } catch (SQLException e) {
  118. throw new RuntimeException(e);
  119. }
  120. Request request = new Request(link);
  121. // request.putExtra("title",title.substring(2));
  122. // request.putExtra("listDate",LocalDate.parse(dateStr));
  123. Map<String, Object> map = new HashMap<>();
  124. map.put("title",title);
  125. map.put("listDate",LocalDate.parse(dateStr));
  126. context.put(link,map);
  127. page.addTargetRequest(request);
  128. }
  129. }
  130. //翻頁
  131. String __EVENTVALIDATION = document.select("#__EVENTVALIDATION").first().val();
  132. String __VIEWSTATEGENERATOR = document.select("#__VIEWSTATEGENERATOR").first().val();
  133. String ctl00_myTreeView_ExpandState = document.select("#ctl00_myTreeView_ExpandState").first().val();
  134. String __VIEWSTATE = document.select("#__VIEWSTATE").first().val();
  135. Element nextPage = document.getElementById("ctl00_ContentPlaceHolder1_LinkButtonNextPage");
  136. if (Objects.nonNull(nextPage)) {
  137. Map<String, Object> params = new HashMap<>();
  138. params.put("__EVENTVALIDATION",__EVENTVALIDATION);
  139. params.put("__VIEWSTATEGENERATOR",__VIEWSTATEGENERATOR);
  140. params.put("ctl00_myTreeView_ExpandState",ctl00_myTreeView_ExpandState);
  141. params.put("__VIEWSTATE",__VIEWSTATE);
  142. params.put("__EVENTTARGET","ctl00$ContentPlaceHolder1$LinkButtonNextPage");
  143. Request request = new Request(indexUrl);
  144. request.setMethod("post");
  145. HttpRequestBody requestBody = HttpRequestBody.form(params, StandardCharsets.UTF_8.name());
  146. request.setRequestBody(requestBody);
  147. page.addTargetRequest(request);
  148. }
  149. page.setSkip(true);
  150. } else {
  151. //处理详情网址
  152. String rawText = page.getRawText();
  153. rawText = rawText.replace("display:none;", "");
  154. Document document = Jsoup.parse(rawText);
  155. Element content = document.getElementById("form1");
  156. if (Objects.isNull(content)) {
  157. content = document.select("#aspnetForm > div:nth-child(3) > table:nth-child(4) > tbody:nth-child(2) > tr > td:nth-child(3) > div > table").first();
  158. }
  159. //文件url清洗
  160. Elements elements = content.select("a.lan");
  161. if (Objects.nonNull(elements) && elements.size() > 0) {
  162. elements.remove();
  163. }
  164. Elements as = content.select("a");
  165. for (Element a : as) {
  166. String href = a.attr("href");
  167. href = urlClean(href,baseUrl,currentUrl);
  168. a.attr("href", href);
  169. }
  170. //图片url清洗
  171. Elements imgs = content.select("img");
  172. for (Element img : imgs) {
  173. String src = img.attr("src");
  174. src = urlClean(src,baseUrl,currentUrl);
  175. img.attr("src", src);
  176. }
  177. //正文清洗
  178. // Element frmBestwordHtml = content.getElementById("frmBestwordHtml");
  179. // if (Objects.nonNull(frmBestwordHtml)) {
  180. // String src = frmBestwordHtml.attr("src");
  181. // src = urlClean(src,baseUrl,currentUrl);
  182. // frmBestwordHtml.attr("src", src);
  183. // try {
  184. // String res = doGet(src);
  185. // Element element = Jsoup.parse(res);
  186. // frmBestwordHtml.replaceWith(element);
  187. // } catch (Exception e) {
  188. // throw new RuntimeException(e);
  189. // }
  190. // }
  191. //清洗
  192. // content.select("td.info_text").remove();
  193. //save
  194. Map<String, Object> map = context.get(currentUrl);
  195. String SOURCE_NAME = "英山县公共资源交易中心-英山县政府采购中心";
  196. String DETAIL_LINK = currentUrl;
  197. Element titleElement = content.getElementById("lblXmmc");
  198. if (Objects.isNull(titleElement)) {
  199. titleElement = content.getElementById("ctl00_ContentPlaceHolder1_TitleLabel");
  200. }
  201. String DETAIL_TITLE = titleElement.text().trim();
  202. String DETAIL_CONTENT = content.toString();
  203. LocalDate PAGE_TIME = ((LocalDate) map.get("listDate"));
  204. // LocalDate PAGE_TIME = ((LocalDate) page.getRequest().getExtra("listDate"));
  205. LocalDate CREATE_TIME = LocalDate.now();
  206. String LIST_TITLE = ((String) map.get("title"));
  207. // String LIST_TITLE = ((String) page.getRequest().getExtra("title"));
  208. String CREATE_BY = "黄略";
  209. String sql = "insert into " + MyDao.TABLE_NAME +"(SOURCE_NAME,DETAIL_LINK,DETAIL_TITLE,DETAIL_CONTENT,PAGE_TIME,CREATE_TIME,LIST_TITLE,CREATE_BY) VALUES (?,?,?,?,?,?,?,?)";
  210. try(Connection connection = MyDao.getConnection();
  211. PreparedStatement preparedStatement = connection.prepareStatement(sql);){
  212. preparedStatement.setString(1, SOURCE_NAME);
  213. preparedStatement.setString(2, DETAIL_LINK);
  214. preparedStatement.setString(3, DETAIL_TITLE);
  215. preparedStatement.setString(4, DETAIL_CONTENT);
  216. preparedStatement.setDate(5, Date.valueOf(PAGE_TIME)); // LocalDate -> java.sql.Date
  217. preparedStatement.setDate(6, Date.valueOf(CREATE_TIME));
  218. preparedStatement.setString(7, LIST_TITLE);
  219. preparedStatement.setString(8, CREATE_BY);
  220. preparedStatement.executeUpdate();
  221. } catch (SQLException e) {
  222. throw new RuntimeException(e);
  223. }
  224. }
  225. }
  226. @Override
  227. public Site getSite() {
  228. return site;
  229. }
  230. //启动
  231. public static void main(String[] args) {
  232. Spider spider = Spider.create(new Application4())
  233. .addUrl("http://ztb.chinays.gov.cn/ceinwz/WebInfo_List.aspx?newsid=81&jsgc=01100000&zfcg=&tdjy=&cqjy=&qtjy=&PubDateSort=1&ShowPre=1&CbsZgys=0&zbfs=&qxxx=0&showqxname=0&NewsShowPre=1&wsjj=0&showCgr=0&ShowOverDate=0&showdate=1&FromUrl=zbgg");
  234. System.out.println("start");
  235. spider.run();
  236. System.out.println("end");
  237. }
  238. }