【问题标题】:Scrape QS university world ranking (AJAX)Scrape QS大学世界排名(AJAX)
【发布时间】:2021-09-16 22:14:39
【问题描述】:

我试图通过分析 Ajax 界面来抓取 QS 大学排名数据,因为 QS 全球大学排名页面是通过 Ajax 加载的。但是,我在编译时遇到了几个错误。在这种情况下;我得到一个 keyerror 类型:KeyError: 'url'。

url = 'https://www.topuniversities.com/sites/default/files/qs-rankings-data/en/3740566.txt?1624879808?v=1625562924528'
headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 "
                         "Safari/537.36"}
path = 'C:/Users/DELL/PycharmProjects/scrapeQS/qs-rank.txt'


def get_page(url):
    try:
        r = requests.get(url, headers=headers)
        if r.status_code == 200:
            return r.json()
    except requests.ConnectionError as e:
        print(e)


def parser_page(json):
    if json:
        items = json.get('data')
        for i in range(len(items)):
            item = items[i]
            qsrank = {}
            if "=" in item['rank_display']:
                rk_str = str(item['rank_display']).split('=')[-1]
                qsrank['rank_display'] = rk_str
            else:
                qsrank['rank_display'] = item['rank_display']
                qsrank['title'] = item['title']
                qsrank['region'] = item['region']
                qsrank['score'] = item['score']
                qsrank['url'] = item['url']
            yield qsrank


def main():
    json = get_page(url)
    results = parser_page(json)
    for result in results:
        with open(path, 'a') as f:
            f.write(result['rank_display'] + '    ' + result['title'] + '    ' + result['region'] + '    '
                    + result['score'] + '    ' + 'https://www.topuniversities.com' + result['url'] + '\n')
            f.close()
            print(result)


if __name__ == '__main__':
    print('Started parsing!')
    with open(path, 'a') as f:
        f.write('Ranking' + '    ' + 'University' + '    ' + 'Country' + '    ' + 'QS score' + '    ' + 'Link' + '\n')
        f.close()
    main()
    print('Done')
    

【问题讨论】:

  • 当你做with open时不需要f.close()
  • 是的;我会更新它。谢谢

标签: javascript python ajax xml web-scraping


【解决方案1】:

嗯.. 数据中没有“url”。
是什么让你觉得有这样的钥匙?

例子

   {
      "core_id": "624",
      "country": "Italy",
      "city": "Trieste",
      "guide": "",
      "nid": "297237",
      "title": "<div class=\"td-wrap\"><a href=\"\/universities\/university-trieste\" class=\"uni-link\">University of Trieste<\/a><\/div>",
      "logo": "\/sites\/default\/files\/university-of-trieste_624_small.jpg",
      "score": "",
      "rank_display": "651-700",
      "region": "Europe",
      "stars": "",
      "recm": "0--"
    },

【讨论】:

  • 哦;你说的对。我很抱歉我的错误。该 URL 出现在 2018 年的排名数据中,而 2022 年的排名数据中不再存在。然而;现在我遇到了一个新错误:UnicodeEncodeError: 'charmap' codec can't encode character '\u0101' in position 155: character maps to &lt;undefined&gt;;没关系,我用 io 修复了它
  • 我还有一个问题;如何以这种方式获取标题键(不带 html 标签):“的里雅斯特大学”而不是:&lt;div class=\"td-wrap\"&gt;&lt;a href=\"\/universities\/university-trieste\" class=\"uni-link\"&gt;University of Trieste&lt;\/a&gt;&lt;\/div&gt;
  • 使用 Beautiful Soup 从 HTML sn-p 中提取数据
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多