欢迎访问www.allbetgaming.com!

首页科技正文

联博api接口:【python爬虫实战】使用Selenium webdriver采集山东招考数据

admin2020-09-1046

目录
  • 1、目的
  • 2、Selenium webdriver说明
    • 2.1 为什么使用webdriver
    • 2.2 webdriver支持浏览器
    • 2.3 设置与使用说明
  • 3、采集
    • 3.1 剖析网站
    • 3.2 遍历省份
    • 3.3 遍历高校
    • 3.4 采集专业数据
    • 3.5 写入mysql
  • 4、源码

1、目的

  • 目的:按区域、高校 采集2020年拟在山东招生的所有专业信息
  • 采集地址:http://xkkm.sdzk.cn/zy-manager-web/gxxx/selectAllDq#

2、Selenium webdriver说明

2.1 为什么使用webdriver

Selenium Webdriver是通过种种浏览器的驱动(web driver)来驱动浏览器的,相遇对于使用requests库直接对网页举行剖析,效率较低,本次使用webdriver库主要原因是requests库无法剖析该网站

2.2 webdriver支持浏览器

  • Google Chrome
  • Microsoft Internet Explorer 7,8,9,10,11 for Windows Vista,Windows 7,Windows 8,Windows 8.1.
  • Microsoft Edge
  • Firefox
  • Safari
  • Opera

2.3 设置与使用说明

webdriver是通过各浏览器的驱动程序 来操作浏览器的,以是,要有各浏览器的驱动程序,浏览器驱动要与内陆浏览器版本对应,常用浏览器驱动下载地址如下:

浏览器 对应驱动下载地址
chrom(chromedriver.exe) http://npm.taobao.org/mirrors/chromedriver/
firefox(geckodriver.exe) https://github.com/mozilla/geckodriver/releases
Edge https://developer.microsoft.com/en-us/micrsosft-edage/tools/webdriver
Safari https://webkit.org/blog/6900/webdriver-support-in-safari-10/

本文使用谷歌的chrome浏览器,
chrome + webdriver的详细设置和操作说明见 https://www.cnblogs.com/cbowen/p/13217857.html

3、采集

3.1 剖析网站

  • 进入网页发现各省份地址相同、各高校地址相同,因此想按纪律组织每个省份和每个学校的url,并用requests举行剖析就无法实现了。

  • 于是想到webdriver,来模拟人工操作,获取当前页面,再通过xpath定位到要获取的数据单元。
    先用chrome控制台获取目的数据单元的xpath

通过手动调整xpath,很容易发现省份xpath的纪律为

for province_id in rang(1, 33)
    province_xpath = '//*[@id="div1"]/div/div[%s]/a' % province_id

再用同样方式获取高校的xpat,这里就不贴截图了,直接上效果

# sch_id为每个省份的高校id
# schid_xpath,province_xpath,schcode_xpath,school_xpath,subpage_xpath,schhome_xpath划分对应字段序号、区域、学校代码、学校名称、选考科目要求、学校主页
schid_xpath = '//*[@id="div4"]/table/tbody/tr[%s]/td[1]/a' % school_id
province_xpath = '//*[@id="div4"]/table/tbody/tr[%s]/td[2]/a' % school_id
schcode_xpath = '//*[@id="div4"]/table/tbody/tr[%s]/td[3]/a' % school_id
school_xpath = '//*[@id="div4"]/table/tbody/tr[%s]/td[4]/a' % school_id
subpage_xpath = '//*[@id="div4"]/table/tbody/tr[%s]/td[5]/a' % school_id
schhome_xpath = '//*[@id="div4"]/table/tbody/tr[%s]/td[6]/a' % school_id

再用同样方式获取专业信息的xpat,直接上效果

# major_id为每个高校专业序号,从1到最后一个专业序号
# i从1到4划分对应字段“序号”、“条理”、“专业名称”、“选考科目要求”
for i in range(1, 5):
    major_xpath = '//*[@id="ccc"]/div/table/tbody/tr[%s]/td[%s]' % (major_id, i)

3.2 遍历省份

  • 遍历省份很简单,一共32个省份,直接用rang(1,33),省去用try来判断。
  • 在函数外启动浏览器,并传入WebDriver类wd,所有省份遍历完成后关闭浏览器
  • 后面要将数据写入mysql,所有传入了完成数据库毗邻的connect工具conn,并在所有数据写入后关闭conn毗邻。
def traverse_province(wd, conn):
    """
    循环进入省份
    :return:
    """
    for province_id in range(1, 33):
        province_xpath = '//*[@id="div1"]/div/div[%s]/a' % province_id
        wd.find_element_by_xpath(province_xpath).click()  # 点击进入省份
        time.sleep(1)
        traverse_school(wd, conn)  # 遍历省份内的高校
    wd.quit()
    conn.close()

3.3 遍历高校

  • 用while True循环来遍历当前页所有的高校,用try-except来判断是否乐成捕捉高校信息,失败则终端while True循环。
  • 获取高校基本信息放列表school_info中,传入下层函数用于冗余保留高校+专业 完整数据。
  • 进入高校的子页面后,需要重新定位当前操作页面,wd.window_handles获取当前浏览器所有子页面句柄,wd.switch_to.window切换至指定页面。
  • 最内层函数traverse_major()会获取专业数据,并将本层获取的高校数据和专业数据写入mysql。
  • 在一个高校的所有专业数据写入完成后,提交一次。
