我试图从一个网站上获取一些信息,但没有成功。
问题是,只有在单击某个按钮后才会显示数据。
我想要的信息位于此标记中:
<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感兴趣):
我的代码:
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())
这将获得每个医生的所有链接和电话号码,当您单击按钮时在弹出窗口中看到的任何内容都可以解析。基本形态数据为
__RequestVerificationToken
和entityKey
,placeKey
似乎对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/