使用python填写网站文本框,点击按钮下载
Using python to fill in text boxes on websites, and clicking button to download
如果给定一个网站,例如http://www.barchart.com/historicaldata.php,有没有办法填写文本框然后点击提交按钮下载数据?
我习惯于使用 urllib
下载整个页面,但似乎可以从我的脚本中找出如何将文本提交到文本框中然后单击按钮。
我能想到的路径有两条:
硒
可以使用名为 Selenium Webdriver
的强大库直接模拟填充数据和单击按钮
使用 Selenium,您可以打开程序化浏览器会话并执行用户会执行的各种操作。与 ghost browser 相结合,这可以在后台以独立于浏览器的方式完成(如果这将在服务器上 运行 而没有安装 chrome 则很有用)。
虽然 Selenium 是一个很棒的库(非常适合测试网页),但它需要学习很多东西。如果您特别想要执行填写和单击操作,则需要它。但我认为可能有一种更简单的方法可以使用 Python 请求来完成您想要做的事情。
请求
Python的请求库是另一个从页面请求数据的库。您可以使用它来提交 GET 请求(浏览器在访问该页面时将执行的操作)或 POST 请求(浏览器在您单击提交后将其表单数据发送到的位置)。
要了解您要向哪些字段发送数据,请查看每个表单字段的页面 HTML,然后获取 "name" 属性。
如果不是因为您的内容似乎是付费墙这一事实,您可以很轻松地完成此操作。例如,假设您的表单有 3 个字段要填写,名称属性由 'start_date'、'end_date' 和 'type' 组成。您可以通过以下方式完成此操作:
import requests
url = "http://www.barchart.com/historicaldata.php/"
r = requests.post(url, data = {
'item1': 'one of the form fields',
'color': 'green',
'location': 'Boston, MA',
...
}
)
with open("~~DESIRED FILE LOCATION~~", "wb") as code:
code.write(r.content)
由于付费专区,您必须先登录并保留该会话数据。我将如何做到这一点的解释推迟到 this excellent answer
编辑:
关于您应该将数据提交到何处,可能还需要注意一件事。 url 您应提交 POST 数据的位置可能与您提供的条形图 url 相同,但也可能不同。要找出答案,请查看 HTML 表单对象本身的 "action" 属性。 10 次中有 9 次是提交数据的地方。如果该站点使用 Javascript 做了一些奇怪的事情,您可能需要打开一个控制台并检查提交时数据发送到的确切位置。但是那座桥可以过 if/when 需要。
如果给定一个网站,例如http://www.barchart.com/historicaldata.php,有没有办法填写文本框然后点击提交按钮下载数据?
我习惯于使用 urllib
下载整个页面,但似乎可以从我的脚本中找出如何将文本提交到文本框中然后单击按钮。
我能想到的路径有两条:
硒
可以使用名为 Selenium Webdriver
的强大库直接模拟填充数据和单击按钮使用 Selenium,您可以打开程序化浏览器会话并执行用户会执行的各种操作。与 ghost browser 相结合,这可以在后台以独立于浏览器的方式完成(如果这将在服务器上 运行 而没有安装 chrome 则很有用)。
虽然 Selenium 是一个很棒的库(非常适合测试网页),但它需要学习很多东西。如果您特别想要执行填写和单击操作,则需要它。但我认为可能有一种更简单的方法可以使用 Python 请求来完成您想要做的事情。
请求
Python的请求库是另一个从页面请求数据的库。您可以使用它来提交 GET 请求(浏览器在访问该页面时将执行的操作)或 POST 请求(浏览器在您单击提交后将其表单数据发送到的位置)。
要了解您要向哪些字段发送数据,请查看每个表单字段的页面 HTML,然后获取 "name" 属性。
如果不是因为您的内容似乎是付费墙这一事实,您可以很轻松地完成此操作。例如,假设您的表单有 3 个字段要填写,名称属性由 'start_date'、'end_date' 和 'type' 组成。您可以通过以下方式完成此操作:
import requests
url = "http://www.barchart.com/historicaldata.php/"
r = requests.post(url, data = {
'item1': 'one of the form fields',
'color': 'green',
'location': 'Boston, MA',
...
}
)
with open("~~DESIRED FILE LOCATION~~", "wb") as code:
code.write(r.content)
由于付费专区,您必须先登录并保留该会话数据。我将如何做到这一点的解释推迟到 this excellent answer
编辑: 关于您应该将数据提交到何处,可能还需要注意一件事。 url 您应提交 POST 数据的位置可能与您提供的条形图 url 相同,但也可能不同。要找出答案,请查看 HTML 表单对象本身的 "action" 属性。 10 次中有 9 次是提交数据的地方。如果该站点使用 Javascript 做了一些奇怪的事情,您可能需要打开一个控制台并检查提交时数据发送到的确切位置。但是那座桥可以过 if/when 需要。