一次對HTTPS頁面抓取的報錯發現過程

定位錯誤的思路
服務器君一共花費了64.979 ms進行了4次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

今天發現系統后臺的某個抓取頁面突然失效了,提示:

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/.

Google了一下,大概意思就是,在主線程里使用同步的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了。

如何讓抓取支持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。

或者用下面的語句判斷openssl的啟用情況:

$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);

現在后臺抓取又重新正常,問題解決很容易,就是在發現問題上花的時間長了。

本文地址:http://www.snpmgr.live/librarys/veda/detail/2836,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.snpmgr.live/librarys/veda/detail/2836

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《C程序設計語言(第2版新版)》 克尼漢 (作者), 等 (作者, 譯者), 徐寶文 (譯者)

《C程序設計語言》(第2版新版)是由C語言的設計者Brian W.Kernighan和Dennis M.Ritchie編寫的一部介紹標準C語言及其程序設計方法的權威性經典著作。全面、系統地講述了C語言的各個特性及程序設計的基本方法,包括基本概念,類型和表達式、控制流、函數與程序結構、指針與數組、結構、輸入與輸出、UNIX系統接口、標準庫等內容。

更多計算機寶庫...

燃烧吧足球登陆