simple_html_dom不适用于HTTPS站点

时间:2015-09-04 15:16:58

标签: php wordpress scrape

我喜欢使用simple_html_dom来抓取网站和RSS订阅源的内容,但是当我在HTTPS网站上尝试使用它时,我遇到了一个问题。我似乎无法从中得到任何东西。

//  SCRAPER:
require_once 'simple_html_dom.php';

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// page to scrape
$base = 'https://kat.cr/applications/?rss=1';
// set up curl
$curl = curl_init();                                
// the url to request
curl_setopt( $curl, CURLOPT_URL, $base );           
// return to variable
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); 
// don't verify peer ssl cert
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
//  // fetch remote contents, check for errors
if ( false === ( $response = curl_exec( $curl ) ) )
    $error = curl_error( $curl );
// close the resource
curl_close( $curl );

if ( !$response ){
    die("Curl Error: {$error}");
}
$html = new simple_html_dom();
$html->load($response);

$titre = $html->find('title', 2);

echo "Success... Title is: ".$titre."</br>";

我认为openssl正在我的服务器上运行(我的系统管理员并不多)

[root@nsxxxxx ~]# php -i|grep ssl
Configure Command =>  './configure'  '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--cache-file=../config.cache' '--with-libdir=lib64' '--with-config-file-path=/etc' '--with-config-file-scan-dir=/etc/php.d' '--disable-debug' '--with-pic' '--disable-rpath' '--without-pear' '--with-bz2' '--with-exec-dir=/usr/bin' '--with-freetype-dir=/usr' '--with-png-dir=/usr' '--with-xpm-dir=/usr' '--enable-gd-native-ttf' '--without-gdbm' '--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr' '--with-openssl' '--with-pcre-regex=/usr' '--with-zlib' '--with-layout=GNU' '--enable-exif' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--with-kerberos' '--enable-ucd-snmp-hack' '--enable-shmop' '--enable-calendar' '--without-sqlite' '--with-libxml-dir=/usr' '--enable-xml' '--with-system-tzdata' '--enable-force-cgi-redirect' '--enable-pcntl' '--with-imap=shared' '--with-imap-ssl' '--enable-mbstring=shared' '--enable-mbregex' '--with-gd=shared' '--enable-bcmath=shared' '--enable-dba=shared' '--with-db4=/usr' '--with-xmlrpc=shared' '--with-ldap=shared' '--with-ldap-sasl' '--with-mysql=shared,/usr' '--with-mysqli=shared,/usr/lib64/mysql/mysql_config' '--enable-dom=shared' '--with-pgsql=shared' '--enable-wddx=shared' '--with-snmp=shared,/usr' '--enable-soap=shared' '--with-xsl=shared,/usr' '--enable-xmlreader=shared' '--enable-xmlwriter=shared' '--with-curl=shared,/usr' '--enable-fastcgi' '--enable-pdo=shared' '--with-pdo-odbc=shared,unixODBC,/usr' '--with-pdo-mysql=shared,/usr/lib64/mysql/mysql_config' '--with-pdo-pgsql=shared,/usr' '--with-pdo-sqlite=shared,/usr' '--with-sqlite3=shared,/usr' '--enable-json=shared' '--enable-zip=shared' '--without-readline' '--with-libedit' '--with-pspell=shared' '--enable-phar=shared' '--with-tidy=shared,/usr' '--enable-sysvmsg=shared' '--enable-sysvshm=shared' '--enable-sysvsem=shared' '--enable-posix=shared' '--with-unixODBC=shared,/usr' '--enable-fileinfo=shared' '--enable-intl=shared' '--with-icu-dir=/usr' '--with-enchant=shared,/usr' '--with-recode=shared,/usr'
Registered Stream Socket Transports => tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
openssl

这个php的输出是:

Success... Title is: 

print_r($ str);将返回:

