6
社区成员
发帖
与我相关
我的任务
分享如今,每个人都想要您的数据,因此如果您想开设新帐户、参加促销活动或获取免费电子书,则必须填写包含您的信息的表格。
如果您只执行一次,这不是一个大问题,但如果您必须经常重复相同的过程,它就会变得单调,因此理想的答案是使用 Python 🐍实现自动化。
让我们使用 Python 自动填写 Web 表单。我们将首先了解如何使用 Python 列表中的数据填写表单,然后我将向您展示如何制作虚假数据来填写多个表单。
为了使用 Python 自动化 Web 表单,我们将利用 Selenium 库。要安装它,请按照以下步骤操作。
本书中涵盖的所有 Selenium 方法都可以在我的 Automation Cheatsheet(免费 PDF)中找到。
打开终端并键入以下命令来安装 Selenium。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>pip install selenium
</code></span></span>
这将安装 Selenium 4,这是我们将在本教程中使用的版本。
然后我们必须获取chromedriver:
让我们开始导入将用于此自动化的库。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time
</code></span></span>
然后我们创建一个pathchromedriver 文件,即我们想要自动化的网站,以及一个driver允许我们使用 Selenium 与网站进行通信的文件。
网站:对于这个简单的演示,我们将使用 Google 表单中的“联系信息”模板。
确保复制链接。
如果链接损坏或停止工作,请转到 Google 表单并使用下面的模板使用您自己的链接创建您自己的表单。
注意:如果您创建自己的表单,请确保取消选中或关闭“设置”中的“限制为 1 个回复”选项,以便我们可以填写任意数量的表单。
以下是我们为开始使用 Selenium 所做的变量。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>path = '/Users/.../chromedriver' # paste your path here
service = Service(executable_path=path)
website = 'https://forms.gle/GRgxTrG8FfXUCLE99' # paste your link
driver = webdriver.Chrome(service=service)
</code></span></span>
之后,我们使用该driver.get()功能使用Selenium打开网站。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>driver.get(website)
</code></span></span>
我们还添加等待或延迟,以允许网页加载所有信息。为此,我们导入该time模块。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>import time
time.sleep(3) # 3 seconds delay
</code></span></span>
代码现在应该如下所示:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time
import pandas as pd
path = '/Users/.../chromedriver' # your path
service = Service(executable_path=path)
website = # your link
driver = webdriver.Chrome(service=service)
driver.get(website)
time.sleep(3)
</code></span></span>
要使用Selenium填写信息,我们必须首先检查网站。
检查“名称”字段。为此,右键单击网页第一个块中的任何空白部分,然后选择“检查”。
所有最新的网络浏览器都提供此选项。它将在屏幕右侧打开开发人员工具窗口。
您看到的是网站的 HTML 内容。
无论您的计算机上突出显示哪个元素,我们都将使用带有data-params属性名称的元素,因为它包含我们正在查找的字段名称(例如,姓名、电子邮件、地址、电话号码、评论)。
现在让我们为“ Name ”字段创建 XPath 。XPath 的语法如下:
此外,我们将使用该contains()函数,因此我们的 XPath 将是:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>//div[contains(@data-params, "Name")]
</code></span></span>
我们现在必须检查占位符“您的答案”所在的字段。
与其他网站不同,Google 表单保持不一致的模式,其中某些字段(例如“电子邮件”)具有标签<input>,而其他字段(例如“地址”)具有标签<textarea>。
动图
带有“您的答案”占位符的字段的最终 XPath将与带有<input>和<textarea>标签的字段不同。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>//div[contains(@data-params, "Name")]//textarea //div[contains(@data-params, "Name")]//input
</code></span></span>
为了连接它们,我们将使用“或”条件|
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>//div[contains<span style="color:var(--syntax-error-color)">(</span>@data-params, <span style="color:var(--syntax-string-color)">"Name"</span><span style="color:var(--syntax-error-color)">)]</span>//textarea | //div[contains<span style="color:var(--syntax-error-color)">(</span>@data-params, <span style="color:var(--syntax-string-color)">"Name"</span><span style="color:var(--syntax-error-color)">)]</span>//input
</code></span></span>
为了填写数据,我们将使用.find_element和.send_keys函数。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>text_input = driver.find_element(by='xpath',
value='//div[contains(@data-params, "Name")]//textarea | '
'//div[contains(@data-params, "Name")]//input')
text_input.send_keys("Write your text here")
</code></span></span>
还有其他 Python 工具,例如faker,可以帮助我们生成假数据(我将在最后向您展示 faker 是如何工作的),但为了简单起见,让我们自己在列表中构造数据,然后将其存储在字典中。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>fields = ['Name', 'Email', 'Address', 'Phone number', 'Comments']
data = ['Frank', 'frank@example.com', '123 St', '987654321', 'Hello World']
my_form = dict(zip(fields, data))
</code></span></span>
为了将这些数据填充到我们表单的所有字段中,我们在 for 循环中使用.find_element和函数。.send_keys
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">for </span>field, data <span style="color:var(--syntax-declaration-color)">in </span>my_form.items<span style="color:var(--syntax-error-color)">()</span>:
text_input <span style="color:var(--syntax-error-color)">=</span> driver.find_element<span style="color:var(--syntax-error-color)">(</span><span style="color:var(--syntax-text-color)">by</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">'xpath'</span>,
<span style="color:var(--syntax-text-color)">value</span><span style="color:var(--syntax-error-color)">=</span>f<span style="color:var(--syntax-string-color)">'//div[contains(@data-params, "{field}")]//textarea | '</span>
f<span style="color:var(--syntax-string-color)">'//div[contains(@data-params, "{field}")]//input'</span><span style="color:var(--syntax-error-color)">)</span>
text_input.send_keys<span style="color:var(--syntax-error-color)">(</span>data<span style="color:var(--syntax-error-color)">)</span>
</code></span></span>
我们快完成了。接下来,我们必须单击“提交”按钮。
.click使用 Selenium,我们在使用该方法实际单击“提交”按钮之前检查按钮以生成其 XPath 。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>submit_button = driver.find_element(by='xpath',
value='//div[@role="button"]//span[text()="Submit"]')
submit_button.click()
</code></span></span>
注意:如果您将浏览器设置为另一种语言,则属性内的值text()很可能采用该语言。例如,因为我的浏览器是西班牙语,所以我必须将 XPath 的一部分更改为//span[text()="Enviar"].
这是我们到目前为止编写的代码。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time
path = '/Users/.../chromedriver' # your path goes here
service = Service(executable_path=path)
website = # your link goes here
driver = webdriver.Chrome(service=service)
fields = ['Name', 'Email', 'Address', 'Phone number', 'Comments']
data = ['Frank', 'frank@example.com', '123 St', '987654321', 'Hello World']
my_form = dict(zip(fields, data))
driver.get(website)
time.sleep(3)
for field, data in my_form.items():
text_input = driver.find_element(by='xpath',
value=f'//div[contains(@data-params, "{field}")]//textarea | '
f'//div[contains(@data-params, "{field}")]//input')
text_input.send_keys(data)
submit_button = driver.find_element(by='xpath', value='//div[@role="button"]//span[text()="Submit"]')
submit_button.click()
time.sleep(1)
driver.quit()
</code></span></span>
耶!👏 恭喜您,您现在了解了如何使用 🐍 自动填写网页表单。
现在,您可以更进一步,提交数百份包含虚构数据的表单。
现在您已经了解了基础知识,您可以跳到下面视频的第 13:26 分钟,了解如何使用 Python 生成虚构数据并提交数百个表单。
有关使用数据自动提交表格的更多信息和详细视频,请单击此处。
这就是今天的全部内容!👋