使用Python的POST请求如何使Web抓取更容易?

译文
开发 开发工具
某些情况下,使用POST请求与Web页面进行交互是更好的选择。

【51CTO.com快译】当使用Python抓取一个网站时,通常使用urllib或Requests库向服务器发送GET请求以接收其信息。

然而,在接收所需数据之前,需要你向网站发送一些信息,这可能是因为必须执行登录或以某种方式与页面交互。

[[408135]]

为了执行这样的交互,Selenium是一个常用的工具。然而,它也有一些缺点,因为它有点慢,有时也很不稳定。另一种方法是发送一个POST请求包含网站需要使用请求库的信息。

实际上,与Requests相比,Selenium变得非常慢,是因为它实际上要完成打开浏览器浏览收集数据的网站的整个工作。而对于某些其他情况,POST请求可能是更好的选择,这使它成为Web抓取的重要工具之一。

在本文中,将简要介绍POST方法,以及如何使用它改进Web抓取程序。

Web 抓取

尽管POST请求通常用于与API交互,但它们也有助于在网站中填写HTML表单或自动执行其他操作。

在Web抓取过程中,能够执行这些任务是一项重要的能力,因为在获取数据之前必须与Web页面进行交互是很常见的流程。

识别HTML表单

在开始向网站发送信息之前,首先需要了解它将如何接收这些信息。假设你的想法是登录你的账户。

如果是这种情况,您需要做的就是在POST请求中发送用户名和密码。

但是,如何识别并查看HTML表单的外观呢?这时我们可以考虑使用我们的老朋友:GET请求。使用GET并使用BeautifulSoup解析HTML,很容易看到页面上的所有HTML表单以及它们的外观。

代码如下所示: 

import requests
from bs4 import BeautifulSoup
page = requests.get('http://website.com').text
soup = BeautifulSoup(page, 'html.parser')
forms = soup.find_all('form')
for form in forms:
print(form)

这就是我们简单的登录表单,它将成为上面代码的输出: 

<form action="login.html" method="post">
User Name: <input name="username" type="text"/><br/>
Password: <input name="password" type="text"/><br/>
<input id="submit" type="submit" value="Submit"/>
</form>

在这样的表单中,“动作”是网站中你应该发送请求的地方,而“用户名”和“密码”是你想要填写的字段。您还可以注意到,这些值的类型被指定为文本。

提交你的第一个 POST

现在是发送第一个POST请求。基本请求将包含两个参数:接收请求的URL和发送的数据。

数据通常是一个字典,其中键是要填充的字段名,值是要填充的字段内容。数据也可以通过不同的方式传递,但这是一种更复杂的方法,超出了本文的范围。

代码也非常简单,只需两行就可以实现: 

payload = {'username': 'user', 'password': '1234'}
r = requests.post('http://website.com/login.html', data=payload)
print(r.status_code)

第三行代码只是为了查看请求的状态代码。如果看到的状态代码是200,则意味着一切正常。

现在,我们可以通过将刚才创建的POST请求实现到函数中。下面是它的工作原理:

1. post_request函数将接收两个参数:URL和发送请求的有效负载。

2. 在函数内部,我们将使用一个 try 和 except 子句让代码准备好处理可能的错误。

3. 如果代码没有崩溃并且我们收到了来自服务器的响应,我们将检查这个响应是否是我们期望的响应。如果是,函数将返回它。

4. 如果我们得到不同的状态码,将不返回任何内容,状态将被打印出来。

5. 如果代码引发异常,我们希望看到发生了什么,因此该函数将打印该异常。

示例代码如下: 

def post_request(url, payload):
try:
r = requests.post(url, data=payload)
if r.status_code == 200:
return r
else:
print(r.status_code)
except Exception as e:
print(e)

然而,根据网站的不同,为了实际执行登录,还需要处理其他问题。好消息是,Requests库提供了处理cookie、HTTP身份验证等更多内容的资源。这里的目标只是使用一种常见的表单类型作为一个简单的例子,让未使用过POST请求的人能够理解。

最后

特别是如果你向特定网站发送大量请求,你可能希望在代码中插入一些随机暂停,以免在整个代码中使用更多的try和except子句使服务器过载。而不仅仅是在 post_request函数中以确保它已准备好处理可能在此过程中发现的其他异常。

当然,利用代理提供商来确保代码在还需要提交请求和收集数据的情况下继续运行,以及确保连接受到保护,也是一个很好的实践。

本文的目的只是介绍POST请求以及它们如何在Web上收集数据。我们基本上学习了如何自动填写表单,甚至如何登录一个网站。

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】


责任编辑:黄显东 来源: hackernoon.com
相关推荐

2018-02-25 12:19:02

2014-12-29 10:11:44

Docke联合文件系统AUFS

2020-02-11 12:35:19

Kubernetes容器

2019-09-23 10:59:31

机器学习算法编程

2019-09-23 11:17:46

机器学习数据技术

2019-07-09 10:57:04

云计算无服务器计算开发

2023-03-13 14:26:00

人工智能首席信息官疫情

2023-02-28 14:50:02

人工智能首席信息官

2017-11-14 08:27:32

云中数据存储

2022-05-19 09:53:05

机器学习人工智能算法

2010-03-12 19:03:48

Python 拼写检查

2021-01-14 10:48:05

技术RPCRS

2021-06-07 17:10:07

区块链出入口控制物联网

2024-04-11 11:37:25

人工智能机器学习自动化流程

2019-08-05 09:39:05

2022-06-17 09:47:04

Linux命令

2022-10-11 15:18:41

NodeJSCookie

2017-09-04 18:05:54

Palette色彩贴合

2021-07-19 19:44:57

技术模型实践

2015-11-06 14:41:30

微软Windows 10
点赞
收藏

51CTO技术栈公众号