���ko�H���ϯ��Aj�\7Im��=�t.'= �-�2��%%�Y̏�S�ҥ�h�T�Ev��ӱd����������˅s_4mYWϞ0B�8E5�ge5�����O~���Ӧm�Wq}�W��u�4E�~��v�^M..̻��o����J���}z�WU�����������W�E9��Pd��rZ��ՕsS3;/��]޶�쯞^t�ue,����Vz��ɴ�xza��~?+�iS�t�������vw��b��x`�_��W���ys[��%���ij��%�y3'�,r����`���L����}�`O1��O���u��kY������{��|����Ϝ޴EsqS.�uY���]-_��v�h��j�^55�w1�͔�p�� l]��^3�)w%����PlS�|S��T�)z_�js��6�YS��C%�r8e���D�)D��Ӌ�����?����������K.�]߇(}��_�_V7�_����SA��T�0Ny��4R.��0�4���n�E �E�n���e>������/��ˇ8  ߅��&?>��m�jr�.o'}��ӬzfC��!@t�"� H�u!@6B��u�l3[�Q����n��]�P����~��mh�����_^���̊e]���T�L���.�:���R��e{I�wo|y��&^ؽ�������,f������rݠ^�����G��Џ�6O@?��#�~䠽[о�]��ʀ����4��i;�� �|z[Pg{�Eߐo�����ه�!�v�O��i@|�B�8�O��ٓ�^<��rm�}�\X�^��u�^��բp^��Z��ځ�΀���W����on�i���l�C'��������az��e��~Dm�+�n�jW0��7�[Y�j� O����o=ق���H��!L��2�e����T0�y���/�(�$��4<�>�Dy><�.��Dj�:5R� �(�@�C�� �!@�<2���XI����t�X�N����7�G�z�{��62"T��6_���yYߗ�s���J�P!a'��m��'��MPs�^j'pk���S,1��Ʃv�kI#�Y:N=C@�&. RAPI�  (�]��f�b4�* �&^(��&�+�����Ҿuj�n#�LPt�E�.95x�M��ѭzĨG:�ȶ�wI�Qi�p��I>�    �k#2�T^@�}��A�r�}��%�4�Tb���1{�B��y(���<��LrB����2 ��4�=$n #+&�e�|7JS�z�b�7jrٳNMD *sQ'�.��,�1��X4 T��N�]�����ƞ�<»>&�3A|Y��æ�?���];W���h���X�?�  S=���b��˸Ad{QV�/��Ֆ��\ۋo�Z�kqm��y�G��[y�7�N/{����$�r����7���~ʓHny ^d1ҥ�Hx�&����}��|;�i�Q�9�4Gy����!džA�@1�#�b�S�����M��a=B��v�2v����K���a�z���y��U�������Yq_t�c�3���~�W*UЛ~�T�r"�wz�C�28eJ&^�R��K����,UQ,�0��Oi�(��}����@x��N�Ǿ�Q �E#�!��h���� �1��g�m#�����]��uUv��լ�+�m^.>B6���f`��E�d�NX͚���[w�h��;x\ַe��-g���d�L�S��q���t������o��ц�[wh���y9fm���N�`���Vԣ����}   ��ċU$R/�!O�̂�r7J\_JW�j��q�:5�Q���Yj!h4$VC�iH���jH@C�����[w���{��Z���=imc����?���r���o�j]lJ���Mt�ۙ�ͷ��x��=�̓�������x�Y�)xu�nYw}�yb� )Մ�$��+78�2J��b�G�R�PI��(�i��I�8����}�Ԑ<44�##8��#��{ؖ\cpF.b�"V.͕�\c��o@�����{�٧}ԡ����u�,�p� �����p�Y�Ku|B�ؿ�Irf��Z�f}��m���Y���r�ݨ�?@��K<,~K��'����}k%/`��'�8u ��ς��,I�0�a�r��܌�q�Q��}��F���Pxd��t��.��1܍0Z�ȡjĪi�U��裌=�{t�q���k�F��OM��-�����~���'�T^t+���ze����K.i ������xn�ƺ)ݲmm���pm��!����1jF>���^����;%���'�m   $|���CJ3����)Wx���8�}��X<u�##>ډ�:��V����B�P;�iG�vd���#[�F�{��"O���sl�Ĉ�ܣ0k�b��F��9kr��w�ܸ���=�n���B�b�����̽��M79qp���%������}~�*�IQЌe��4�C%���'�W����}=�Ԁ�cL��v"?�x�;���";�F��z��������)I��*��GDž|�)���|꼾r~�����_��ͧ��l9)(a�l5��Th�g�b�Bg�)�̧�n��/��.��1l@�vb�C�%Nڠ=O�Еe,r]�).�������

任何帮助,即使只是一个线索,关于在哪里看,将非常感激。

编辑:我忘了提一下,这段代码是在function.php文件的wordpress插件中开发的。它可能与问题有关,正在研究它。

2 个答案:

答案 0 :(得分:2)

您的代码中存在一些错误,尤其是错误处理方面的错误。当您的其余代码使用$ch时,您使用了错误的句柄变量$curl。您还应该在关闭资源之前获取错误。

当您通过GZIP发送时,您还需要解压缩服务器的响应,这就是您看到奇怪字符的原因。使用值为“gzip”的CURLOPT_ENCODING参数执行此操作。您还可以使用空字符串""来指定所有压缩 - 这应该是默认值,但是......

请查看以下代码作为示例:

// url to request
$base = 'https://kat.cr/applications/?rss=1';
// set up curl
$curl = curl_init();                                
// the url to request
curl_setopt( $curl, CURLOPT_URL, $base );           
// return to variable
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); 
// decompress using GZIP
curl_setopt( $curl, CURLOPT_ENCODING, '');
// don't verify peer ssl cert
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
//  // fetch remote contents, check for errors
if ( false === ( $response = curl_exec( $curl ) ) )
    $error = curl_error( $curl );
// close the resource
curl_close( $curl );

if ( !$response ){
    die("Curl Error: {$error}");
}

$html = new simple_html_dom();
$html->load( $response );
// ... your code

答案 1 :(得分:0)

根据我的经验,您从请求中收到的响应以base-64编码。

要解决此问题,您必须使用以下php函数解码字符串:

$html = base64_decode($html);

其中$ html是cUrl响应。