【问题标题】:is there a way to scrape the underlying data of a particular button?有没有办法抓取特定按钮的基础数据?
【发布时间】:2021-05-20 10:55:02
【问题描述】:
  1. 我正在尝试抓取网页,对于使用类属性的少数元素,我得到了数据,但问题是,当我的循环转到每个 URL 以提取信息时,它应该提取联系号码。

联系电话不是直接可用的,当我们点击“CALL NOW”按钮时会弹出一个弹出卡以显示联系电话。

我尝试使用该电话号码元素的类函数,但仍然没有得到电话号码。

try:
    contact = soup.find('div', class_= 'c-vn-full__number u-bold').text.strip()
except:
    contact = "N/A"

有什么办法可以达到效果吗?

  1. 我还留下了一个元素来提取“咨询费”(价格)作为文本,但它没有类属性

【问题讨论】:

标签: web-scraping beautifulsoup


【解决方案1】:

试试这个:

import requests
from bs4 import BeautifulSoup

url = "https://www.practo.com/Bangalore/doctor/dr-venkata-krishna-rao-diabetologist-1?practice_id=776084&specialization=general%20physician"
soup = BeautifulSoup(requests.get(url).text, "html.parser").select(".u-no-margin--top")[-1]
print(soup.getText())

输出:

₹400 

编辑:

要获取联系方式,您需要从源HTML 获取practice_iddoctor_idquery_string。那里嵌入了一个巨大的JSON,但我认为仅仅挖出必要的部分而不是解析这个怪物更容易。

获得所有部件后,您可以使用端点获取详细联系信息。

以下是完成此操作的方法:

import json
import re

import requests

url = "https://www.practo.com/Bangalore/doctor/" \
      "dr-venkata-krishna-rao-diabetologist-1?" \
      "practice_id=776084&specialization=general%20physician"
page = requests.get(url).text

query_string_pattern = re.compile(r"query_string\":\"(.*?)\"")
practice_doctor_uuid = re.compile(
    r"(practice|doctor)_id\":"
    r"\"([a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12})"
)

practice_id, doctor_id = [i[1] for i in re.findall(practice_doctor_uuid, page)[:2]]
query_string = re.search(query_string_pattern, page).group(1)

practice_url = "https://www.practo.com/health/api/vn/vnpractice"
query = f"{query_string}&practice_uuid={practice_id}&doctor_uuid={doctor_id}"
endpoint_url = f"{practice_url}{query}"

headers = {
    "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
}

contact_info = requests.get(endpoint_url, headers=headers).json()
print(json.dumps(contact_info["vn_phone_number"], indent=2))

输出:

{
  "number": "+918046801985",
  "operator": "VOICE",
  "vn_zone_id": 1,
  "country_code": "IN",
  "extension": true,
  "id": 49090
}

【讨论】:

  • 怎么样?我的 url 链接循环存储在名为 doctorlinks = [] 的列表中,现在我如何合并上面的代码,它可以从循环中获取 url 并找出咨询费用。 @baduker
  • 循环查看您从这些网址制作的汤?如果您发现答案有用,请不要忘记投票/接受。
  • 我正在尽力将上述代码放入循环中进行测试,并且我想知道是否有任何方法可以实现我在上面第一点中要求的问题的结果得到联络号码?
  • 不要在 cmets 中发布代码。编辑您的问题并在那里添加代码。
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2020-04-12
相关资源
最近更新 更多