掌握Python中的HTTPS请求抓取技术
一、引言
随着互联网的发展,HTTPS协议已经成为网络安全传输的标准。
在Python中进行HTTPS请求抓取,可以帮助我们获取网络资源、分析网站数据等。
本文将详细介绍如何在Python中掌握HTTPS请求抓取技术。
二、Python中的HTTPS请求库
在Python中,进行HTTPS请求抓取主要依赖于以下几个库:
1. requests:最流行的HTTP库,可用于发送HTTP/HTTPS请求。
2. urllib3:提供了高级的HTTP和消息传输功能,支持HTTPS。
3. httpx:新一代HTTP客户端库,支持HTTP/2和HTTPS。
三、使用requests库进行HTTPS请求
requests库是Python中最简单易用的HTTP/HTTPS请求库。下面是一个基本的HTTPS请求示例:
“`python
import requests
url =替换为需要抓取的HTTPS网址
response = requests.get(url) 发送GET请求
print(response.text) 输出响应内容
“`
对于POST请求,可以使用requests.post()方法:
“`python
import requests
url =替换为需要抓取的HTTPS网址
data ={key: value} POST请求的数据
response = requests.post(url, data=data) 发送POST请求
print(response.text) 输出响应内容
“`
四、处理HTTPS证书验证问题
在进行HTTPS请求时,可能会遇到证书验证问题。
为了解决这个问题,可以使用requests库的verify参数来指定证书路径。
如果服务器使用的证书是可信的,可以将verify参数设置为True;否则,可以指定一个可信任的证书路径。
例如:
“`python
import requests
url =替换为需要抓取的HTTPS网址
response = requests.get(url, verify=/path/to/certfile) 指定证书路径进行验证
print(response.text) 输出响应内容
“`
五、使用urllib3库进行HTTPS请求
urllib3库提供了更底层的HTTP和消息传输功能,支持更复杂的操作。下面是一个使用urllib3进行HTTPS请求的示例:
“`python
from urllib3 importHTTPSConnectionPool, RequestElement, encode_multipart_formdata, decode_multipart_formdata, fields, filetypes, responsecode, error as urllib3_error, fieldnames as urllib3_fields, processinfo as urllib3_processinfo, serverinfo as urllib3_serverinfo, userinfoas urllib3_userinfo, poolmanager as urllib3_poolmanager, make_multipart_boundary, HTTPResponseNotFound as URLError404ErrorErrorMixinForRequestEncodingSupportMixInBase = httpxMixinRequestEncoderFactoryAdapterCommonDictUtilsFallbackRequestsFieldPlaceholderURLErrorParsingWrapperResultItemCallbackAcceptingSequenceResultsInfoTimeConnectiPoolConstructorsMessagesExceptSensingRetriesSortErrorHandlerInterruptDictMonitorParamTestsUnsafeBloblessBundlesInfinitedZeroResultsResumedTableCharResponseBase64URLDecodingContentDecoderContextDictHandlerMultipartHeadersPoolPoolManagerParserAdapterModuleSSLVersionTlsAdapterCookiejarClientAdapterHeadersCompatErrorPoolingConnectorAcceptEncodingCompressAdapterKeepAliveClientRedirectFallbackClientConnPatchForUrlsProcessUrlsResultValuesHTTPHeadersTransportSecurityRetryDelayeReasonAdapterGlobalResetProcessingSpecLenBeforeReasonHooksSSLErrToIpSortiepsApprovedHeadersStreamFactoryDefaultUserAgentCompatPoolCompatRequestErrorTimeoutEncodingFallbackSessionCookieJarRequestFieldDictFactoryAdaptersClientOptsTimeoutDictAdapterOptionsFallbackResponseEncoderResponseParserStreamedResponseFactoryAdaptersMixinErrorFieldsProcessCharsetBuilderAuthNegotiateDecodeTypeGeneratorsInOutputJsonMetadataPayloadLengthConfigMatchingClosingPartialMethodsInsecureConnectorsBrokenMimeHttpBasicErrorsFiltersMixedCompatibilityWrappersMappingGlobalQueueStatusCodeResetLoggingValuesHandleMultiHeaderValidationDispatcherMethodTestCertificatesHeadValidateAbsoluteConnectRequestsConnectTimeoutAbortJsonPGetOptionTimeoutErrorHandlingResponseEncodingFallbackSessionCookieJarRequestFieldDictFactoryAdaptersClientOptsTimeInitAdaptersNotSignedCorrectlyTaskIterConnectedProcessorsTrustConnTransformsChecksErrorResponseIntrospectionCertificatesLengthStructTraceCleanInstanceCompatibilityProcessingCallbacksNonTimeoutInstanceJsonCookieInsecureInvalidMatchEventTaskRespPipelineShutdownMultipleTargetFailoverableJsonCommonFactoryTimeoutsIncompleteHandlingRedirectStrategyDisconnectHandlersDictUrlEncodingAcceptCompressOptionsCompressAdapterKeepAliveClientRedirectFallbackSessionAdapterFallbackHttpMultipartEncodersParamsCertsRequiredTaskBasicDefaultAuthenticationSessionsBackpressureCompressionSessionsCertificateHeadersBrokenCookieTransportClientErrorsGeneratorsPatchesMixedHandlingCertsErrorsErroringAuthCompressEncoderWithTimeoutsRequestsAndOptionsRetryStatusCodeBackpressureDictSafeWriterExtensionsHandshakeSafeCookieProxyChunkedFallbackHandlingUnknownDisconnectNoErrorsSessionsFuturePartialCloseCertsSocketTransportMatchingMultipleSslProtocolRetriesClosingDecodingEventLoggingDataQueueCleanupSslCertOverridesMultipartMessageKeepaliveAuthCertFailuresRetryStrategyAdaptersTimeoutRetryDecodingEventLoggingDataQueueCleanupSslCertOverridesMultipartMessageKeepaliveAuthCertFailuresRetriesResourceDetectionFactoriesExtensionsOn
如何实现python接口,的https
今天写代码时碰到一个问题,花了几个小时的时间google,基本上把google搜索的前几页内容都一一看了下,问题最终是解决了,不过过程挺曲折的,所以把这个过程记下来以便以后参考之。
原因是以下一段代码引起的:?12import (本来这段代码很简单的,就是请求一个https的连接,可是报以下错误:?:第一反应是https证书问题产生的,如是以python ssl 为关键字google后,看到大家都在用requests这个python组件做http请求客户端,就像java里面的httpclient组件一样,如果安装完request包后,改成如下代码:?12import (还是报以下错误:?: [Errno 1] _ssl.c:504: errorE8:SSL routines:SSL23_GET_SERVER_HELLO:reason(1000)可以看出来,用requests和urllib2报的错误信息是一样,可见它们都是基于相同的底层api操作的,比如基于TLS的socket连接。
到这里的时候我怀疑这个问题不是python代码写的有问题,可能是操作系统级别的设置错了。
如下直接在shell客户端运行如下测试脚本:?1wget果然报如下错误:?12OpenSSL: errorE8:SSL routines:SSL23_GET_SERVER_HELLO:reason(1000)无法建立 SSL 连接。
到这里我怀疑是openssl安装有问题,更新到最新版本后还是一样,然后在浏览器里访问是可以的,所以应该不是openssl有问题。
继续google…….,就发现有人也遇到过这种问题,说是连接SSL服务器时SSL的版本不对,如是用如下代码测试不同的SSL版本,看是不是这个问题:?curl -1curl -2curl -3分别用上面的三句脚本去测试连接情况,发现第三种可以连接正常(-1,2,3,数字分别代码tlsv1,sslv2,sslv3三个不同的SSL版本)。
说明这个https连接所在的服务器是基于SSLV3版本的。
找到的问题,就很容易知道怎么改写python代码了。
?class MyAdapter(HTTPAdapter):def init_poolmanager(self, connections, maxsize)= PoolManager(num_pools=connections,maxsize=maxsize,ssl_version=_SSLv3) s= ()(MyAdapter())#所有的https连接都用_SSLV3去连接(实现:?# custom HTTPS opener, banners oracle 10g server supports SSLv3 onlyimport httplib, ssl, urllib2, socketclass HTTPSConnectionV3():def __init__(self,*args,**kwargs).__init__(self,*args,**kwargs) def connect(self):sock= _connection((,),)if self._tunnel_= sockself._tunnel()= _socket(sock,_file,_file, ssl_version=_SSLv3)except , e:print(Trying SSLv3.)= _socket(sock,_file,_file, ssl_version=_SSLv23) class HTTPSHandlerV3():def https_open(self, req):return _open(HTTPSConnectionV3, req)# install _opener(_opener(HTTPSHandlerV3())) if __name__== __main__:r= (htANPROD1/bwskfcls.P_GetCrse)print(())可以看到这两种方案的原理都是一样,就是自定义连接处理器,改变连接时ssl的版本号。
Python怎么抓https的包
https 是加密的包,你抓了也没用
如何python中读取https传输中的cookie
在response的header里面,会有cookie的设置,[set-cookie]便可以看到