我试图从一个网站上获取一些信息,但没有成功。
问题是,只有在单击某个按钮后才会显示数据。
jquery - 如何抓取由按钮锁定的数据?-LMLPHP
我想要的信息位于此标记中:

<div id="frmContact" class="contactForm hidden"></div>
<div class="btn btn-secondary viewnumber phone-trigger" data-ga-action="header">
    <a href="#" rel="nofollow">Ver telefone</a>
    <i class="icon"></i>
</div>

可能跟这句话有关:
<form action="/noindex/doctor-phone" id="frmPhone" method="post"><input name="__RequestVerificationToken" type="hidden" value="3uFb11EKzbTh4TWoqXk025U7jS7QoV5-od7lSgSBzdu616u82jQAHiOTl2aB3q47aRCIg2CjVCjE6R6bUAqDplAOfeM1" /><input id="entityKey" name="entityKey" type="hidden" value="12898671" /><input id="placeType" name="placeType" type="hidden" value="" /><input id="placeKey" name="placeKey" type="hidden" value="" /></form>    <div id="phonePlacer"></div>

但我不知道如何正确使用这个。
我是否必须使用此信息向服务器发送request以获取电话信息?如果是,怎么做?
单击按钮后,将出现弹出窗口(我对info1到info4感兴趣):
jquery - 如何抓取由按钮锁定的数据?-LMLPHP
我的代码:
page = BeautifulSoup(urllib2.urlopen('http://www.doctoralia.com.br/medico/RANDOM_PROFILE'), "html.parser")
hidden_tags = page.find_all("input", type="hidden")

for tag in hidden_tags:
    print tag

输出:
<input name="__RequestVerificationToken" type="hidden" value="gPYstKvmi4xBQsV81ECf5mYe695igvq8E2QqtOgBPqtRybEP74OEbSAe8uDg8dlZCpqib94FIrUoPMnpLTC0tY7kiJE1"/>
<input id="entityKey" name="entityKey" type="hidden" value="14336768"/>
<input id="placeType" name="placeType" type="hidden" value=""/>
<input id="placeKey" name="placeKey" type="hidden" value=""/>

最佳答案

使用requests.Session对象非常简单,您只需要从初始页和几段表单数据中提取__RequestVerificationToken标记。我使用完整列表的页面来获取号码和医生页面的链接,相同的逻辑适用于您决定从以下位置获取号码的任何位置:

from bs4 import BeautifulSoup
import requests
from urlparse import urljoin

head = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"}

base = "http://www.doctoralia.com.br/"

with requests.Session() as s:
    r = s.get('http://www.doctoralia.com.br/medicos/especialidade/dermatologistas-1314')
    page = BeautifulSoup(r.content, "html.parser")
    token = page.select_one("input[name=__RequestVerificationToken]"["value"])
    hidden_tags = page.select("article.media.doctor")
    for tag in hidden_tags:
        h3 = tag.select_one("h3")
        key = h3.a["data-track-click"]
        place = tag.select_one("span[data-location]")["data-location"].split("|", 1)[0]

       data = {"__RequestVerificationToken": token,
            "entityKey": key,
            "placeKey": place}
        resp = s.post("http://www.doctoralia.com.br/noindex/doctor-phone", data=data, headers=head)
        soup = BeautifulSoup(resp.content,"html.parser")
        print(urljoin(base,h3.a["href"]))
        print(soup.select_one("li.phone").text.strip())

这将获得每个医生的所有链接和电话号码,当您单击按钮时在弹出窗口中看到的任何内容都可以解析。基本形态数据为__RequestVerificationTokenentityKeyplaceKey似乎对post没有影响,但也没有伤害。在这种情况下,头部也不是必需的,但是添加用户代理总是一个好主意。您可能需要在请求之间添加睡眠,以便在发出大量请求时不会损坏服务器。同时查看robots.txt:
User-agent: *
Disallow: /noindex/
Disallow: /usuarios/
Disallow: /users/
Disallow: /utilisateurs/
Disallow: /utenti/
Disallow: /gebruikers/
Disallow: /nutzer/
Disallow: /medical-center/m/
Disallow: /consultant/m/
Disallow: /centro-medico/m/
Disallow: /medico/m/
Disallow: /centre-medical/m/
Disallow: /medicin/m/
Disallow: /centro-medico/m/
Disallow: /medico/m/
Disallow: /centri-medici/m/
Disallow: /medecin/m/
Disallow: /healthpro/m/
Disallow: /facharzt/m/
Disallow: /sanit�tszentrum/m/
Disallow: /clickfav/
Disallow: /clicktlf/
Disallow: /reservas/
Disallow: /citas/
Disallow: /medisch-centrum/m/
Disallow: /deskundige/m/
Disallow: /arzt/m/
Disallow: /klinik/m/
Disallow: /citas/
Disallow: /turnos/
Disallow: /appuntamenti/
Disallow: /appointments/
Disallow: /consultas/
Disallow: /ws/Schedules.asmx/
Disallow: /RESOURCE NOT FOUND/
Disallow: /RESOURCE+NOT+FOUND/
Disallow: /RESOURCE%20NOT%20FOUND/
Disallow: /entities/

没有用户代理限制,而且您正在删除的内容也不被禁止

关于jquery - 如何抓取由按钮锁定的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38190635/

10-11 19:24
查看更多