博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一次对HTTPS页面抓取的报错发现过程
阅读量:6041 次
发布时间:2019-06-20

本文共 2727 字,大约阅读时间需要 9 分钟。

  hot3.png

今天发现系统后台的某个抓取页面突然失效了,提示:

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.

大概意思就是,在主线程里使用同步的ajax请求对用户体验有影响,所以不让用了。

于是修改一下抓取函数:

function getProcessData(url)	{	    $.ajax({ 	        type: "get",        //使用get方法访问后台 	        dataType: "jsonp",  //返回json格式的数据 	        jsonp:"callback",	        url: '/news_spider_process/',  // 跨域URL  	        //url: 'http://localhost/test.php',  // 跨域URL  	        data:{"url":url},	        //async: false,	        //async: true,	        error: function (jqXHR, exception) {	            var msg = '';	            //alert(jqXHR.status);	            //alert(jqXHR.responseText);	            if (jqXHR.status === 0) {	                msg = 'Not connect.\n Verify Network.';	            } else if (jqXHR.status == 404) {	                msg = 'Requested page not found. [404]';	            } else if (jqXHR.status == 500) {	                msg = 'Internal Server Error [500].';	            } else if (exception === 'parsererror') {	                msg = 'Requested JSON parse failed.';	            } else if (exception === 'timeout') {	                msg = 'Time out error.';	            } else if (exception === 'abort') {	                msg = 'Ajax request aborted.';	            } else {	                msg = 'Uncaught Error.\n' + jqXHR.responseText;	            }	            //$('#content').html(msg);	        },	        success: function(data){	            //alert(data.url);	            $("#news_title").val(data.url);	            //$("#title").html(data.url);	            //$("#tagA").html("333");	            re = new RegExp("\/p>","g");	            $("#tagA").html(data.content.replace(re,"/p>\n"));	            $("#news_creater").val("nowamagic.net");	        }	    }) 	}

先是把async: false注释掉,发现抓取依然是不行。照理这个是警告,不会阻止程序的运行才对的。

于是加上$.ajax的error选项,发现jqXHR.status输出 200,就是网络是通的。而jqXHR.responseText返回了一处PHP报错,定位到错误处,发现$array file_get_contents($url); 报错了。之前一直都是正常的,怎么突然报错了呢?去那个网页一看,发现网页已经全部用上HTTPS了。

如何让抓取支持呢?这里环境是xampp,就以这个为例。

首先,检查/xampp/php/ext目录下是否存在php_openssl.dll文件,一般是有的,没有就需要另行下载。

然后/xampp/php/php.ini文件,查找extension=php_openssl.dll,如果找到了,去掉前面的分号;如果没找到就在extension=php_curl.dll的下一行添加如下代码:extension=php_openssl.dll,然后重启Apache就行了。

打开phpinfo(),查看一下openssl是否已正常启用,当正常启用时,在OpenSSL support后面会出现enabled。

2016_08_20_01.png

或者用下面的语句判断的启用情况:

$w = stream_get_wrappers();echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', PHP_EOL;echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', PHP_EOL;echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', PHP_EOL;echo 'wrappers: ', var_export($w);

现在后台抓取又重新正常,问题解决很容易,就是在发现问题上花的时间长了。

转载于:https://my.oschina.net/sunYwp/blog/791829

你可能感兴趣的文章
Jexus下配置多个站点
查看>>
Xcode编辑器的技巧与诀窍
查看>>
String、StringBuffer与StringBuilder之间区别
查看>>
工作第十三周:身体掏空,精神饱满
查看>>
Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
查看>>
ios扩展机制objc_setAssociatedObject,objc_getAssociatedObject
查看>>
批量添加-fno-objc-arc
查看>>
二叉树的层序遍历
查看>>
os模块
查看>>
安装 matplotlib
查看>>
css伪类(:before和:after)
查看>>
react native TypeError network request failed
查看>>
PLSQL锁表之后改如何操作
查看>>
Sql注入、文件上传与手机品牌信息抓取解决方案
查看>>
SQLServer跨库查询--分布式查询[转载]
查看>>
django错误-NoReverseMatch at /admin/
查看>>
Laravel中的信息验证 和 语言包
查看>>
折半查找法(二分查找 java版)
查看>>
工作两周年—--个人知识体系梳理
查看>>
win2003开启telnet
查看>>