Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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 如何刮取X秒后加载的网页?_Python - Fatal编程技术网

Python 如何刮取X秒后加载的网页?

Python 如何刮取X秒后加载的网页?,python,Python,我对Python还是新手,我在这里搜索了很多类似的请求,但是没有一个能帮助我处理这个特定的网站。如果你看到下面的代码,你会看到我必须实际拉页面,但我所做的任何事情,以加载这个特定的部分(类头loc),其中的名称,电话号码等将不起作用。我尝试过使用selenium和WebDriverWait等方法。不走运 import requests from bs4 import BeautifulSoup URL = 'https://www.qualitycheck.org/quality-report

我对Python还是新手,我在这里搜索了很多类似的请求,但是没有一个能帮助我处理这个特定的网站。如果你看到下面的代码,你会看到我必须实际拉页面,但我所做的任何事情,以加载这个特定的部分(类头loc),其中的名称,电话号码等将不起作用。我尝试过使用selenium和WebDriverWait等方法。不走运

import requests
from bs4 import BeautifulSoup

URL = 'https://www.qualitycheck.org/quality-report/?service=Behavioral%20Health%2CChemical%20Dependency&ajax=1&json=1&callback=jQuery110205938799402161818_1589391496145&_=1589391496146&bsnid=21'
response = requests.get(URL)
soup = BeautifulSoup(response.text, 'lxml')
directory = soup.find_all('div', class_="head-loc")

# results = soup.find(id='head-loc')
print(soup.prettify())
在一天结束的时候,一旦我弄清楚如何等待这些内容加载并抓取它,那么我将需要做一些事情,根据最后的ID对所有URL进行迭代。但是,现在我首先需要弄清楚如何获取这些内容

感谢您的帮助

import requests
import time
from bs4 import BeautifulSoup

URL = 'https://www.qualitycheck.org/quality-report/?service=Behavioral%20Health%2CChemical%20Dependency&ajax=1&json=1&callback=jQuery110205938799402161818_1589391496145&_=1589391496146&bsnid=21'
response = requests.get(URL)
time.sleep(amount)
soup = BeautifulSoup(response.text, 'lxml')
directory = soup.find_all('div', class_="head-loc")

# results = soup.find(id='head-loc')
print(soup.prettify())

更改
amount
您希望程序等待的时间(秒)

此页面使用javascript在页面上加载数据

BeautifulSoup不执行javascript,您得到的只是原始HTML页面,类似于从浏览器中选择“查看源代码”时得到的页面

您可以使用WebDriver引导实际浏览器运行javascript,并等待特定元素出现,也可以查看该页面的源代码并查看如下所示的各种javascript部分:

/* <![CDATA[ */
$(document).ready(function () {

    if (BaseModule.getQueryVariable("print") == 'y') {
        $("#divDemographicInfoLoading").hide();
        $("#divDemographicInfo").hide();
        return;
    }

    var data = new FormData();
    data.append("f", "GetDemographicInfo");
    data.append("bsnId", "21");

    $.ajax({
        type: "POST",
        url: "/ajax/QualityReport/ajax.aspx",
        contentType: false,
        processData: false,
        data: data,
        dataType: 'json',
        success: function (o) {
            if (o.ResponseHtml == '') {
                $(".NoDemographicInfo").html('<h4>Quality Report not available</h4>');
                $("#divDemographicInfoLoading").hide();
                $(".QualityReportControl").hide();
            } else {
                $("#divDemographicInfoLoading").hide();
                $("#divDemographicInfo").html(o.ResponseHtml);
            }
        }
    });
});
/* ]]> */
看起来有点吓人,但也没那么糟糕:数据二进制部分只是一个边界(
---webkitformboundarytdwzptc3arprvrs
),将两个由多部分组成的表单元素分隔开来,如下所示:

Content-Disposition: form-data; name="f"

GetDemographicInfo
f
是您感兴趣的信息的名称,
bsnId
似乎是特定医疗服务的Id,在本例中为21

结果是:

{
    "Success":true,
    "ResponseHtml":
        "<div class=\"mod no-bottom-padding\">\r\n<div class=\"qr-head-logo\">\r\n<div><img src='/assets/1/6/content-icon-gold-seal.png' alt='Gold Seal' /></div>\r\n</div>\r\n<div class=\"qr-head-mod\">\r\n<div class=\"head-name\">\r\nNortheast Ohio Neighborhood Health Services, Inc.           \r\n</div>\r\n<div class=\"head-loc\">\r\nHCO ID: 21<br>\r\n         4800 Payne Avenue                                           <br>\r\n         Cleveland, OH, 44103     <br>\r\n         (216) 231-7700<br>\r\n<a target='_blank' href='http://www.neonhealth.org'>www.neonhealth.org</a>\r\n    </div>\r\n    </div>\r\n</div>\r\n"
}
{
“成功”:没错,
“ResponseHtml”:
“\r\n\r\n\r\n\r\n\r\n\r\n俄亥俄州东北邻里健康服务有限公司。\r\n\r\n\r\nHCO ID:21
\r\n佩恩大道4800
\r\n俄亥俄州克利夫兰44103
\r\n(216)231-7700
\r\n\r\n\r\n\r\n\r\n\n\r\n\r\n\r\n” }
一旦格式正确,就会生成以下html:

<div class=\"mod no-bottom-padding\">
<div class=\"qr-head-logo\">
<div><img src='/assets/1/6/content-icon-gold-seal.png' alt='Gold Seal' /></div>
</div>
<div class=\"qr-head-mod\">
<div class=\"head-name\">
Northeast Ohio Neighborhood Health Services, Inc.           
</div>
<div class=\"head-loc\">
HCO ID: 21<br>
         4800 Payne Avenue                                           <br>
         Cleveland, OH, 44103     <br>
         (216) 231-7700<br>
<a target='_blank' href='http://www.neonhealth.org'>www.neonhealth.org</a>
    </div>
    </div>
</div>

东北俄亥俄邻里健康服务公司。
HCO ID:21
佩恩大道4800号
克利夫兰,俄亥俄州,44103
(216)231-7700

这会让你得到你想要的东西。

时间。睡眠(n)
?把它放在
response
soup
@Johnny之间,你希望它能实现什么?内容是由javascript加载的。beautifulsoup不执行javascript。等待是没有用的。我喜欢你说的,但有些事情让我不知所措。我是Python新手,通常都是编码。因此,在您的示例中,您只是跳过拉取页面,而只是查询ajaxurl以获取它将在页面上生成的数据?我需要仔细阅读一下。是的。我查看了页面源代码,然后使用chromedev工具的“network”选项卡查看到底加载了什么。这个页面基本上是一个空的shell,它使用ajax调用加载内容,因此您可以自己简单地进行这些调用(在我的示例中,我使用curl,但您可以使用beautifulsoup来实现这一点,并解析生成的html)
<div class=\"mod no-bottom-padding\">
<div class=\"qr-head-logo\">
<div><img src='/assets/1/6/content-icon-gold-seal.png' alt='Gold Seal' /></div>
</div>
<div class=\"qr-head-mod\">
<div class=\"head-name\">
Northeast Ohio Neighborhood Health Services, Inc.           
</div>
<div class=\"head-loc\">
HCO ID: 21<br>
         4800 Payne Avenue                                           <br>
         Cleveland, OH, 44103     <br>
         (216) 231-7700<br>
<a target='_blank' href='http://www.neonhealth.org'>www.neonhealth.org</a>
    </div>
    </div>
</div>