资讯专栏INFORMATION COLUMN

基于Java的同花顺股票数据爬虫

EasonTyler / 2538人阅读

摘要:问题来源今天与同学聊天,得知他有个任务是抓取同花顺网站上的股票数据,有点兴趣,便做了相关实验。由于时间关系,以上代码只是把数据所在的网页抓取到本地,没有进行解析。

问题来源

今天与同学聊天,得知他有个任务是抓取同花顺网站上的股票数据,有点兴趣,便做了相关实验。

介绍

网站地址:http://q.10jqka.com.cn/

网站界面:

爬取内容:图中全部股票专栏表格中的数据

观察

浏览器:Firefox

观察现象:网页中每次只展示一页的数据,一页20条数据。通常来说,为了减轻浏览器的存储压力,后台服务器一般只给前台发送一页的数据,数据的获取需要前端发送请求

寻找请求:为了获取某一页数据对应的请求,点击F12键,调出浏览器工具控制台,并点击到网络专栏,同时清空界面中的所有请求,页面如下:

点击页,发现请求,该请求方法为GET,返回类型为html,界面如下:

探索请求:发现该请求的返回类型为html,为了进一步探索该请求,将该请求的地址复制到浏览器地址栏中,打开页面,发现这与主网站上的数据一致,可认为该请求可获取到股票数据。

寻找关系:通常来说,某一页与请求的地址会有特定的联系。刚刚我们请求的地址为:http://q.10jqka.com.cn/index/...,发现其中的4正好为我们所点击的页数,这个时候页数和请求地址的规律寻找出来了

实验

语言:Java

工具:htmlunit,

</>复制代码

  1. net.sourceforge.htmlunit
  2. htmlunit
  3. 2.35.0

基本思想:浏览器模拟点击

源码如下:

</>复制代码

  1. import java.io.BufferedWriter;
  2. import java.io.File;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.net.URL;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import com.gargoylesoftware.htmlunit.BrowserVersion;
  10. import com.gargoylesoftware.htmlunit.HttpMethod;
  11. import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
  12. import com.gargoylesoftware.htmlunit.Page;
  13. import com.gargoylesoftware.htmlunit.WebClient;
  14. import com.gargoylesoftware.htmlunit.WebRequest;
  15. import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
  16. import com.gargoylesoftware.htmlunit.html.HtmlButton;
  17. import com.gargoylesoftware.htmlunit.html.HtmlPage;
  18. import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
  19. import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
  20. public class HtmlUtil {
  21. WebClient webClient;
  22. //初始化
  23. public HtmlUtil(){
  24. webClient = new WebClient(BrowserVersion.CHROME);//新建一个模拟谷歌Chrome浏览器的浏览器客户端对象
  25. webClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常, 这里选择不需要
  26. webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要
  27. webClient.getOptions().setActiveXNative(false);
  28. webClient.getOptions().setCssEnabled(false);//是否启用CSS, 因为不需要展现页面, 所以不需要启用
  29. webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JS。有些网站要开启!
  30. webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAX
  31. webClient.getOptions().setTimeout(30000);
  32. }
  33. //获取某个url的web客户端
  34. public String htmlUnitUrl(String url, WebClient webClient) {
  35. try {
  36. WebRequest request = new WebRequest(new URL(url), HttpMethod.GET);
  37. Map additionalHeaders = new HashMap();
  38. additionalHeaders
  39. .put("User-Agent",
  40. "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36");
  41. additionalHeaders.put("Accept-Language", "zh-CN,zh;q=0.8");
  42. additionalHeaders.put("Accept", "*/*");
  43. request.setAdditionalHeaders(additionalHeaders);
  44. // 获取某网站页面
  45. Page page = webClient.getPage(request);
  46. return page.getWebResponse().getContentAsString();
  47. } catch (Exception e) {
  48. }
  49. return null;
  50. }
  51. //爬取某网页
  52. public void work(String url) {
  53. try {
  54. HtmlPage page = webClient.getPage(url);//打开网页
  55. int pageCount = 177;
  56. for(int i=1;i<=pageCount;i++) {
  57. //当访问速度过快时,后台浏览器会禁止,在这里可加入适当延迟的代码
  58. /**
  59. *延迟执行的代码
  60. */
  61. String content = htmlUnitUrl("http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/"+i+"/ajax/1/",webClient);
  62. if(content.contains("Nginx forbidden."))
  63. return;
  64. else {
  65. writeFile("F://测试//"+i+".html",content);
  66. }
  67. }
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. public static void main(String[] args){
  73. HtmlUtil demo=new HtmlUtil();
  74. String url = "http://q.10jqka.com.cn/";
  75. demo.work(url);
  76. }
  77. /**
  78. * 保存抓取的html到本地
  79. * @param path
  80. * @param content
  81. */
  82. public static boolean writeFile(String path,String content) {
  83. File file = new File(path);
  84. boolean isSuccess = true;
  85. System.out.println(path);
  86. // if file doesnt exists, then create it
  87. if (!file.exists()) {
  88. try {
  89. isSuccess = file.createNewFile();
  90. } catch (IOException e) {
  91. // TODO Auto-generated catch block
  92. e.printStackTrace();
  93. isSuccess = false;
  94. }
  95. }else {
  96. file.delete();
  97. }
  98. FileWriter fw;
  99. try {
  100. fw = new FileWriter(file.getAbsoluteFile());
  101. BufferedWriter bw = new BufferedWriter(fw);
  102. bw.write(content);
  103. bw.close();
  104. System.out.println("写入成功.");
  105. } catch (IOException e) {
  106. // TODO Auto-generated catch block
  107. e.printStackTrace();
  108. System.out.println("写入失败.");
  109. isSuccess = false;
  110. }
  111. return isSuccess;
  112. }
  113. }
总结

因为心存兴趣,便做了相关的实验,为了方便,其中的部分代码还借鉴了网上的源码。由于时间关系,以上代码只是把数据所在的网页抓取到本地,没有进行解析。

大家晚安~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74954.html

相关文章

  • 量化交易之股票数据获取——同花软件

    摘要:将另存为格式时,文件将工作表中的单元格所显示的文本和数值以逗号分离进行保存。方法此处使用模块的函数读取文件,函数以字典形式返回,字典的键则是这个单元格的标题即列头,每一个单元格内容放在字典的值内。 前言 数据是进行量化交易的基础和关键,目前国内做量化产品的金融机构大部分是从券商获取高频实时行情数据的,另外很多金融网站也提供了数据接口,可以调用接口方式获取,也可以用爬虫的方式获取。文本讲...

    Chaz 评论0 收藏0
  • 首次公开,整理12年积累博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • AI Challenger开赛,千万量级数据开放,AI高手将上演巅峰对决

    摘要:月日,各项竞赛的排名将决定最终的成绩排名。选手通过训练模型,对虚拟股票走势进行预测。冠军将获得万元人民币的奖励。 showImg(https://segmentfault.com/img/bVUzA7?w=477&h=317); 2017年9月4日,AI challenger全球AI挑战赛正式开赛,来自世界各地的AI高手,将展开为期三个多月的比拼,获胜团队将分享总额超过200万人民币的...

    Ali_ 评论0 收藏0
  • 计算机秋招必备!杭州互联网大厂企业整理清单!

    摘要:截至年月日零时,杭州市常住人口为万人。年,杭州市实现地区生产总值亿元。阿里巴巴对杭州的影响巨大,一线的七个企业中,有四个企业都是阿里巴巴大集团下的。 欢迎持续关注我...

    morgan 评论0 收藏1

发表评论

0条评论

EasonTyler

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<