Advertisement

python爬取学校学生信息网_使用python+selenium爬取学生信息并入库

阅读量:

通过学校的网站平台浏览了一些有用的信息。其中一项功能是提供各个学院所有年级学生的详细信息。

该页面大概如下

97e1fec6d67c3cb5c2d3b02b25fddace.png

于是好奇的我就打算把所有信息抓取下来。

最初计划是利用 requests 和 Beautiful Soup 进行模拟抓取。然而,在上一步骤中,“下一页”被要求提交一个表单,请注意此表单中的参数值必须从当前页面获取。随后需要从当前页面获取相应的参数值,并将其传递到表单中进行提交操作。步骤繁琐且效率低下,并最终尝试多次均未成功完成

简单的介绍一下 selenium 吧。

selenium是一个用于Web应用自动化测试的核心优势平台,在现有的自动化测试工具中,其显著特点是支持多平台和跨浏览器兼容性。

支持windows、linux、MAC,支持ie、firefox、safari、opera、chrome等。

此外还有一个显著特点在于支持分散式测试案例的执行。例如,在不同测试设备上部署这些测试案例类似于分发机构能的作用

但是我把他玩成了一个爬虫。。。

一个简单的例子:

测试例子:

from selenium import webdriver

from selenium.common.exceptions import NoSuchElementException

from selenium.webdriver.common.keys import Keys

import time

browser = webdriver.Firefox() # Get local session of firefox

browser.get("http://www.yahoo.com") # Load page

assert "Yahoo!" in browser.title

elem = browser.find_element_by_name("p") # Find the query box

elem.send_keys("seleniumhq" + Keys.RETURN)

time.sleep(0.2) # Let the page load, will be added to the API

try:

browser.find_element_by_xpath("//a[contains(@href,'http://seleniumhq.org')]")

except NoSuchElementException:

assert 0, "can't find seleniumhq"

browser.close()

下面是我的爬取操作

图中的table标签附近的源代码大概是这样子的

学号

姓名

性别

班级

操作

...

所以要找到这个 table 可以用一下代码

table = driver.find_element_by_class_name('scontent')

取到这个 table 后,就可以用 table.text 获取到 table 上的所有字符串

对这些字符串进行一定的分析后,就可以入库了

然后就是要实现 点击 “下一页 ”

“下一页”源代码如下:

观察到调用了JavaScript实现的一个功能,并且在后续操作中继续前进。为了在Selenium中模拟JavaScript的行为,请参考以下代码:

js = r"__doPostBack('ltNext','')"

driver.execute_script(js) # 执行js代码

完整的代码如下:

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

将selenium库中的异常处理模块中的TimeoutException和NoSuchElementException引入项目

import mysql.connector

def crawler():

driver = webdriver.Firefox()

driver.set_page_load_timeout(10)

driver.get(url) # 加载页面

conn = mysql.connector.connect(username='use', password='pwd', db_name='database', utf8mb4_unicode_aware=True) # 数据库的连接

cursor = conn.cursor()js = r"__doPostBack('ltNext','')" # “下一页” 的js源码

for temp in range(626): # 626为页码数

用于处理加载速度较快的情况:当快速加载时可能会找不到 table 标签。这种机制的主要原因是为了确保能够找到所需的 table 标签。建议在 sleep 一段时间后重新开始数据获取过程。

try:

table = driver.find_element_by_class_name('scontent')

except NoSuchElementException:

time.sleep(1)

table = driver.find_element_by_class_name('scontent')

finally:

while table is None:

time.sleep(0.1)

driver.find_element_by_class_name('scontent')

分析字符串的代码省略。。。

data 保存一个 学号, 姓名, 性别, 学院 的 数据。

for data in datas:

This SQL statement inserts records into the student table with regno, name, gender, and department details. The SQL code utilizes placeholders to input specific values for each attribute.

cursor.execute(sql)

if temp != 625:

driver.execute_script(js)

cursor.close()

conn.commit()

conn.close()

driver.close()

全部评论 (0)

还没有任何评论哟~