python作业爬取xxx大学排行

python作业爬取xxx大学排名榜单,python-selenium爬虫解决(本文章仅学习,网站数据也是公开的)


前言

        python作业爬取xx大学排行榜数据,老师给你的教程是非常久远的教程,你会发现与现在的网站有所差别,特别是在浏览器开发者工具中抓包xhr文件,已经找不到榜单数据文件了。本文章主要介绍用python-selenium-webdriver 实现对网页榜单数据的抓取。

        代码已经上传我的  gitee库 可自行下载使用。


一、分析

进入网页打开开发者工具,元素检查自己需要的数据 ‘清华大学’,查看它的元素代码,如下:

 class="name-cn" data-v-b80b4d60="">清华大学 </a>

  类似检查所有数据的元素,进行对比,发现其相同类的元素头一致,这样后续代码可以用re提取。

为避免每一页的数据对应元素不一致,检查第二页元素 大连理工大学 ,如下:

 href="/institution/dalian-university-of-technology" class="name-cn">大连理工大学 </a>

 发现与第一页元素头不一致,返回第一页再次查看‘清华大学’,如下:

 href="/institution/tsinghua-university" class="name-cn">清华大学 </a>

 发现数据的元素又一致了 ,后续页面也一致,故在使用python-selenium爬虫时,进入网页先进入第二页,再返回第一页,使其页面数据对应元素一致。

所有数据对应网页代码元素如下:
   经过观察发现大学级别有些学校没有,故在爬虫过程中,没有的就更改为无,方便后续写入表。

# 大学名称
<a data-v-b80b4d60="" href="/institution/tsinghua-university" class="name-cn">清华大学 </a>
# 英文名称
<a data-v-f9104fdc="" href="/institution/tsinghua-university" class="name-en">Tsinghua University </a>
# 大学级别
<p data-v-3fe7d390="" class="tags">双一流/985/211</p>
# 学校所在省份
<td data-v-3fe7d390="" class="">
            北京
            <!----></td>
# 学校类型
<td data-v-3fe7d390="" class="">
            综合
            <!----></td>
# 总分
<td data-v-3fe7d390="" class="">
            999.4
          </td>
# 办学层次
<td data-v-3fe7d390="" class="">
                    37.6
                </td>

因为需要榜单全部数据,所以要把所有页数里面的数据全部提取出来。需要用python-selenium模拟翻页,后又经发现,在一些页中的 下一页 按钮的xpath地址(xpath是用来定位按钮在页面什么位置)会有所变化,下一页按钮和xpath内容如下:

下一页按钮 xpath 地址变更
1-3:    //*[@id="content-box"]/ul/li[9]/a
4:      //*[@id="content-box"]/ul/li[10]/a
5-16:   //*[@id="content-box"]/ul/li[11]/a
17:    //*[@id="content-box"]/ul/li[10]/a
18:    //*[@id="content-box"]/ul/li[9]/a
19:    //*[@id="content-box"]/ul/li[9]/a
20:    //*[@id="content-box"]/ul/li[9]/a

二、需要实现过程

图解:

三、代码实现

1.引入库

代码如下:

import time

import re

from selenium.webdriver

import ActionChains from selenium import webdriver

2.全部代码

代码如下:

import time

import re
from selenium.webdriver import ActionChains
from selenium import webdriver

if __name__ == '__main__':
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--no-sandbox')  # 给予root执行权限
    chrome_options.add_argument('--headless')  # 隐藏浏览器运行
    driver = webdriver.Chrome(options=chrome_options)
    # 地址自行输入
    url = ''
    driver.get(url)
    time.sleep(1)
    action = ActionChains(driver)
    # 初始化界面元素 可以发现直接进入 第一页 与 后面页的元素格式不一样 但如果进入第一页后点击进入第二页
    # 再点击进入第一页,第一页就和后面的页元素一致了
    e = driver.find_element('xpath', '//*[@id="content-box"]/ul/li[9]/a')
    action.click(e).perform()
    e = driver.find_element('xpath', '//*[@id="content-box"]/ul/li[1]/a')
    action.click(e).perform()
    # 最终存储校园排行榜数据列表
    list_information = []
    # 20 表示总页数
    for j in range(0, 20):
        text = driver.page_source
        # print(text)
        list_yemian = re.findall('<tbody data-v-3fe7d390="">(.*?)</tbody>', text, re.S)[0]
        list_total = re.findall('<tr data-v-3fe7d390="">(.*?)</tr>', list_yemian, re.S)
        length = len(list_total)
        for i in range(0, length):
            list0 = list_total[i]
            # 大学中文名
            name_cn = re.findall('class="name-cn">(.*?) </a>', list0)
            # 大学英文名
            name_en = re.findall('class="name-en">(.*?) </a>', list0)
            # 大学级别
            tags = re.findall('class="tags">(.*?)</p>', list0)
            # 无级别 比如不是 985/211的学校
            # 空列表==false
            if not tags:
                tags = ['无']
            # 大学所在省市 和 大学类型
            list_province_category = re.findall(
                '<td data-v-3fe7d390="" class="">\n            (.*?)\n            <!----></td>',
                list0)
            # 大学总分
            score = re.findall('<td data-v-3fe7d390="" class="">\n            (.*?)\n          </td>', list0)
            # 办学层次
            School_level = re.findall(
                '<td data-v-3fe7d390="" class="">\n                    (.*?)\n                </td>',
                list0)
            list_0 = name_cn + name_en + tags + list_province_category + score + School_level
            list_information.append(list_0)
        # print(list_information)
        if (0 <= j <= 2) or (17 <= j <= 19):
            xpath = '//*[@id="content-box"]/ul/li[9]/a'
        elif j == 3 or j == 16:
            xpath = '//*[@id="content-box"]/ul/li[10]/a'
        else:
            xpath = '//*[@id="content-box"]/ul/li[11]/a'
        e = driver.find_element('xpath', xpath)
        action.click(e).perform()
    # print(len(list_information))
    driver.quit()
    result = open('data.xls', 'w', encoding='utf-8')
    result.write('大学名称\t英文名\t大学级别\t所在省市\t大学类型\t总分\t办学层次\n')
    for m in range(0, len(list_information)):
        for n in range(0, len(list_information[m])):
            result.write(str(list_information[m][n]))
            result.write('\t')
        result.write('\n')
    result.close()
    print('数据采集完成!!')

3.效果呈现


都看到这里来了,如果觉得有用就留下你的赞吧!!!

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LLGululu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值