使用Python登录、导航和检索代理背后的数据

2024-06-17 05:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望,通过python脚本,能够登录一个网站并检索一些数据。这是我公司的委托书。在

我知道这个问题似乎是你可以在搜索中找到的其他问题的复制品,但事实并非如此

我已经试过在回答这些问题时使用建议的解决方案,但它们都不起作用。。。我不仅需要一段代码来登录和获得一个特定的网页,还需要一些“概念”背后的所有机制如何运作。在

以下是我想做的事情的描述:

登录网站>;进入第X页>;以某种形式插入第X页的数据,然后按“计算”按钮>;捕获我的查询结果

一旦我有了结果,我将看看如何对数据进行排序。在

我如何在代理之后实现这一点?每次我尝试使用“请求”库登录时,它都不起作用说我无法获取页面X,因为我没有进行身份验证。。。或者更糟糕的是,我甚至无法到达那一边,因为我以前没有设置代理。在


Tags: 数据代码gt脚本概念网页代理网站
1条回答
网友
1楼 · 发布于 2024-06-17 05:19:17

要求澄清

首先,确保您了解获取计算结果的上下文

(F12将在Chrome中显示DevTools或Firefox中显示Firebug,您可以从中了解下面讨论的大部分细节)

  • 您是否管理从目标页面访问web浏览器?在
  • 真的需要使用代理吗?如果是,则在浏览器中测试它,并准确地记下要使用的代理
  • 访问目标web应用程序必须使用哪种身份验证。选项是“基本”、“摘要”或一些定制的,需要填写一些表格,在cookies中有一些内容等
  • 当您在浏览器中访问计算表单时,按“计算”按钮是否会导致可见的HTTP请求?是邮政吗?请求的内容是什么?在

基于简单HTTP的场景

很有可能,您的情况将允许使用简单的HTTP通信。我将假设以下情况:

  • 使用代理,并且您知道使用代理的url和可能的用户名和密码
  • 目标web应用程序上的所有页面都需要基本身份验证或摘要身份验证。在
  • 计算按钮使用的是经典的HTML表单,结果在httppost请求中包含所有数据,见表单参数。在

复杂:浏览器模拟场景

有些情况下,获得结果所需的交互部分依赖于JavaScript代码在页面上执行某些操作。通常,通过调查什么是最终的HTTP请求,可以将其转换为HTTP场景,但在这里,我将假设这是不可行或不可能的,我们将使用真实的浏览器进行仿真。在

对于这个场景,我假设:

  • 您可以在web浏览器中执行所需的所有信息
    • 代理url
    • 代理用户名和密码(如果需要)
    • 登录的url
    • 用户名和密码填写一些登录表单进入
    • 知道“在哪里跟随”登录后到达您的计算表
  • 你可以找到足够的关于每个页面元素的信息来使用(表单填充,按钮按下等等),比如它的名称,id,或者其他一些东西,这将允许你在模拟的时候瞄准它。在

解析基于HTTP的方案

Python提供了优秀的requests包,可以满足我们的需求:

代理人

aa在http://10.10.1.10:3128使用代理,用户名为user,密码为pass

import requests
proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}
#ready for `req = requests.get(url, proxies=proxies)`

基本身份验证

假设web应用允许用户appuser和密码apppass进行访问

^{pr2}$

或者使用显式的基本身份验证

from requests.auth import HTTPBasicAuth
url = "http://example.com/path"
auth = HTTPBasicAuth("appuser", "apppass")
req = requests.get(url, auth=auth)

摘要式身份验证的区别只是类名为HTTPDigestAuth

Other authentication methods are documentedat请求页。在

HTML表单的HTTP POST

import requests
a = 4
b = 5
data = {"a": a, "b": b}
url = "http://example.com/formaction/url"
req = requests.post(url, data=data)

注意,这个url不是表单的url,而是当您按下submit按钮时所采取的“操作”的url。在

一起

用户通常分两步进入最终的HTML表单,首先登录,然后导航到表单。在

然而,web应用程序通常允许(在了解url表单的情况下)直接访问。这将在同一步骤执行身份验证,如下所述。在

注意:如果这不起作用,您将不得不使用requests的会话,这是可能的,但我将不在这里详细说明。在

import request
from requests.auth import HTTPBasicAuth
proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}
auth = HTTPBasicAuth("appuser", "apppass")
a = 4
b = 5
data = {"a": a, "b": b}
url = "http://example.com/formaction/url"
req = requests.post(url, data=data, proxies=proxies, auth=auth)

现在,您将通过req获得您的结果,您就完成了。在

解决浏览器模拟场景

代理人

Selenimum doc for configuring proxy建议在web浏览器中配置代理。同一个链接提供了有关如何从脚本中设置代理的详细信息,但是这里我假设,您使用了Firefox,并且已经(在手动测试期间)成功地配置了代理。在

基本或摘要身份验证

以下修改的snippet由Mimi源于SO answer,使用基本身份验证:

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.set_preference('network.http.phishy-userpass-length', 255)
driver = webdriver.Firefox(firefox_profile=profile)
driver.get("https://appuser:apppass@somewebsite.com/")

注意,Selenium似乎没有为基本/摘要式身份验证提供完整的解决方案,上面的示例很可能可以工作,但是如果不行,您可以检查这个Selenium Developer Activity Google Group thread并看到,您并不孤单。有些解决方案可能对你有用。在

摘要式身份验证的情况似乎比基本身份验证更糟糕,有些人报告AutoIT成功或盲目发送密钥,上面提到的讨论显示了一些尝试。在

通过登录表单验证

如果web站点允许通过以某种形式输入凭据来登录,那么您可能是幸运的,因为使用Selenium这是一项相当简单的任务。欲了解更多信息,请参阅下一章填写表格。在

填写表格并提交

与身份验证不同,在表单中填充数据、单击按钮和类似的活动是Selenium工作得很好的地方。在

from selenium import webdriver

a = 4
b = 5
url = "http://example.com/form"
# formactionurl = "http://example.com/formaction/url" # this is not relevant in Selenium

# Start up Firefox
browser = webdriver.Firefox()

# Assume, you get somehow authenticated now
# You might succeed with Basic Authentication by using url = "http://appuser:apppass@example.com/form

# Navigate to your url
browser.get(url)

# find the element that's id is param_a and fill it in
inputElement = browser.find_element_by_id("param_a")
inputElement.send_keys(str(a))
# repeat for "b"
inputElement = browser.find_element_by_id("param_b")
inputElement.send_keys(str(b))

# submit the form (if having problems, try to set inputElement to the Submit button)
inputElement.submit()

time.sleep(10) # wait 10 seconds (better methods can be used)

page_text = browser.page_source
# now you have what you asked for
browser.quit()

结论

所提供的信息以相当笼统的方式描述了要做什么,但缺乏具体细节,这将允许提供量身定制的解决方案。这就是为什么这个答案侧重于提出一般方法。在

有两种情况,一种是基于HTTP的bing,另一种是使用仿真浏览器。在

HTTP解决方案是更好的,尽管事实上,它需要在搜索时有更多的准备,要使用哪些HTTP请求。最大的优点是,它在生产中速度更快,需要更少的内存,并且应该更健壮。在

在极少数情况下,当浏览器中有一些必要的JavaScript活动时,我们可以使用浏览器仿真解决方案。但是,这要设置得复杂得多,并且在身份验证步骤中存在重大问题。在

相关问题 更多 >