【问题标题】:How to scrape text from tooltips generated with javascript如何从使用 javascript 生成的工具提示中抓取文本
【发布时间】:2020-02-03 12:32:32
【问题描述】:

我编写了以下代码来获取地图中所有蓝色标记的位置。

from bs4 import BeautifulSoup
from requests_html import HTMLSession
session = HTMLSession()

url="https://emf2.bundesnetzagentur.de/karte/Default.aspx?lat=52.4107723&lon=14.2930953&zoom=14"
r = session.get(url)
r.html.render(sleep = 3)
data = r.html.html

soup=BeautifulSoup(data,'html.parser')
BlueTriangles = soup.find_all(src="images/funk_hf.png")
for Triangle in BlueTriangles[1:]:
    TriangleStyle = Triangle['style']
    PixelPosition = TriangleStyle.split('transform: translate3d(')[1].split(', 0px); z')[0]
    print(PixelPosition)

r.session.close()

当我使用网络浏览器打开 URL 时,我看到每个蓝色标记都有一个唯一的 ID,它显示在鼠标悬停时的工具提示中:

工具提示的 html 代码似乎是由鼠标悬停事件触发的:

有没有办法从工具提示中抓取 ID?我想知道是否可以使用渲染的脚本参数来强制鼠标悬停事件。但是我找不到将它集成到代码中的方法:

$('#foo').trigger('mouseover');

【问题讨论】:

  • 我建议使用crummy.com/software/BeautifulSoup/bs4/doc 而不是您当前使用的字符串函数。使用 Beautifulsoup,您可以轻松地从页面中提取您想要的内容。
  • 感谢您的建议。我删除了字符串函数以使其更清晰,并专注于回答帖子中的问题,该问题仍未得到解答。
  • 嗯,看起来整个地图都是用Javascript渲染的。所以我相信你必须使用像 Scrapy 或 Selenium 这样的无头浏览器才能执行 Javascript。即使那样,提取所有 id 可能也很困难。
  • requests_html 正在渲染地图的 Javascript。只有工具提示似乎没有在初始页面加载时呈现。

标签: javascript python web-scraping python-requests-html


【解决方案1】:

地图上的点通过请求渲染到端点https://emf2.bundesnetzagentur.de/karte/Standortservice.asmx/GetStandorteFreigabe,并带有框坐标(在本例中为{"Box":{"sued":52.39231101879802,"west":14.248666763305664,"nord":52.42927461241364,"ost":14.337587356567385}})。

响应是 json。位置的数据由 AES 加密。页面加载的js脚本中提供解密代码(函数CryptParamsDecryptData)。

解密后我们得到这个不错的数据: "[{"Titel":"018126","Lng":14.311666,"Lat":52.428888,"fID":1076,"sonderseite":false},{"Titel":"011720","Lng":14.259722,"Lat":52.423054,"fID":2196,"sonderseite":false},{"Titel":"87011082","Lng":14.275832,"Lat":52.401666,"fID":560919,"sonderseite":false}]"

你有两种方法。

  1. 使用 selenium 或类似软件渲染 JS 并尝试解析生成的 DOM;

  2. 编写解析器向 GetStandorteFreigabe 端点发送请求并解码其响应(将代码从 js 转换为 python),

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 2023-03-25
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多