【问题标题】:How to scrape a hidden table with beautifulsoup如何用 Beautifulsoup 刮一张隐藏的桌子
【发布时间】:2019-08-23 04:37:57
【问题描述】:

这是关于用beautifulsoup 刮一个隐藏的表格。

正如您在this website 中看到的,有一个“choisissez votre séance”按钮,当我们单击它时,将显示一个表格。

当我点击检查表格元素时,我可以看到包含价格等属性的标签。但是,当我查看网站的源代码时,却找不到这个信息。

我认为表格'display : none'的代码中有一些影响这一点,但我找不到解决方案。

【问题讨论】:

  • 我没有看到任何带有该文本的按钮。相反,我看到一个带有此文本的按钮 Choisissez vos places sur le plan
  • BS即使有display:none也可以获取元素,但是如果被JavaScript加载则无法获取元素

标签: python web-scraping beautifulsoup screen-scraping


【解决方案1】:

页面似乎正在使用 AJAX 并在后台加载数据以进行定价。使用 Chrome,我按 F12 并在网络选项卡下查看。当我点击“choisissez votre séance”按钮时,我注意到这个地址有一个 POST:

'https://www.ticketmaster.fr/fr/manifestation/holiday-on-ice-billet/idmanif/446304'

这对您来说是个好消息,因为您不需要抓取 HTML 数据,您只需向 API 提供 ID(在页面源中)。

在下面的代码中我是

  1. 请求初始页面
  2. 收集 cookie
  3. 发布我们收集的 ID(数据)和 cookie
  4. 返回进一步处理所需的 JSON 数据(变量 J)

希望以下内容对您有所帮助!

干杯, 亚当


import requests
from bs4 import BeautifulSoup

h = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
s = requests.session()

initial_page_request = s.get('https://www.ticketmaster.fr/fr/manifestation/holiday-on-ice-billet/idmanif/446304',headers=h)

soup = BeautifulSoup(initial_page_request.text,'html.parser')
idseanc = soup.find("select",{"id":"sessionsSelect"})("option")[0]['value'].split("_")[1]

cookies = initial_page_request.cookies.get_dict()

headers = {
    'Origin': 'https://www.ticketmaster.fr',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
    'Content-Type': 'application/json; charset=UTF-8',
    'Accept': '*/*',
    'Referer': 'https://www.ticketmaster.fr/fr/manifestation/holiday-on-ice-billet/idmanif/446304',
    'X-Requested-With': 'XMLHttpRequest',
    'Connection': 'keep-alive',
}

data = {'idseanc':str(idseanc)}

response = s.post('https://www.ticketmaster.fr/planPlacement/FindPrices/connected/false/idseance/2870471', headers=headers, cookies=cookies, data=data)

j = response.json()

【讨论】:

  • 请问您是如何找到这些信息的?因为我需要对其进行调整以废弃大量页面,而此 id 用于特定页面 data = {'idseanc':'2870471'} response = s.post('ticketmaster.fr/planPlacement/FindPrices/connected/false/…', headers=headers, cookies=cookies , data=data) 谢谢
  • 我也尝试使用来自网络源的 findAll idseanc 报废,但我不能。 Python 返回一个空列表 [ ] 。谢谢
  • 我已更新代码以从您当前访问的页面获取ID。
  • 好的,谢谢,我有一些文章有问题,您提出的脚本找不到 id。例如这个:ticketmaster.fr/fr/pack/package-little-mix-billet/idpack/1807 错误是“NoneType”对象不可调用。我想,也许,网站阻止了我的抓取?
  • 您提供的页面与您最初问题中的页面完全不同。此外,众所周知,Ticketmaster 具有非常好的防刮技术。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多