我试图使用Python从此页面中查看信息:https://j2c-com.com/Euronaval14/catalogueWeb/catalogue.php?lang=gb。我特别感兴趣的是您点击个别参展商名称时出现的弹出窗口。具有挑战性的部分是它使用了很多JavaScript来使AJAX调用来加载数据。从AJAX onclick上刮掉内容弹出
我检查一下参展商在网络电话,看来,AJAX调用进入到这个网址(第一个参展商列表中,“AIAD和MOD ITALY”):https://j2c-com.com/Euronaval14/catalogueWeb/ajaxSociete.php?cle=D000365D000365&rnd=0.005115277832373977
我了解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
你能帮助我明白,我怎么能成功占领弹出数据,或者是我米做错了吗?提前致谢!
感谢您的帮助! – Abundnce10 2014-09-27 21:45:25
看起来我很快就说话了。我尝试过使用requests.session(),但是当我浏览URL参数中的每个唯一cle值时,它只发回第一个参展商的数据(上面的HTML)。如果你从上面的代码中删除'break',当你在'trs:'循环中进行转换时,你会得到一个不同的结果吗? – Abundnce10 2014-09-30 03:20:43
@ Abundnce10不接受答案有点不对,因为答案有助于解决您遇到的最初问题。无论如何,这是一个有趣的挑战 - 请参阅答案的UPD部分。谢谢。 – alecxe 2014-09-30 03:36:15