南昌制作网站的公司,长春网站优化平台,邯郸推广网络宣传哪家好,深圳网站建设推广方法urllib 库和 requests 库的使用#xff0c;已经可以爬取绝大多数网站的数据#xff0c;但对于某些网站依然无能为力。什么情况?这些网站强制使用HTTP/2.0协议访问#xff0c;这时 urllib 和requests 是无法爬取数据的#xff0c;因为它们只支持 HTTP/1.1#xff0c;不支持…urllib 库和 requests 库的使用已经可以爬取绝大多数网站的数据但对于某些网站依然无能为力。什么情况?这些网站强制使用HTTP/2.0协议访问这时 urllib 和requests 是无法爬取数据的因为它们只支持 HTTP/1.1不支持 HTTP/2.0。那这种情况下应该怎么办呢?
还是有办法的只需要使用一些支持 HTTP/2.0的请求库就好了目前来说比较有代表性的是hyper 和 httpx后者使用起来更加方便功能也更强大requests 已有的功能它几乎都支持。
示例
下面我们来看一个案例https://spa16.scrape.center/ 就是强制使用 HTTP/2.0访问的一个网站用浏览器打开此网站查看 Network面板可以看到 Protocol 一列都是 h2证明请求所用的协议是HTTP/2.0如下图所示。 这个网站用requests 是无法爬取的不妨来尝试一下:
import requestsurl https://spa16.scrape.center/
response requests.get(url)
print(response.text)运行结果如下:
requests.exceptions.ConnectionError: (Connection aborted., ConnectionResetError(10054, 远程主机强迫关闭了一个现有的连接。, None, 10054, None))可能有人认为这是没有设置请求头导致的其实不是真实原因是requests 这个库是使用 HTTP/1.1访问的目标网站,而目标网站会检测请求使用的协议是不是 HTTP/2.0,如果不是就拒绝返回任何结果。
安装
httpx 可以直接使用 pip3 工具安装所需的 Python 版本是 3.6及以上安装命令如下:
pip3 install httpx但这样安装完的 httpx 是不支持 HTTP/2.0的如果想支持可以这样安装:
pip3 install httpx[http2]这样就既安装了 httpx又安装了 httpx 对 HTTP/2.0 的支持模块。
基本使用
httpx 和 requests 的很多 API存在相似之处我们先看下最基本的 GET 请求的用法:
import httpxresponse httpx.get(https://www.httpbin.org/get)
print(response.status_code)
print(response.headers)
print(response.text)这里我们还是请求之前的测试网站直接使用htpx的get方法即可用法和requests 里的一模一样将返回结果赋值为response 变量然后打印出它的status code、headers、text 等属性运行结果如下:
200
Headers({date: Thu, 19 Dec 2024 14:27:23 GMT, content-type: application/json, content-length: 312, connection: keep-alive, server: gunicorn/19.9.0, access-control-allow-origin: *, access-control-allow-credentials: true})
{args: {}, headers: {Accept: */*, Accept-Encoding: gzip, deflate, Host: www.httpbin.org, User-Agent: python-httpx/0.28.1, X-Amzn-Trace-Id: Root1-67642d4b-31795bb819573e2e7516a357}, origin: 36.163.154.16, url: https://www.httpbin.org/get
}输出结果包含三项内容status code 属性对应状态码为 200;headers 属性对应响应头是一Headers 对象类似于一个字典;text 属性对应响应体可以看到其中的 User-Agent 是个、python-httpx/0.18.1代表我们是用 httpx 请求的。
下面换一个 User-Agent 再请求一次代码改写如下:
import httpxheaders {User-Agent: Mozilla/5.0 (Macintosh; Intel Mac 0s X 10 15 7)AppleWebKit/537.36 (KHTML, like Gecko)Chrome/90.0.4430.93 Safari/537.36}response httpx.get(https://www.httpbin.org/get, headersheaders)
print(response.text)这里我们换了一个 User-Agent重新请求并将其赋值为 headers 变量然后传递给headers 参数运行结果如下:
{args: {}, headers: {Accept: */*, Accept-Encoding: gzip, deflate, Host: www.httpbin.org, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac 0s X 10 15 7)AppleWebKit/537.36 (KHTML, like Gecko)Chrome/90.0.4430.93 Safari/537.36, X-Amzn-Trace-Id: Root1-67642df8-64d00406369b3f1b3660c57c}, origin: 36.163.154.16, url: https://www.httpbin.org/get
}可以发现更换后的 User-Agent 生效了。 回到本节开头提到的示例网站我们试着用httpx请求一下这个网站看看效果如何代码如下:
import httpxresponse httpx.get(https://spa16.scrape.center)
print(response.text)运行结果如下
httpx.ReadError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。可以看到抛出了和使用 requests 请求时类似的错误,不是说好支持 HTTP/2.0吗?其实,httpx 默认是不会开启对 HTTP/2.0的支持的,默认使用的是 HTTP/1.1,需要手动声明一下才能使用 HTTP/2.9,代码改写如下:
import httpxclient httpx.Client(http2True)
response client.get(https://spa16.scrape.center/)
print(response.text)运行结果如下:
!DOCTYPE htmlhtml langenheadmeta charsetutf-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width,initial-scale1meta namereferrer contentno-referrerlink relicon href/favicon.icotitleScrape | Book/titlelink href/css/chunk-50522e84.e4e1dae6.css relprefetchlink href/css/chunk-f52d396c.4f574d24.css relprefetchlink href/js/chunk-50522e84.6b3e24aa.js relprefetchlink href/js/chunk-f52d396c.f8f41620.js relprefetchlink href/css/app.ea9d802a.css relpreload asstylelink href/js/app.b93891e2.js relpreload asscriptlink href/js/chunk-vendors.a02ff921.js relpreload asscriptlink href/css/app.ea9d802a.css relstylesheet/headbodynoscriptstrongWere sorry but portal doesnt work properly without JavaScript enabled. Please enable it to continue./strong/noscriptdiv idapp/divscript src/js/chunk-vendors.a02ff921.js/scriptscript src/js/app.b93891e2.js/script/body/html这里我们声明了一个 Client 对象赋值为 client 变量同时显式地将 http2 参数设置为 True,这样便开启了对 HTTP/2.0的支持之后就会发现可以成功获取 HTML代码了。这也就印证了这个示例网站只能使用 HTTP/2.0 访问。
刚才我们也提到了httpx和requests有很多相似的API上面实现的是 GET请求对于POST请求、PUT请求和DELETE请求来说实现方式是类似的:
import httpxr httpx.get(https://www.httpbin.org/get, params{name: germey})
r httpx.post(https://www.httpbin.org/post, data{name: germey})
r httpx.put(https://www.httpbin.org/put)
r httpx.delete(https://www.httpbin.org/delete)
r httpx.patch(https://www.httpbin.org/patch)基于得到的 Response 对象可以使用如下属性和方法获取想要的内容。
status code:状态码:text:响应体的文本内容。content:响应体的二进制内容当请求的目标是二进制数据(如图片)时可以使用此属性 获取。headers:响应头是Headers 对象可以用像获取字典中的内容一样获取其中某个 Header 的值。json:方法可以调用此方法将文本结果转化为JSON对象。
除了这些htpx还有一些基本用法也和requests极其类似这里就不再赘述了可以参考官方文档:https://www.python-httpx.org/quickstart/。
Client对象
httpx 中有一些基本的 API和 requests 中的非常相似但也有一些 API是不相似的例如 htpx 中有一个 Client 对象就可以和 requests 中的 Session 对象类比学习。 下面我们介绍 client 对象的使用。官方比较推荐的使用方式是withas语句示例如下:
import httpxwith httpx.Client() as client:response client.get(https://www.httpbin.org/get)print(response)运行结果如下:
Response [200 OK]这个用法等价于:
import httpxclient httpx.Client()
try:response client.get(https://www.httpbin.org/get)
finally:client.close()两种方式的运行结果是一样的只不过这里需要我们在最后显式地调用 close 方法来关闭 client对象。
另外在声明 Client 对象时可以指定一些参数例如 headers这样使用该对象发起的所有请求都会默认带上这些参数配置示例如下:
import httpxurl http://www.httpbin.org/headers
headers {User-Agent: my-app/0.0.1}
with httpx.Client(headersheaders) as client:r client.get(url)print(r.json()[headers][User-Agent])这里我们声明了一个 headers 变量内容为 User-Agent 属性然后将此变量传递给 headers 参数初始化了一个 client 对象并赋值为 client 变量最后用 client 变量请求了测试网站并打印返回结果中的 User-Agent 的内容:
my-app/0.0.1可以看到headers 成功赋值了。 关于 Client 对象的更多高级用法可以参考官方文档:https://www.python-httpx.org/advanced/。
支持 HTTP/2.0
现在是要在客户端上开启对 HTTP/2.0的支持就像“基本使用”小节所说的那样同样是声明Client 对象然后将 http2 参数设置为True如果不设置那么默认支持 HTTP/1.1即不开启对HTTP/2.0 的支持。 写法如下:
import httpxclient httpx.Client(http2True)
response client.get(https://www.httpbin.org/get)
print(response.text)
print(response.http_version)这里我们输出了 response 变量的 http_version 属性这是 requests 中不存在的属性其结果可能为:
HTTP/2这里输出的 http_version 属性值是 HTTP/2代表使用了 HTTP/2.0 协议传输。 注意在客户端的 httpx 上启用对 HTTP/2.0的支持并不意味着请求和响应都将通过 HTTP/2.0 传输这得客户端和服务端都支持 HTTP/2.0 才行。如果客户端连接到仅支持 HTTP/1.1 的服务器那么它也需要改用 HTTP/1.1。 支持异步请求
httpx 还支持异步客户端请求(即 AsyncClient )支持 Python的 async 请求模式写法如下:
import httpx
import asyncioasync def fetch(url):async with httpx.AsyncClient(http2True) as client:response await client.get(url)print(response.text)if __name__ __main__:asyncio.get_event_loop().run_until_complete(fetch(https://www.httpbin.org/get))关于异步请求目前仅了解一下即可后面章节也会专门对异步请求进行讲解。大家也可以参考官方文档:https://www.python-httpx.org/async/。
总结
本篇博客介绍了 httpx的基本用法,该库的 API与requests的非常相似,简单易用,同时支持 HTTP/2.0. 推荐大家使用。 文章转载自: http://www.morning.mxhgy.cn.gov.cn.mxhgy.cn http://www.morning.tfpbm.cn.gov.cn.tfpbm.cn http://www.morning.hqjtp.cn.gov.cn.hqjtp.cn http://www.morning.bmyrl.cn.gov.cn.bmyrl.cn http://www.morning.smggx.cn.gov.cn.smggx.cn http://www.morning.tqwcm.cn.gov.cn.tqwcm.cn http://www.morning.stsnf.cn.gov.cn.stsnf.cn http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn http://www.morning.rdzlh.cn.gov.cn.rdzlh.cn http://www.morning.lnwdh.cn.gov.cn.lnwdh.cn http://www.morning.mjctt.cn.gov.cn.mjctt.cn http://www.morning.sldrd.cn.gov.cn.sldrd.cn http://www.morning.bhznl.cn.gov.cn.bhznl.cn http://www.morning.pjjkz.cn.gov.cn.pjjkz.cn http://www.morning.pymff.cn.gov.cn.pymff.cn http://www.morning.qjtbt.cn.gov.cn.qjtbt.cn http://www.morning.wprxm.cn.gov.cn.wprxm.cn http://www.morning.jsmyw.cn.gov.cn.jsmyw.cn http://www.morning.plzgt.cn.gov.cn.plzgt.cn http://www.morning.jydky.cn.gov.cn.jydky.cn http://www.morning.xzgbj.cn.gov.cn.xzgbj.cn http://www.morning.mzhhr.cn.gov.cn.mzhhr.cn http://www.morning.gjqwt.cn.gov.cn.gjqwt.cn http://www.morning.rmxwm.cn.gov.cn.rmxwm.cn http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.mjctt.cn.gov.cn.mjctt.cn http://www.morning.rxnxl.cn.gov.cn.rxnxl.cn http://www.morning.rczrq.cn.gov.cn.rczrq.cn http://www.morning.nrbcx.cn.gov.cn.nrbcx.cn http://www.morning.yqrgq.cn.gov.cn.yqrgq.cn http://www.morning.pzjfz.cn.gov.cn.pzjfz.cn http://www.morning.bpwfr.cn.gov.cn.bpwfr.cn http://www.morning.btpll.cn.gov.cn.btpll.cn http://www.morning.fsfz.cn.gov.cn.fsfz.cn http://www.morning.mtgnd.cn.gov.cn.mtgnd.cn http://www.morning.ywqw.cn.gov.cn.ywqw.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.wspyb.cn.gov.cn.wspyb.cn http://www.morning.rnytd.cn.gov.cn.rnytd.cn http://www.morning.rnzwh.cn.gov.cn.rnzwh.cn http://www.morning.pwlxy.cn.gov.cn.pwlxy.cn http://www.morning.gqwbl.cn.gov.cn.gqwbl.cn http://www.morning.bnbtp.cn.gov.cn.bnbtp.cn http://www.morning.hcqpc.cn.gov.cn.hcqpc.cn http://www.morning.rfzbm.cn.gov.cn.rfzbm.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.knzdt.cn.gov.cn.knzdt.cn http://www.morning.hbjqn.cn.gov.cn.hbjqn.cn http://www.morning.fhghy.cn.gov.cn.fhghy.cn http://www.morning.abgy8.com.gov.cn.abgy8.com http://www.morning.lsqxh.cn.gov.cn.lsqxh.cn http://www.morning.mxbks.cn.gov.cn.mxbks.cn http://www.morning.nyqnk.cn.gov.cn.nyqnk.cn http://www.morning.mbprq.cn.gov.cn.mbprq.cn http://www.morning.xcyzy.cn.gov.cn.xcyzy.cn http://www.morning.dysgr.cn.gov.cn.dysgr.cn http://www.morning.qhnmj.cn.gov.cn.qhnmj.cn http://www.morning.24vy.com.gov.cn.24vy.com http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.fwcnx.cn.gov.cn.fwcnx.cn http://www.morning.wjtxt.cn.gov.cn.wjtxt.cn http://www.morning.wtdhm.cn.gov.cn.wtdhm.cn http://www.morning.hfbtt.cn.gov.cn.hfbtt.cn http://www.morning.yxzfl.cn.gov.cn.yxzfl.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.zhghd.cn.gov.cn.zhghd.cn http://www.morning.dqwkm.cn.gov.cn.dqwkm.cn http://www.morning.hjjkz.cn.gov.cn.hjjkz.cn http://www.morning.ldqrd.cn.gov.cn.ldqrd.cn http://www.morning.chzqy.cn.gov.cn.chzqy.cn http://www.morning.jzykw.cn.gov.cn.jzykw.cn http://www.morning.kfwqd.cn.gov.cn.kfwqd.cn http://www.morning.qjngk.cn.gov.cn.qjngk.cn http://www.morning.dgfpp.cn.gov.cn.dgfpp.cn http://www.morning.tlbhq.cn.gov.cn.tlbhq.cn http://www.morning.wbns.cn.gov.cn.wbns.cn http://www.morning.mfsjn.cn.gov.cn.mfsjn.cn http://www.morning.rngyq.cn.gov.cn.rngyq.cn http://www.morning.qqnh.cn.gov.cn.qqnh.cn http://www.morning.thrgp.cn.gov.cn.thrgp.cn