simple_html_dom 不适用于 HTTPS 站点
simple_html_dom not working for HTTPS sites
我喜欢使用 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:
a print_r($str);将 return :
���ko�H���ϯ��Aj�Im��=�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�Qi�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 插件中开发的。可能与问题有关,正在调查中。
您的代码中存在一些错误,特别是错误处理方面的错误。当您的其余代码使用 $curl
时,您使用了不正确的句柄变量 $ch
。您还应该在关闭资源之前获取错误。
您还需要解压缩来自服务器的响应,因为它是通过 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
根据我的经验,您从请求中收到的响应是以 base-64 编码的。
要解决此问题,您必须使用以下 php 函数对字符串进行解码:
$html = base64_decode($html);
其中 $html 是 cUrl 响应。
我喜欢使用 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:
a print_r($str);将 return :
���ko�H���ϯ��Aj�Im��=�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�Qi�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 插件中开发的。可能与问题有关,正在调查中。
您的代码中存在一些错误,特别是错误处理方面的错误。当您的其余代码使用 $curl
时,您使用了不正确的句柄变量 $ch
。您还应该在关闭资源之前获取错误。
您还需要解压缩来自服务器的响应,因为它是通过 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
根据我的经验,您从请求中收到的响应是以 base-64 编码的。
要解决此问题,您必须使用以下 php 函数对字符串进行解码:
$html = base64_decode($html);
其中 $html 是 cUrl 响应。