Python 网页抓取 - 基于表单的网站

在上一章中,我们看到了抓取动态网站。 在本章中,让我们了解抓取基于用户输入的网站,即基于表单的网站。


简介

如今,WWW(万维网)正朝着社交媒体和用户生成内容的方向发展。 那么问题来了,我们如何访问登录屏幕之外的此类信息? 为此,我们需要处理表单和登录。

在前面的章节中,我们使用 HTTP GET 方法来请求信息,但在本章中,我们将使用 HTTP POST 方法将信息推送到 Web 服务器以进行存储和分析。


与登录表单交互

在 Internet 上工作时,您一定与登录表单进行过多次交互。 它们可能非常简单,比如只包含很少的 HTML 字段、一个提交按钮和一个操作页面,或者它们可能很复杂,并且有一些额外的字段,比如电子邮件,出于安全原因的验证码消息。

在本节中,我们将借助 Python 请求库处理一个简单的提交表单。

首先我们需要导入requests库如下 −

import requests

现在,我们需要为登录表单的字段提供信息。

parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}

在下一行代码中,我们需要提供表单操作将触发的 URL。

r = requests.post(“enter the URL”, data = parameters)
print(r.text)

运行脚本后,会返回发生动作的页面内容。

假设如果你想用表单提交图像,那么使用 requests.post() 就非常容易了。 您可以借助以下 Python 脚本来理解它 −

import requests
file = {‘Uploadfile’: open(’C:\Usres\desktop\123.png’,‘rb’)}
r = requests.post(“enter the URL”, files = file)
print(r.text)

从 Web 服务器加载 Cookie

Cookie 有时称为网络 cookie 或互联网 cookie,是从网站发送的一小段数据,我们的计算机将其存储在网络浏览器内的文件中。

在处理登录表单的上下文中,cookie 可以有两种类型。 第一,我们在上一节中讨论过,它允许我们向网站提交信息,第二,它让我们在访问网站的整个过程中保持永久的"登录"状态。 对于第二种形式,网站使用 cookie 来跟踪谁登录了,谁没有登录。

cookie 有什么作用?

现在大多数网站都使用 cookie 进行跟踪。 我们可以通过以下步骤了解 cookie 的工作原理 −

第 1 步 − 首先,该网站将验证我们的登录凭据并将其存储在我们浏览器的 cookie 中。 此 cookie 通常包含服务器生成的令牌、超时和跟踪信息。

第 2 步 − 接下来,该网站将使用 cookie 作为身份验证的证明。 每当我们访问该网站时,始终会显示此身份验证。

Cookie 对于网络抓取工具来说是个大问题,因为如果网络抓取工具不跟踪 cookie,提交的表单将被发回,在下一页似乎他们从未登录过。借助 Python requests 库可以很容易地跟踪 cookie,如下所示 −

import requests
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
r = requests.post(“enter the URL”, data = parameters)

在上面的代码行中,URL 将是充当登录表单处理器的页面。

print(‘The cookie is:’)
print(r.cookies.get_dict())
print(r.text)

运行上述脚本后,我们将从上次请求的结果中检索 cookie。

Cookie 还有一个问题,有时网站会在没有警告的情况下频繁修改 Cookie。 这种情况可以用requests.Session()来处理,如下 −

import requests
session = requests.Session()
parameters = {‘Name’:’Enter your name’, ‘Email-id’:’Your Emailid’,’Message’:’Type your message here’}
r = session.post(“enter the URL”, data = parameters)

在上面的代码行中,URL 将是充当登录表单处理器的页面。

print(‘The cookie is:’)
print(r.cookies.get_dict())
print(r.text)

观察一下,您可以轻松理解带会话和不带会话的脚本之间的区别。


使用 Python 自动化表单

在本节中,我们将处理一个名为 Mechanize 的 Python 模块,它将减少我们的工作并自动完成表格填写过程。

Mechanize 模块

Mechanize 模块为我们提供了一个与表单交互的高级接口。 在开始使用它之前,我们需要使用以下命令安装它 −

pip install mechanize

请注意,它仅适用于 Python 2.x。

示例

在这个例子中,我们将自动填写一个包含两个字段的登录表单,即 email 和 password −

import mechanize
brwsr = mechanize.Browser()
brwsr.open(Enter the URL of login)
brwsr.select_form(nr = 0)
brwsr['email'] = ‘Enter email’
brwsr['password'] = ‘Enter password’
response = brwsr.submit()
brwsr.submit()

上面的代码非常容易理解。 首先,我们导入了 mechanize 模块。 然后创建了一个 Mechanize 浏览器对象。 然后,我们导航到登录 URL 并选择表单。 之后,名称和值被直接传递给浏览器对象。