当前位置: 首页 > news >正文

使用HTTP客户端在Python中进行网页抓取——笔记

使用HTTP客户端在Python中进行网页抓取

在网页抓取的上下中,HTTP客户端向目标网站发送请求,并检索网站的HTML代码或JSON有效负载等信息。

HTTP客户端并不直接指向代码开发者,而是指在客户端-服务器模型中发送HTTP请求的部分。这个客户端是一个软件程序,例如网页浏览器(如Chrome、Firefox等)或者其他可以发送HTTP请求的程序(这样的程序可以用各种编程语言编写,包括Python)。

当我们编写爬虫程序时,我们编写的代码实际上创建的就是一个这样的HTTP客户端。

Python HTTP库

Python中有许多用来创建HTTP客户端和处理HTTP请求的库,被称为Python HTTP库。

Requests

被称为python中最受欢迎的HTTP库。

功能强大且用户友好,提供了许多便捷的方法用于发送各种HTTP请求。但缺乏对异步执行的支持,对于这种情况,可以使用HTTPX库。

Python Requests 库的主要特点:

  • 保持活动状态和连接池
  • 浏览器式SSL验证
  • HTTP(S)代理支持
  • 连接超时
  • 分块请求

安装请求

pip install requests

代码示例

向目标网站发送请求,检索器HTML代码,并将结果打印到控制台。

import requestsresponse = requests.get('https://news.ycombinator.com')print(response.text)
  1. import requests

    这行代码导入了Python的requests库。这是Python中最常用的HTTP客户端库,用于发送各种类型的HTTP请求。

  2. response = requests.get('https://news.ycombinator.com')

    这行代码发送一个HTTP GET请求到URL “https://news.ycombinator.com”。GET是一种HTTP方法,我们用它来请求服务器发送一些特定资源。在这个案例中,这个资源就是"https://news.ycombinator.com"首页的HTML内容。

    requests.get()函数返回一个Response对象,代表了服务器的响应数据。这个Response对象有许多属性和方法可以让我们访问响应的详细信息,比如状态码、头部、内容等。

  3. print(response.text)

    这行代码打印了响应对象的文本内容。Response.text属性包含了服务器返回的内容,这通常是一个字符串(对于HTML或JSON响应)。在这个案例中,它是"https://news.ycombinator.com"首页的HTML代码

HTTPX

HTTPX是个功能齐全的Python HTTP客户端库,包括集成的命令行客户端,同时提供同步和异步API。

HTTPX的主要特点

  • 广泛请求兼容的API
  • 继承的命令行客户端
  • 标准同步接口,但如果需要,还可以支持异步
  • 完整类型注释

安装HTTPX

pip install httpx

代码示例

Requests 示例类似,我们将向目标网站发送请求,检索页面的 HTML 并将其与请求状态代码一起打印到控制台。

HTTPX同步代码示例

import httpxresponse = httpx.get('https://news.ycombinator.com')status_code = response.status_code
html = response.textprint(status_code)
print(html[:200])  # print first 200 characters of html
  1. import httpx: 这行代码是Python语言中的模块导入语句,它导入了httpx库,这是一个强大的HTTP客户端库,支持静态(同步)和异步HTTP请求,并且自动处理连接和线程池,因此可以更方便地发送请求和处理响应。
  2. response = httpx.get('https://news.ycombinator.com'): 这行代码通过httpx库的get方法向"https://news.ycombinator.com"发送了一个HTTP GET请求,并将响应存储在了变量response中。HTTP GET请求是HTTP协议的一个方法,它用于请求服务器上指定资源的数据(在这种情况下,资源是网站的HTML内容)。
  3. status_code = response.status_code: 这行代码获取了HTTP响应的状态码并将其存储在变量status_code中。HTTP状态码是服务器在响应中返回的一个三位数字,它表示了请求的处理情况,比如200表示请求成功,404表示请求的资源找不到。
  4. html = response.text: 这行代码从响应中提取了HTML文本并将其存储在变量html中。可以通过response.text获取响应的文本。
  5. print(status_code): 这行代码在控制台上输出状态码。
  6. print(html[:200]): 这行代码在控制台上输出HTML内容的前200个字符。在Python字符串中,使用[a:b]可以截取字符串的一部分,此处是从头截取到第200个字符。

利用 AsyncIO 的 HTTPX 异步代码示例

