【问题标题】:Glassdoor Web Scrape With SeleniumGlassdoor 带硒的 Web 刮擦
【发布时间】:2019-01-04 21:22:32
【问题描述】:

我正在尝试抓取下面链接左下角图表中显示的评级趋势数据,但似乎无法找到获取它的方法。我担心这是因为它是作为图片嵌入的,因此无法访问数据,但我想我会检查一下。

添加了我拼接在一起的代码,但我只得到了轴值。

任何帮助将不胜感激。

https://www.glassdoor.com/Reviews/Netflix-Reviews-E11891.htm#trends-overallRating

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
import pandas as pd
from selenium.webdriver.common import action_chains, keys
from selenium.common.exceptions import NoSuchElementException
import numpy as np
import sys
import re
import warnings

options = Options()
options.headless = True


driver = webdriver.Chrome(r'PATH',options=options)
driver.get('https://www.glassdoor.com/Reviews/Netflix-Reviews-E11891.htm#trends-overallRating')

trend_element = driver.find_elements_by_xpath('//*[@id="DesktopTrendChart"]')[0]
trend = trend_element.text
print(trend)

【问题讨论】:

  • 你说得对,看起来数据是在svg 图像中呈现的,但也许可以从 svg 数据中提取值。知道您希望如何表示数据输出吗?
  • 老实说,我会尽我所能,但如果我能将日期和值放在一起,那将是一个巨大的帮助。真的只是在寻找每个日期的值。
  • 是的,这很棘手。你可以得到我在那里看到的日期,但相应的值你必须做一些工作。这条线是由 x 和 y 坐标(在那里)绘制的,但是你必须以某种方式对其进行缩放。即便如此,它看起来也只是估计值。我认为锻炼/做起来真的很难/很复杂,但获得相对接近的东西并非不可能
  • 其实想了想,明天有时间再试一下。我有一些想法可以尝试,实际上提取这些信息应该不会太难。
  • 不是程序化解决方案,可能会解决您的问题WebPlotDegitizer

标签: python selenium web-scraping


【解决方案1】:

我最初是用 BeautifulSoup 来尝试的。

我能够提取出相应值的所有坐标(我确实成功地做到了)。花了大约一个小时左右找到它的位置,提取它,进入一个漂亮、整洁的数据框。

下一步,我打算将 x 和 y 坐标转换为相应的 x 和 y 标签,然后进行插值以创建更精细的数据集(我还没有尝试过)。我预计这需要大约一个小时左右。

在此之前我做了更多研究,发现了一篇有趣的文章here

阅读后,然后回到最初的问题,能够在 a) 更少的代码行中做到这一点,b) 没有 BeautifulSoup,c) 花了我大约 5-10 分钟,d)我学到了一些新东西。

请阅读该链接,查看代码,这应该可以满足您的需求。

import requests
import json
import pandas as pd

url = 'https://www.glassdoor.co.uk/api/employer/11891-rating.htm?dataType=trend&category=overallRating&locationStr=&jobTitleStr=&filterCurrentEmployee=false'

with requests.Session() as se:
    se.headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
        "Accept-Encoding": "gzip, deflate",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Accept-Language": "en"
    }
    response = se.get(url)

data = json.loads(response.text)

results = pd.DataFrame()
results['date'], results['rating'] = data['dates'], data['employerRatings']

输出:

print (results)
          date  rating
0   2018/12/30  3.66104
1   2018/12/30  3.66311
2   2018/11/25  3.69785
3   2018/10/28  3.73478
4    2018/9/30  3.68311
5    2018/8/26  3.69093
6    2018/7/29  3.70312
7    2018/6/24  3.74851
8    2018/5/27  3.67543
9    2018/4/29  3.67500
10   2018/3/25  3.62248
11   2018/2/25  3.73467
12   2018/1/28  3.70791
13  2017/12/31  3.72217
14  2017/11/26  3.69733
15  2017/10/29  3.61443
16   2017/9/24  3.47046
17   2017/8/27  3.46511
18   2017/7/30  3.46711
19   2017/6/25  3.48164
20   2017/5/28  3.52925
21   2017/4/30  3.46825
22   2017/3/26  3.46874
23   2017/2/26  3.52620

【讨论】:

  • 工作就像一个魅力,我真的很感谢你的帮助
  • 超级答案!!! @chitown88,学到了一些东西 +1,突然想到一个疑问,那就是您是如何在答案中获得该 URL,它与所讨论的不同
  • @Dev 阅读我参考的文章的链接。我使用了“检查”,只是查看了回复,直到找到我想要的东西。需要一些侦探工作。
  • 这似乎不再有效。遇到错误:从无 json.decoder.JSONDecodeError 引发 JSONDecodeError("Expecting value", s, err.value): Expecting value: line 1 column 1 (char 0)
  • 我刚刚试了一下,效果很好。您从哪个国家/地区访问它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多