2014-09-27 6 views
1

Я пытаюсь просмотреть информацию с этой страницы с помощью Python: https://j2c-com.com/Euronaval14/catalogueWeb/catalogue.php?lang=gb. Меня особенно интересует всплывающее окно, которое происходит, когда вы нажимаете на имя отдельного участника выставки. Сложная часть - это использование большого количества JavaScript для вызова AJAX для загрузки данных.Извлечение содержимого из всплывающего окна AJAX onclick

Я рассмотрел сетевые вызовы при нажатии на экспонент и, кажется, что вызов AJAX идет к этому URL (для первого экспонента в списке «AIAD и MOD ИТАЛИИ»): https://j2c-com.com/Euronaval14/catalogueWeb/ajaxSociete.php?cle=D000365D000365&rnd=0.005115277832373977

I понять, где параметр cle исходит из (id с тегом <span>), однако я не совсем понял, где находится параметр rnd. Это просто случайное число? Я попытался предоставить случайное число с каждым запросом, но возвращенный html не содержит фактического содержимого всплывающего окна.

Это приводит меня к мысли, что либо атрибут rnd не является случайным числом, либо мне нужен какой-либо тип cookie, чтобы фактические данные попадали в запрос.

Вот мой код до сих пор, я использую запросы и BeautifulSoup для разбора HTML:

import random 
import decimal 
import requests 
from bs4 import BeautifulSoup 

#base_url = 'https://j2c-com.com/Euronaval14/catalogueWeb/catalogue.php?lang=gb' 
base_url = 'https://j2c-com.com/Euronaval14/catalogueWeb/cataloguerecherche.php?listeFavoris=&typeRecherche=1&typeRechSociete=&typeSociete=&typeMarque=&typeDescriptif=&typeActivite=&choixSociete=&choixPays=&choixActivite=&choixAgent=&choixPavillon=&choixZoneExpo=&langue=gb&rnd=0.1410133063327521' 


def generate_random_number(i,d): 
    "Produce a random between 0 and 1, with 16 decimal digits" 
    return str(decimal.Decimal('%d.%d' % (random.randint(0,i),random.randint(0,d)))) 



r = requests.get(base_url) 
soup = BeautifulSoup(r.text) 

table = soup.find('table', {'id':'tableResultat'}) 

trs = table.findAll('tr') 


for tr in trs: 
    span = tr.find('span') 
    cle = span.get('id') 

    url = 'https://j2c-com.com/Euronaval14/catalogueWeb/ajaxSociete.php?cle=' + cle + '&rnd=' + generate_random_number(0,9999999999999999) 
    pop = requests.post(url) 

    print url 
    print pop.text 

    break 

Можете ли вы помочь мне понять, как я могу успешно захватить всплывающие данные, или то, что я» Неправильно? Спасибо заранее!

ответ

2

Речь идет не о параметре rnd. Он полностью случайный и заполняется функцией Math.random() js.

Как вы подозревали, это примерно cookies. PHPSESSID cookie имеет решающее значение для каждого последующего запроса. Просто начните requests.Session() и использовать его для каждого запроса вы делаете:

Объект Session позволяет сохраняться определенные параметры по запросов. Он также сохраняет файлы cookie во всех запросах, сделанных из экземпляра сеанса .

... 

# start session 
session = requests.Session() 

r = session.get(base_url) 
soup = BeautifulSoup(r.text) 

table = soup.find('table', {'id':'tableResultat'}) 
trs = table.findAll('tr') 

for tr in trs: 
    span = tr.find('span') 
    cle = span.get('id') 

    url = 'https://j2c-com.com/Euronaval14/catalogueWeb/ajaxSociete.php?cle=' + cle + '&rnd=' + generate_random_number(0,9999999999999999) 
    pop = session.post(url) # <-- the POST request here contains cookies returned by the first GET call 

    print url 
    print pop.text 

    break 

Он печатает (см HTML заполняется необходимыми данными):

https://j2c-com.com/Euronaval14/catalogueWeb/ajaxSociete.php?cle=D000365D000365&rnd=0.1625497943120751 
<table class='divAdresse'> 
    <tr> 
     <td class='ficheAdresse' valign='top'>Via Nazionale 54<br>IT-00184 - Roma<br><img 
       src='../../intranetJ2C/images/flags/IT.gif' style='margin-right:5px;'>ITALY<br><br>Phone: +39 06 488 
      0247 | Fax: +39 06 482 74 76<br><br>Website: <a href='http://www.aiad.it' target='_new'>www.aiad.it</a></td> 
    </tr> 
