最近接到一个小项目,从一个网站抓取数据以另一种格式在另一个网站显示,其中遇到了不少的问题,主要用了javascript和jquery。现在总结一下遇到的一些问题和解决办法。

思路:使用ajax请求网站数据,返回的数据主要有html类型和json类型的结果。如果是坑爹的html数据则只能根据html的元素,如id值、css、标签值等去截取数据。如果是json格式的返回值就好办多了,直接拿来用。将数据保存成数组或者json格式,将数据重新组装成用户需要的页面。

遇到的主要问题:

1、坑爹的浏览器问题。

2、javascript正则表达式使用。

3、jquery的ajax使用。

一、浏览器问题

由于本机开发时使用的是win8.1,不能装用户指定使用的ie8,只能用ie11,为啥不用chrome呢?因为使用chrome时报了以下错误:

XMLHttpRequest cannot load http://xxx.com/xxx!selectZoneOfTown.ajax. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

原因:

这是一个跨域问题,当协议,域名,端口都与服务端相同时是同一个域。而我使用ajax请求‘http://xxx.com/xxx!selectZoneOfTown.ajax’时,至少域是不一样的,这个问题是浏览器的安全机制所产生的,要

解决浏览器跨域问题:

1、可以在服务端的响应header上设置Access-Control-Allow-Origin,由于我没有服务端代码,只能换ie11了

2、在chrome右击图标->快捷方式->目标:添加红色部分"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"--allow-file-access-from-files(我这里不起作用),网上查了下已失效……

3、还有一个方法:JSONP,具体看:http://stackoverflow.com/questions/19085965/jquery-ajax-access-control-allow-origin

4、使用IE11没有出现跨域问题,所以只能用IE11,但是当使用IE8时出现:No Transport,原来是IE6-IE9都不支持跨域访问,可以在ajax请求前添加:jQuery.support.cors = true;

二、javascript正则表达式的使用

在ajax获取到html字符串后,为了截取网页上的数据,需要先查看数据的格式,一般都是<tr><td>数据</td></tr>这样的格式,javascript提供了几个方法:

1、html.match(/<tr><td>.*<\/td><\/tr>/g)获取所有“<tr><td>数据</td></tr>”格式的数据,后面的g指符合正则表达式的所有数据将保存为数组,没g则取第一个符合的数据。

2、html.replace(/<tr><td>/g,"").replace(/</td></tr>/g,"")将<tr><td>和</td></tr>替换为空,则获取到数据。

3、html.split.(/<table>/)以<table>截取,获得数组结果集。

更多的正则表达式使用参考:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp

总结:正则表达式功能强大,使用时要注意每一个空格,每一个值都要匹配。