def traverse_school(wd, conn):
    """
    遍历高校信息
    :return:
    """
    school_id = 1
    while True:
        school_info = []
        try:
            # 获取高校信息
            for i in [1, 2, 3, 4, 6]:
                school_xpath = '//*[@id="div4"]/table/tbody/tr[%s]/td[%s]' % (school_id, i)
                text = wd.find_element_by_xpath(school_xpath).text
                school_info.append(text)

            # 进入高校子页
            wd.find_element_by_xpath('//*[@id="div4"]/table/tbody/tr[%s]/td[5]/a' % school_id).click()
            wd.switch_to.window(wd.window_handles[-1])  # 切换到最后一个页面
            traverse_major(school_info, wd, conn)  # 遍历专业
            wd.close()  # 关闭当前页
            wd.switch_to.window(wd.window_handles[-1])  # 重新定位一次页面
            school_id += 1
        except:
            break
        conn.commit()  # 每个高校份提交一次

3.4 采集专业数据

  • 将专业信息连系上层函数传入的高校信息冗余保留。
  • 每个高校启动一次游标。
  • 本函数内仅使操作游标举行数据写入,数据库的毗邻在下面函数中,数据库关闭在最外层函数中。
def traverse_major(school_info, wd, conn):
    """
    遍历专业信息,最后连系高校信息一并输出
    :param school_info: 上层函数通报进来的高校信息
    :return:
    """
    major_id = 1
    cursor = conn.cursor()
    while True:
        major_info = []
        try:
            for i in range(1, 5):
                major_xpath = '//*[@id="ccc"]/div/table/tbody/tr[%s]/td[%s]' % (major_id, i)
                text = wd.find_element_by_xpath(major_xpath).text
                major_info.append(text)

            print(school_info + major_info)

            # 写入mysql
            insert_sql = '''
                        insert into sdzk_data
                        (school_id,province,school_code,school_name,school_home,major_id,cc,major_name,subject_ask) 
                        values('%s','%s','%s','%s','%s','%s','%s','%s','%s')   
                        ''' % (school_info[0], school_info[1], school_info[2], school_info[3], school_info[4],
                               major_info[0], major_info[1], major_info[2], major_info[3])
            cursor.execute(insert_sql)

            major_id += 1
        except:
            break
    cursor.close()  # 每个高校都重新开启一次游标

3.5 写入mysql

  • 该函数仅用于建立mysql毗邻,并建立表。
  • 判断表是否存在,存在则先删除再建立。
  • 函数返回connect类,用于其他函数使用。
  • 关闭毗邻在最外层函数中,直到所有省份数据采集竣事后才关闭毗邻。
def connect_mysql(config):
    """
    毗邻数据库,并建立表,若是表已存在则先删除
    :param config: mysql数据库信息
    :return: 返回毗邻乐成的connect工具
    """

    create_sql = '''
                    CREATE table if NOT EXISTS sdzk_data
                    (school_id int(3),province varchar(20), school_code varchar(5), 
                    school_name varchar(50), school_home varchar(100), major_id int(3), 
                    cc varchar(5), major_name varchar(100), subject_ask varchar(50))
                 '''

    # 判断表是否存在,存在则删除,然后建立
    conn = pymysql.connect(**config)
    cursor = conn.cursor()
    cursor.execute('''show TABLEs like "sdzk_data"''')
    if cursor.fetchall():
        cursor.execute('''drop table sdzk_data''')
    cursor.execute(create_sql)
    cursor.close()

    return conn

4、源码

源码地址:https://github.com/18686622933/sdzk_data

,

UG环球

欢迎进入环球UG官网(UG环球):www.ugbet.us,环球UG官方网站:www.ugbet.net开放环球UG网址访问、环球UG会员注册、环球UG代理申请、环球UG电脑客户端、环球UG手机版下载等业务。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://www.double-marketing.com/post/945.html

网友评论

1条评论
  • 2020-09-10 00:09:52

    环球UG欢迎进入环球UG官网(UG环球):www.ugbet.us,环球UG官方网站:www.ugbet.net开放环球UG网址访问、环球UG会员注册、环球UG代理申请、环球UG电脑客户端、环球UG手机版下载等业务。还行吧可以更好。

最新评论

  • UG环球官方注册 09/01 说:

    欧博客户端欢迎进入欧博客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。围观一下大佬

  • UG环球官方注册 09/01 说:

    欧博客户端欢迎进入欧博客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。围观一下大佬

  • 环球UG官网 09/01 说:

    欧博Allbet欢迎进入欧博Allbet官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。不懂可以问我

  • 环球UG电脑版下载 09/01 说:

    欧博亚洲手机版下载欢迎进入欧博亚洲手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。我好佩服

  • Allbet登录网址 09/01 说:

    联博统计www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。我觉得这篇很优质

  • 联博开奖网 08/31 说:

    欧博手机版下载欢迎进入欧博手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。飘过~

  • 联博API 08/30 说:

    欧博亚洲注册欢迎进入欧博亚洲注册(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。不是我吹,我能看三天

  • AllbetGmaing开户 08/30 说:

    Allbet官网欢迎进入Allbet官网(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。勉勉强强,可以的