QingXin 发表于 2023-1-14 11:18:44

Selenium中如何定位这个元素

求助各位鱼友:我试图从该网站获取下图中,标红框的这几个数据。现在是用python+selenium爬取,但是网页数据全部加载后,从driver.page_source中都没能找到这几个数值,希望大神们能帮我解答两个问题:
1、这几个数值是如何传加载进来的(如果数值不在html的文本中,那应该在某个js中,但是我也知道怎么找这个js接口)?
2、怎么定位到这个数值?(不是前七天的,前七天的在label中能读到)

网页:https://metrodb.org/index/beijing.html
要定位抓取的数值:799.49 和796.71

ba21 发表于 2023-1-14 11:18:45

QingXin 发表于 2023-1-17 10:31
嗯嗯,还是非常感谢!终于明白了这个数据原来是这么加载显示的,之前确实没有想到会有js加密的情况。这两 ...

那是不是可以结贴呢?

suchocolate 发表于 2023-1-14 15:49:30

用<>把代码贴出来吧。

ba21 发表于 2023-1-14 20:52:49

本帖最后由 ba21 于 2023-1-14 21:03 编辑

先鼠标移动到柱上,让数据加载出来

QingXin 发表于 2023-1-15 09:42:29

suchocolate 发表于 2023-1-14 15:49
用把代码贴出来吧。

这里是现在的代码,中间那部分不会写,不知道怎么获取
import time
from selenium import webdriver

driver = webdriver.Firefox()

city_list = ['beijing','shanghai','guangzhou','shenzhen','chengdu','nanjing','wuhan','chongqing','xian', 'tianjin']
for city in city_list:
    driver.get('https://metrodb.org/index/%s.html'%city)
    time.sleep(3)
    text = driver.page_source
   
    这里是需要填入的代码,获取页面的每个日期date和流量flow
   
      print(date,flow)

QingXin 发表于 2023-1-15 09:47:54

ba21 发表于 2023-1-14 20:52
先鼠标移动到柱上,让数据加载出来

嗯,鼠标移上去之后从悬浮框里获取似乎是有可能,可是怎么让鼠标移动到那个柱状图的条块上呢,感觉又进入了一个更大的坑【捂脸】
实际上,我有一个包含二三十城市的列表,不只是北京地铁,希望还是一个自动化的流程,不是我自己把鼠标移过去。。。

代码大概是这样的
import time
from selenium import webdriver

driver = webdriver.Firefox()

city_list = ['beijing','shanghai','guangzhou','shenzhen','chengdu','nanjing','wuhan','chongqing','xian', 'tianjin']
for city in city_list:
    driver.get('https://metrodb.org/index/%s.html'%city)
    time.sleep(3)
    text = driver.page_source
   
    这里是需要填入的代码,获取页面的每个日期date和流量flow
   
      print(date,flow)

suchocolate 发表于 2023-1-15 13:37:29

QingXin 发表于 2023-1-15 09:42
这里是现在的代码,中间那部分不会写,不知道怎么获取

它这个页面也15日数据,前10天的在cityflowChart里可以用re拿到import re
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as expected
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.firefox.options import Options


options = Options()
options.add_argument('-headless')
driver = Firefox(options=options)
wait = WebDriverWait(driver, 10)
citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen', 'chengdu', 'nanjing', 'wuhan', 'chongqing', 'xian',
         'tianjin']
for city in citys:
    driver.get(f'https://metrodb.org/index/{city}.html')
    ele = wait.until(expected.visibility_of_element_located((By.ID, 'cityflowChart')))
    # print(ele.get_attribute("outerHTML"))
    s = ele.get_attribute("outerHTML")
    slst = re.findall(r'前10项是——(.*?)"', s)
    result = slst.split(',')
    print(result)
driver.quit()
但是后5天的数据,确实没有直接写在html里,如果用移动鼠标的办法,也比较麻烦。因为selenium移动鼠标要先找目的元素,而要找的后5天的柱状图并不是直观的元素,这个网页需要研究一下js,然后让python执行js,不过这部分我不熟,得等其他人看看了。

ba21 发表于 2023-1-15 21:17:39

QingXin 发表于 2023-1-15 09:47
嗯,鼠标移上去之后从悬浮框里获取似乎是有可能,可是怎么让鼠标移动到那个柱状图的条块上呢,感觉又进入 ...

只能帮到这了。



QingXin 发表于 2023-1-17 10:31:30

ba21 发表于 2023-1-15 21:17
只能帮到这了。

嗯嗯,还是非常感谢!终于明白了这个数据原来是这么加载显示的,之前确实没有想到会有js加密的情况。这两天研究了一下,尝试用driver.execute_script(''MetroDB('x7Bjg8N+')),但是返回None,没结果。不过你的解答还是让我找了方向了,感谢感谢~

QingXin 发表于 2023-1-17 10:38:46

suchocolate 发表于 2023-1-15 13:37
它这个页面也15日数据,前10天的在cityflowChart里可以用re拿到
但是后5天的数据,确实没有直接写在ht ...

感谢,比之前我只能找前七八天的,还是进步了。js这个确实是难搞,哎~
页: [1]
查看完整版本: Selenium中如何定位这个元素