Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python从网站获取数据_Python_Python 3.x_Web - Fatal编程技术网

使用Python从网站获取数据

使用Python从网站获取数据,python,python-3.x,web,Python,Python 3.x,Web,我想知道我是否可以通过提供一些特定的输入来使用python从网站获取数据。 我知道我应该写一些代码,但在这里我从零开始,有点困惑,希望你能理解 说明: 这是我们大学的网站: 我想通过网站上的程序点击第一个链接 下载/查看2016年11月B.Tech V学期的成绩-定期考试 然后下一页有一个输入注册号的选项,因为我知道注册号,我可以将它分配给一个变量。 在这里我想得到多个学生的结果,这是本课程的主要目的 例如:从12153600到12153660的结果应该从网站上逐个检索 最后一件事是,如果我能

我想知道我是否可以通过提供一些特定的输入来使用python从网站获取数据。 我知道我应该写一些代码,但在这里我从零开始,有点困惑,希望你能理解

说明:

这是我们大学的网站:

我想通过网站上的程序点击第一个链接

下载/查看2016年11月B.Tech V学期的成绩-定期考试

然后下一页有一个输入注册号的选项,因为我知道注册号,我可以将它分配给一个变量。 在这里我想得到多个学生的结果,这是本课程的主要目的

例如:从12153600到12153660的结果应该从网站上逐个检索

最后一件事是,如果我能得到结果,我能把它转换成PDF格式吗?如果可能,我可以将所有这些结果转换为一个单独的PDF文件作为不同的页面吗?

您应该查看python库

使用该库,您将能够实现您想要的。具体来说,您可以使用Selenium的get函数获取您的网站,使用Selenium的click函数单击第一个链接,等等


许多研究人员使用它来模拟网站(如Facebook)上的点击事件并收集结果数据。

您应该检查请求模块以从Html获取数据

PFB用于教程目的的链接:


您可以使用Python的
请求
库发送请求,并
美化组
解析您收到的html

首先,您需要使用浏览器的开发工具检查页面。如果这样做,您将发现每个链接行都是一个
表单
元素-

<form id="myForm0121x1" action="..." method="post">
<input name="month" value="..." type="hidden">
<input name="year" value="..." type="hidden">
<input name="sem" value="..." type="hidden">
<input name="reg_type" value="..." type="hidden">
<input name="dn" value="..." type="hidden">
<input name="status1" value="..." type="hidden">
</form>

如果您随后选中
r.content
,则您将已收到该文件的来源。对此页面再次重复上述过程,这次相应地更改数据参数的键/值(使用inspector),并添加额外的
'regno':'xyz'
(其中xyz=注册号),您将收到学生结果页面的最终html内容。使用
BeautifulSoup
解析此内容,并选择您需要的任何内容。

以下是我对网站的观察:

  • 该网站使用表单显示学生的结果
  • 表单url是
    http://exam.cusat.ac.in/erp5/cusat/CUSAT-RESULT/Result_Declaration/display_sup_result
  • 表单方法是POST
  • 传递到url的数据包括注册号、学位名称、学期、年份、结果类型
  • 因此,您需要使用上述参数将post请求提升到url。您可以在简单的python和请求中实现这一点

    import requests # to make requests.
    import pdfkit # for saving as pdf
    url="http://exam.cusat.ac.in/erp5/cusat/CUSAT-RESULT/Result_Declaration/display_sup_result" #form url
    pdfs=[]
    payload={ "deg_name":"B.Tech", "semester":"5", "month":"November", "year":"2016", "result_type":"Regular" }
    option={'quiet': ''}
    for i in range(12153600,12153660+1):
        payload.update({"regno":str(i)})
        response=requests.post(url,data=payload)
        pdfkit.from_string(response.content,str(i)+".pdf",options=option) #saves to 12153600.pdf - 12153660.pdf files
        open("result_"+str(i)+".html","w").write(response.content) #This will save results from roll no 12153600 - 12153660 in result_rollno.html files.
    
    这将创建60个单独的pdf文件

    要将响应保存为pdf文件,可以使用
    pdfkit

    参考我想让你把pdf保存部分作为实际操作。因此,我将跳过另存为pdf部分。如果您发现很难在python中将数据保存为pdf格式,您可以在google上搜索。我更喜欢这样做,因为它接受一个列表作为输入/文件,这样您就可以将所有响应添加到一个列表中,并使用它创建一个pdf文件。

    为什么您想要60个不同学生连续60个注册号的结果?实际上它是用于数据处理…@MaxPowerThis可能更适合作为注释。你给他们指出了正确的方向,但没有真正回答问题。BeautifulSoup是一个很好的方法。我还使用BeautifulSoup进行爬网过程首先非常感谢@Mani..这是我想要的东西…但我仍然有一些问题。。我使用了pdfkit,但所需的输出不是精确的形式。。。获得的输出格式不正确,即使结果html页面没有css文件。。。当我从结果页面单击“打印到PDF”时,它将正确对齐,而使用pdfkit时,它不会。。请帮帮我…你能看看这个问题吗@Mani我在我的电脑中再次检查了它,它工作正常。您是否使用安装页面中提到的
    apt get
    安装了webkit?实际上我使用的是mac。。目前我的问题是pdf文件不是我想要的。。看到这个链接,我需要的是一个输出PDF文件作为第一个屏幕截图,而我目前收到的PDF文件作为第二个屏幕截图。我没有mac来执行和检查代码,但在我的pc中它工作正常。检查如何安装webkit,我认为它应该有问题。
    import requests # to make requests.
    import pdfkit # for saving as pdf
    url="http://exam.cusat.ac.in/erp5/cusat/CUSAT-RESULT/Result_Declaration/display_sup_result" #form url
    pdfs=[]
    payload={ "deg_name":"B.Tech", "semester":"5", "month":"November", "year":"2016", "result_type":"Regular" }
    option={'quiet': ''}
    for i in range(12153600,12153660+1):
        payload.update({"regno":str(i)})
        response=requests.post(url,data=payload)
        pdfkit.from_string(response.content,str(i)+".pdf",options=option) #saves to 12153600.pdf - 12153660.pdf files
        open("result_"+str(i)+".html","w").write(response.content) #This will save results from roll no 12153600 - 12153660 in result_rollno.html files.