2016-07-04 17 views
2

我試圖從網站獲取一些信息,但沒有成功。如何刮取按鈕鎖定的數據?

問題是隻有在點擊某個按鈕後才顯示數據。

first_page

,我想就設在這個標籤中的信息:

<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> 

但我不知道如何正確使用這個__RequestVerificationToken


我一定要送request使用這種信息獲取手機信息的服務器?如果是這樣,怎麼樣?

我點擊該按鈕後,這是出現的彈出(我感興趣的INFO1到信息4):

enter image description here

我的代碼:

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=""/> 

回答

1

這是非常簡單的使用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()) 

,讓你所有的鏈接和電話號碼每個醫生,當你點擊按鈕時你在彈出窗口中看到的任何東西都可以解析。基本形式的數據是__RequestVerificationTokenentityKey,placeKey似乎不影響後,但包括它沒有傷害。在這種情況下,頭文件也不是必需的,但是再次添加用戶代理程序並不總是一個好主意。您可能希望在請求之間添加睡眠,以便在發出大量請求時不要敲擊服務器。也看着機器人。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/ 

沒有用戶代理限制和你所刮不禁止

2

正如你所看到的,當使用谷歌瀏覽器的開發工具在「網絡」標籤中,它發送一個POST請求到http://www.doctoralia.com.br/noindex/doctor-phone。此POST請求受到CSRF保護,因此要獲取數據很難僞造此請求。

由於BeautifulSoup是一個HTML 解析器。您無法真正與網頁互動。如果你真的想獲得數據。您應該使用像selenium這樣的工具來模擬真實的瀏覽器。

請記住,數據不受保護只是爲了繞過。他們可能不希望數據被刮掉,這樣做可能是非法的。

+0

偉大的答案...簡明扼要又涵蓋了所有問題 – charlietfl