首页 > 解决方案 > 通过AJAX请求在python中抓取动态数据表

问题描述

我想在 python 中实现一个演示后端脚本,以便通过 URL 抓取文档路径列表。如果我尝试使用 urllib.request 处理基本请求,它不会返回数据表的内容。它只是返回一个空内容,如下所示。因此,在这种情况下,可能会使用 AJAX 请求捕获数据表的内容。示例代码取自实际网站的主页(实际页面)。我认为这里的主要问题可能是象征性的。如何处理 python 端以捕获动态数据表的内容?

我在python端写的代码(Current python code)无法处理这个请求,返回“页面因不活动而过期”。

有什么建议,方向吗?

当前的python代码:

from requests import Session
session = Session()
session.head("mainpage")
response = session.post(
    url= 'apiurl/getviewdatatable',
    data= {
        'name' : 'name',
        'documentPath' : 'documentPath',
    }           
)

print(response.text)

实际页面:主页

<script>
        $(document).ready(function () {
            $('#posts').DataTable({
                "processing": true,
                "serverSide": true,
                "ajax": {
                    "url": "apiurl/getviewdatatable",
                    "dataType": "json",
                    "type": "POST",
                    "data": {
                        _token: "5uC8cmrJRYnn2gB4TCU9EFj0wjgA8BtmqqO64Uk1",
                    }
                },
                "columns": [
                                            {
                        "data": "name"
                    },
                                        {
                        "data": "documentPath"
                    },

                ],
                'createdRow': function (row, data, index) {
                    //
                    // if the second column cell is blank apply special formatting
                    //
                    $(row).addClass('table-row');

                },
                "language": {
                    "url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Turkish.json"
                },
                "rowReorder":{
                    selector:'td:nth-child(2)'
                },
            });
        });
</script>

标签: pythonjsonajaxweb-scrapingdatatable

解决方案


您的 python 发布请求参数有问题。

首先让我解释一下实际页面在做什么。有一个表组件,它是数据表库的一部分

在此页面中,数据表充满了 ajax 源。ajax 调用由数据表库内部脚本处理。您可以在此链接中查看数据表的 ajax 源示例页面https://datatables.net/examples/ajax/objects.html

但是这里在你的代码中 ajax 调用更详细。但是即使这样你也可以根据上面链接中的示例来理解不是ajax调用的参数。这是 POST ajax 调用的参数部分

"data": {
    _token: "5uC8cmrJRYnn2gB4TCU9EFj0wjgA8BtmqqO64Uk1",
 }

因此,当您向此 apiurl 发送发布请求时,您必须发送与要抓取的页面相同的发布请求

这是使用 python 的正确发布请求:

from requests import Session
session = Session()
session.head("mainpage")
response = session.post(
    url= 'apiurl/getviewdatatable',
    data= {
        '_token' : '5uC8cmrJRYnn2gB4TCU9EFj0wjgA8BtmqqO64Uk1'
    }           
)

print(response.text)

推荐阅读