</table> 
<br> 
<b class="divMarque">Contact:</b><br> 
<font class="ficheAdresse"> Carlo Festucci - Secretary General<br> 
<a href="mailto:[email protected]">[email protected]</a></font> 
<br><br> 
<div id='divTexte' class='ficheTexte'></div> 

UPD.

Причина, по которой вы не получили результаты для других участников в таблице, трудно объяснить, но главное здесь - имитировать все последующие вызовы ajax, вызываемые под капотом, когда вы нажимаете на строку в браузере :

import random 
import decimal 
import requests 
from bs4 import BeautifulSoup 

base_url = 'https://j2c-com.com/Euronaval14/catalogueWeb/cataloguerecherche.php?listeFavoris=&typeRecherche=1&typeRechSociete=&typeSociete=&typeMarque=&typeDescriptif=&typeActivite=&choixSociete=&choixPays=&choixActivite=&choixAgent=&choixPavillon=&choixZoneExpo=&langue=gb&rnd=0.1410133063327521' 
fiche_url = 'https://j2c-com.com/Euronaval14/catalogueWeb/fiche.php' 
reload_url = 'https://j2c-com.com/Euronaval14/catalogueWeb/reload.php' 
data_url = 'https://j2c-com.com/Euronaval14/catalogueWeb/ajaxSociete.php' 


def generate_random_number(i,d): 
    "Produce a random between 0 and 1, with 16 decimal digits" 
    return str(decimal.Decimal('%d.%d' % (random.randint(0, i),random.randint(0, d)))) 


# start session 
session = requests.Session() 

r = session.get(base_url) 
soup = BeautifulSoup(r.content) 
for span in soup.select('table#tableResultat tr span'): 
    cle = span.get('id') 

    session.post(reload_url) 
    session.post(fiche_url, data={'page': 'page:catalogue', 
            'pasFavori': '1', 
            'listeFavoris': '', 
            'cle': cle, 
            'stand': '', 
            'rnd': generate_random_number(0, 9999999999999999)}) 
    session.post(reload_url) 
    pop = session.post(data_url, data={'cle': cle, 
             'rnd': generate_random_number(0, 9999999999999999)}) 

    print pop.text 

Печать:

<table class='divAdresse'><tr><td class='ficheAdresse' valign='top'>Via Nazionale 54<br>IT-00184 - Roma<br><img src='../../intranetJ2C/images/flags/IT.gif' style='margin-right:5px;'>ITALY<br><br>Phone: +39 06 488 0247 | Fax: +39 06 482 74 76<br><br>Website: <a href='http://www.aiad.it' target='_new'>www.aiad.it</a></td></tr></table><br><b class="divMarque">Contact:</b><br><font class="ficheAdresse"> Carlo Festucci - Secretary General<br><a href="mailto:[email protected]">[email protected]</a></font><br><br><div id='divTexte' class='ficheTexte'></div> 
<table class='divAdresse'><tr><td class='ficheAdresse' valign='top'>An der Faehre 2<br>27809 - Lemwerder<br><img src='../../intranetJ2C/images/flags/DE.gif' style='margin-right:5px;'>GERMANY<br><br>Phone: +49 421 673 30 | Fax: +49 421 673 3115<br><br>Website: <a href='http://www.abeking.com' target='_new'>www.abeking.com</a></td></tr></table><br><b class="divMarque">Contact:</b><br><font class="ficheAdresse"> Thomas Haake - Sales Director Navy</font><br><br><div id='divTexte' class='ficheTexte'></div> 
<table class='divAdresse'><tr><td class='ficheAdresse' valign='top'>Mohamed Bin Khalifa Street (street 15)<br>PO Box 107241<br>107241 - Abu Dhabi<br><img src='../../intranetJ2C/images/flags/AE.gif' style='margin-right:5px;'>UNITED ARAB EMIRATES<br><br>Phone: +971 2 445 5551 | Fax: +971 2 445 0644</td></tr></table><br><b class="divMarque">Contact:</b><br><font class="ficheAdresse"> Pierre Baz - Business Development<br><a href="mailto:[email protected]">[email protected]</a></font><br><br><div id='divTexte' class='ficheTexte'></div> 
... 
+0

Спасибо за помощь! – Abundnce10

+0

Похоже, я говорил слишком рано. Я попытался использовать request.session(), но по мере того как я прошел через каждое уникальное значение cle в параметрах URL, он отправил только первые данные экспонента (HTML выше). Если вы удалите 'break' из моего кода выше, вы получите другой результат по мере прохождения цикла' for tr in trs: '? – Abundnce10

+0

@ Abundnce10 неприемлемый ответ был немного неправильным, так как ответ помог решить начальную проблему, которую вы имели. В любом случае, это была интересная задача - см. Раздел ответа UPD. Благодарю. – alecxe

Смежные вопросы