三、jquery的ajax使用

     $.ajax({url: encodeURI(durl),   type:'get',async:false,cache:false,dataType:'json',success: function (data) {//}, error: function (a, b, c) {alert(b);}});

encodeURI()方法主要对url的中文字符进行编码。

aysnc:默认为true,即异步,所谓异步即用户进行ajax请求时,用户还可以操作页面。使用时注意变量赋值或返回值因异步请求没执行完导致变量没有值或没返回值问题。

cache:默认为true,缓存ajax请求的数据。

dataType:设置服务端响应的数据类型,注意当设置的类型与返回的类型不一致时,会出现:parsererror,对返回的数据无法解析。返回的结果如是hmtl这data类型为html格式的字符串,如是设置dataType:json,这返回json格式。

error:function(a,b,c){}:要善于利用error,输出这个值可以帮我们查找到问题的原因。

ajax的使用主要是要注意ajax的格式和理解同步异步问题,更多参考:http://www.php100.com/manual/jquery/

总结:

这个小项目真搓,利用强大的正则表达可以截取出数据,但是一旦获取的html页面的DOM结构或者其中一个id等发生变化,那么这个使用javascript写的抓取页面就无法使用,需要修改……

希望有高手提供更好的意见和建议学习下。

使用javascript抓取网站数据相关推荐

  1. java抓取网站数据

    java 抓取网站数据 假设你需要获取51job 人才网上java 人才的需求数量,首先你需要分析51job 网站的搜索这 一块是怎么运作的,通过解析网页的源代码,我们发现了以下一些信息: 1. 搜索 ...

  2. 查询数据 抓取 网站数据_有了数据,我就学会了如何在几个小时内抓取网站,您也可以...

    查询数据 抓取 网站数据 I had a shameful secret. It is one that affects a surprising number of people in the da ...

  3. 抓取网站数据入库详解,附图文

    抓取网站数据入库详解,附图文 一. 分析需求 1.1 需求分析 刚好有这样一个需求,去抓取下方网站的页面全部数据,并存入MySQL数据库. 这个页面为: 爬取页面 年月日选择 出生于几点,性别: 男或 ...

  4. Scrapy爬虫轻松抓取网站数据

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也 ...

  5. 【python】python异步抓取网站数据【详细过程】

    项目介绍 askWeb/index.py 网站爬取数据类 database/index.py 数据库类(数据库封装) utils/index.py 工具文件 main.py 项目入口文件 1.main ...

  6. 如何简单的抓取网站数据

    1.首先,用带debug的火狐浏览器,访问要抓取的网站,通过debug的控制台或网络找到数据的接口. 2.Spring框架自3.0版本起,自带了任务调度功能,好比是一个轻量级的Quartz,而且使用起 ...

  7. 【爬虫】Scrapy 抓取网站数据

    [原文链接]http://chenqx.github.io/2014/11/09/Scrapy-Tutorial-for-BBSSpider/ Scrapy Tutorial 接下来以爬取饮水思源BB ...

  8. 使用puppeteer抓取网站数据

    记一下使用puppeteer抓取开源中国上的推荐软件数据 1.安装 npm install puppeteer 2.引入 const puppeteer = require('puppeteer'); ...

  9. 程序抓取网站数据HttpWebRequest

    下面的代码实现了与以前XMLHTTP类似的功能.代码如下: HttpSendData.aspx 标题: 内容: HttpReceiveData.aspx 补充code: private   HttpW ...

最新文章

  1. IEEE发布2022年科技趋势全球调研:人工智能和机器学习、云计算及5G将成为下一年最重要的技术...
  2. 算法-----数组------ 数组中的第K个最大元素
  3. DotNet 资源大全
  4. HP5200打印机从控制面板手动配置TCP/IP 参数
  5. 文件如何存储c语言,急求如何将下列C语言程序数据存储到文件中?
  6. pyqt5 不报错退出_Python学习之旅:使用virtualenv创建Python环境及PyQT5环境配置
  7. 【转载】6种.net分布式缓存解决方案
  8. React.js 入门与实战之开发适配PC端及移动端新闻头条平台课程上线了
  9. paip.FTP服务端及客户端的使用总结
  10. 片袖原型制图_袖原型一片袖打版干货
  11. iOS开发-plist文件的常用操作
  12. 利用ISA防火墙实现安全快速上网
  13. Swift - 实现公历、农历日期之间的相互转换
  14. 短信推广的规则,你知道多少?
  15. 冬至已至,你的在职读研2023能在社科院与杜兰大学金融管理硕士项目实现吗
  16. [集中式] SVN的安装与详细使用教程
  17. echarts:silent:true去掉markline label的tooltip
  18. H5的Notification特性
  19. Java-虚拟机原理
  20. opcenum在计算机服务找不到,opcenum.exe

热门文章

  1. 转:vim的复制粘贴小结
  2. RT5350订制WIFI转串口
  3. yama搜集的超超…全的下载音效的网站,持续更新
  4. 四轴自适应控制算法的一些尝试开源我的山猫飞控和梯度在线辨识自适应等算法—(转)...
  5. 推荐六款图片素材网站
  6. Java最新面试题100道,包含答案示例(1-10题)
  7. 计算机管理映像路径,手把手教你解决win7系统任务管理器显示映像路径的恢复办法...
  8. vue3跨组件传值(爷孙组件传值)
  9. java创建mongdb数据库_【转发】Java使用MongoDB数据库进行增删改查
  10. MySQL 数据库重启