当前位置: 首页 > 科技观察

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

时间:2023-03-13 05:28:21 科技观察

【.com速译】在使用Python抓取网站时,通常使用urllib或者Requests库向服务器发送GET请求来接收其信息。但是,在接收所需数据之前,您需要向网站发送一些信息,这可能是因为您必须执行登录或以某种方式与页面交互。要执行此类交互,Selenium是一种常用的工具。但是,它有一些缺点,因为它有点慢而且有时不稳定。另一种方法是发送一个POST请求,其中包含网站使用请求库所需的信息。事实上,与Requests相比,Selenium变得非常慢,因为它实际上完成了打开浏览器以浏览收集数据的站点的全部工作。而对于其他一些情况,POST请求可能是更好的选择,这使其成为网络抓取的重要工具之一。在本文中,我们将简要介绍POST方法以及如何使用它来改进网页抓取程序。网页抓取虽然POST请求通常用于与API交互,但它们也可用于填写HTML表单或自动执行网站中的其他操作。能够执行这些任务是网络抓取期间的一项重要功能,因为在获取数据之前必须与网页进行交互是一个常见的过程。识别HTML表单在开始向您的网站发送信息之前,您首先需要了解它将如何接收该信息。假设您的想法是登录您的帐户。如果是这种情况,您需要做的就是在POST请求中发送用户名和密码。但是您如何识别和查看HTML表单的外观呢?此时我们可以考虑使用我们的老朋友:GET请求。使用GET并用BeautifulSoup解析HTML,很容易看到页面上的所有HTML表单以及它们的外观。代码如下所示:forminforms:print(form)这是我们简单的登录表单,它将是上面代码的输出:UserName:
密码:
在这样的表单中,“action”是你应该在网站中发送请求的地方,“username”和“password”是你要填写的字段。你还可以注意到这些值的类型指定为文本。提交您的第一个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.如果代码抛出异常,我们想看看发生了什么,所以函数会打印那个异常。示例代码如下:defpost_request(url,payload):try:r=requests.post(url,data=payload)ifr.status_code==200:returnrelse:print(r.status_code)exceptExceptionase:print(e)但是,根据网站的不同,还需要处理其他问题才能实际执行登录。好消息是Requests库提供了处理cookie、HTTP身份验证等资源。这里的目的只是用一个常见的表单类型作为一个简单的例子,让没有用过POST请求的人也能看懂。最后,特别是如果您要向特定网站发送大量请求,您可能希望在代码中插入一些随机暂停,这样您就不会在整个代码中使用更多的try和except子句使服务器过载。而不仅仅是在post_request函数中,以确保它已准备好处理它可能在此过程中捕获的其他异常。当然,利用代理提供程序来确保代码继续运行,同时仍然需要提交请求和收集数据,并确保连接受到保护也是一种很好的做法。本文的目的只是介绍POST请求以及它们如何在Web上收集数据。我们基本上学会了如何自动填写表格,甚至学会了如何登录网站。【翻译稿件,合作网站转载请注明原译者和出处.com】