import asyncio
import httpxasync def main() -> None:async with httpx.AsyncClient() as client:response = await client.get('https://news.ycombinator.com')status_code = response.status_codehtml = response.textprint(status_code)print(html[:200])  # print first 200 characters of htmlif __name__ == '__main__':asyncio.run(main())
  1. import asyncio, httpx:这行代码导入了Python的asynciohttpx模块。asyncio是Python的一个用于编写单线程并发代码的库,使用事件循环驱动的协程。httpx是一个强大的,支持同步或异步的请求的HTTP库。
  2. async def main() -> None::异步定义函数main(), 这是一个协程函数,用async def来声明。差异是异步函数在调用时不会立即执行,而是返回一个协程对象。
  3. async with httpx.AsyncClient() as client::此行代码创建了httpx.AsyncClient()的上下文管理器,该客户端支持与服务器建立持久连接,重用SSL会话,并在全局范围内提供HTTP / 2和连接池。
  4. response = await client.get('https://news.ycombinator.com')await关键字用于等待协程的完成。在这里,我们在异步客户端上运行get方法并等待响应。这样就不必等待服务器的响应,我们的程序可以在此期间执行其他任务。
  5. status_code = response.status_codehtml = response.text:这两行代码跟上述代码解析相同,获取响应的状态码和消息
  6. print(response.status_code)print(html):同样跟上述解析相同,打印状态码和获取到的网页内容的前200个字符。
  7. if __name__ == '__main__':asyncio.run(main()):如果Python文件以模块方式被别的文件调用时,其__name__为模块名,而如果单独执行这个文件的话,__name__的值就是'__main__'。此处asyncio.run(main())是异步I/O的一个关键步骤,他可以并发执行任务,提高整体代码的执行效率。

HTTPX的特性

  1. HTTP/1.1和HTTP/2的支持:HTTP/2可以更快地加载网页,因为它允许在一个连接上处理多个请求和响应。这并非异步编程,而是连接复用。
  2. 用于同步代码和异步代码的客户端接口:"httpx"有两种客户端:httpx.Client用于同步代码,httpx.AsyncClient用于异步代码。
  3. 请求内容的直接序列化/反序列化:Requests库需要手动序列化或反序列化JSON内容,而"HTTPX"可以直接处理。

参考链接:https://blog.apify.com/web-scraping-python/#preparing-python-coding-environment-for-web-scraping

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ubuntu下分屏工具tmux常用操作
  • Java基础的语法---String
  • Xed编辑器开发第三期:使用Rust从0到1写一个文本编辑器
  • python-找出四位数中的玫瑰花数
  • CSDN 访问量增加脚本
  • java单元测试:编写可测试性好的代码
  • 【机器学习论文阅读笔记】Robust Recovery of Subspace Structures by Low-Rank Representation
  • 嵌入式学习——3——域套接字UNIX
  • 如何在go语言中调用c语言代码
  • CTF-web-攻防世界-3
  • IT廉连看——UniApp——事件绑定
  • 使用FFmpeg推流实现在B站24小时点歌直播
  • 电路仿真软件:点亮教学新篇章,十大便利助力高效学习
  • -FIT5197
  • 基于Kafka的日志采集
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 10个确保微服务与容器安全的最佳实践
  • 2017前端实习生面试总结
  • CAP 一致性协议及应用解析
  • PermissionScope Swift4 兼容问题
  • Vue ES6 Jade Scss Webpack Gulp
  • 笨办法学C 练习34:动态数组
  • 浮现式设计
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 机器学习学习笔记一
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端之Sass/Scss实战笔记
  • 微信小程序开发问题汇总
  • 一道面试题引发的“血案”
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • - 转 Ext2.0 form使用实例
  • 06-01 点餐小程序前台界面搭建
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • # include “ “ 和 # include < >两者的区别
  • #define、const、typedef的差别
  • #Z2294. 打印树的直径
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #在 README.md 中生成项目目录结构
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (ZT)一个美国文科博士的YardLife
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)Controller接口控制器详解(三)
  • (转)http协议
  • (转)创业家杂志:UCWEB天使第一步
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .CSS-hover 的解释
  • .NET Core 中的路径问题
  • .net FrameWork简介,数组,枚举
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • /var/spool/postfix/maildrop 下有大量文件
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [20180224]expdp query 写法问题.txt