首页 > 解决方案 > 使用 Python 登录后抓取 ASPX,但每次登录都会为您提供不同的 URL

问题描述

我正在尝试从我的大学网站获取班级中每个卷号的考试结果数据。

通常您可以使用登录信息发布 url ( www.example.com/login.aspx ),并在登录后获取一个固定的 url ( www.example.com/home.aspx )。

但是我试图获取的页面对于每个卷号都有不同的 URL。进入。登录页面的 URL 如下所示:“www.example.com/View.aspx”。登录后,结果页面的 URL 类似于:“www.example.com/ovengine.aspx?enc=BunchOfNumbersandAlphabets”。这些数字和字母对于每个卷号都是不同的。

所以我不能在我的代码中输入一个 URL 来获得最终结果。我不知道如何获取登录后自动出现的页面,而无需提及它的 URL。

标签: pythonasp.netweb-scrapingbeautifulsouppython-requests

解决方案


但是我试图获取的页面对于每个卷号都有不同的 URL。进入

不,是同一个网址,而且网址有参数。您一直在 URL 中看到这一点。

因此,对于温度站点,它可能看起来像

www.TheWeatherSite.com/?City=Rome

因此,上述 URL 始终相同,但网站“city”参数是针对罗马市的。因此,后面的 web 代码可以在后面的代码中使用/get/grab/consume 该参数。这样我们就不会为每个城市的每个天气创建一个网页。

因此,您创建一个页面,然后将网页传递给后面的代码可以使用和使用的城市值。(比如从数据库中查询城市的温度数据=上述值)。

因此,您必须提前知道您想要哪个城市的天气。当然,这种方法很棒,因为您不必创建新的网站页面来显示/显示给定城市的天气。

您实际上是将一个值传递给将运行的某些代码,并使用该传递的值。

您的示例 URL 也是如此。您注意到有一个名为“enc”的参数。

因此,后面的网站代码将:

抓取、获取、设置用户 ID。但是,用户 ID 将来自安全系统和身份验证提供程序。除非您以该特定用户身份登录,否则您不会获得该用户 ID。

所以,两者都是一个用户ID(仅限于内部代码)。并且需要“enc”值作为您拥有的 URL 中的参数。

因此,请注意在上面的 sql 中,我们很可能需要一个 studentID 和另一个页面的一些其他代码从数据库中获取/获取的“enc”值。

现在有趣的“GUID”(请用谷歌搜索什么是 GUID),从程序员的角度来看,从数​​据库中提取这一行数据就足够了,但是在查询中还使用用户登录的内部 ID?

那么,只有给定的登录用户才能看到属于他们自己的一组值。

换句话说?

只有醉酒的失业牛仔竞技表演小丑才需要该 GUID 来提取该数据。如果是这种情况,那么任何用户都可以输入该 GUID 并查看其他人的标记。但是,使用 GUID 有“一些”安全性,因为用户永远猜不到该值。

如果他们像我的第一个 URL 和参数示例一样使用“城市”?那么是的,您可以猜测并知道要输入的城市值。或者他们可以使用学生姓名,甚至学生编号 - 您可以相对轻松地猜测这些值。

但是,对于这样的数据,毫无疑问,用户采用了比数据库中的行号或 PK id 等起始数字更困难的东西。那么,当代码将结果添加到该表时呢?他们还添加了某种类型的 GUID,并将其保存为数据库中的一行。

因此,您不仅需要 GUID,而且该 URL 仅适用于给定的一对值。(学生 ID - 仅在代码内部并从经过身份验证的提供者中提取。就是这行代码:

= Membership.GetUser.ProviderUserKey

因此,上述值将成为用户登录内部 ID。

Web URL 中作为参数的 enc(外部)公开值,以及内部登录值。所以(asp.net)背后的代码看起来像这样:

    Dim strSQL As String
    strSQL = "SELECT * from tblStudentMarks where StudentID = @pID " &
             " AND TestResultsGID = @GID"

    Dim cmdSQL As New SqlCommand(strSQL, GetCon)

    cmdSQL.Parameters.Add("@pID", SqlDbType.Int).Value = Membership.GetUser.ProviderUserKey
    cmdSQL.Parameters.Add("@GID", SqlDbType.VarChar).Value = Request.QueryString("enc")
    Dim dReader As New SqlDataAdapter(cmdSQL)

    Dim rstData As DataTable
    dReader.Fill(rstData)

注意代码:

Request.QueryString("enc")

这允许后面的代码从 URL 获取/获取参数 (enc)。但是,正如我所说,这里只需要“enc”数字是不可能的。可能只需要这个值来从行中提取数据,但这将是一个打开谷仓门大小的安全漏洞。

想想你的网上银行。

www.mybank.com/?CustomerNumber=1234

好吧,如果我们只是使用上面的 CustomerNumber 作为提取银行数据的手段,那么我可以去网站输入你的号码,或者其他人的号码。

那么,为了这个工作?您将需要获取一个 enc 值列表(那个凌乱有趣的长字符串)。如果没有该参数,您将无法在 URL 中设置参数。

但是,正如我所说,您很可能还需要一些不包含在公开公开 URL 中的内部“用户”登录 ID,以便还从数据库中获取该行数据。

而且,更重要的是?除非您以经过身份验证的用户身份登录,否则通常无法点击此类网页。换句话说,该网页只会发送给已登录的用户 - 如果您未登录,那么除非您已登录用户,否则服务器安全性将自动不发送该网页。

因此,要使其工作,您需要联系网站开发人员,并获取“enc”值列表。获得该列表后,您可以生成一些代码来处理该列表并在 URL 中插入正确的参数。但是,您还需要询问该 URL 和参数值是否仅适用于登录用户,或者该 URL 和参数是否仅适用于给定的登录用户。如果没有这些值,并且不知道 URL 和参数是否适用于任何用户?(我怀疑它会),那么仅仅使用 URL 来获取这些值是行不通的。

让网站人员创建一个您可以调用的 Web 服务会更好,并且在一个命令中它会返回您需要的所有数据,而不是一遍又一遍地发送“enc”值,这反正你没有。


推荐阅读