盒子
盒子
文章目录
  1. 每一颗眼泪,是一万道光:迎新系统学生信息爬取

Python Spider: 迎新系统学生信息爬取

每一颗眼泪,是一万道光:迎新系统学生信息爬取

You don’t get over the fear. You run towards it, with your knees buckling.

—Amin Ariana, Technical Founder, hacker and advisor at several ventures

有多少次,希望那短暂平凡的一刻又一刻定格到永恒。

简简单单就是幸福

忘乎所有只有热爱


去年8月,来跪邮写得第一个程序。在学十还略显空荡的房间,空荡荡的桌面,床上没有被子只有个睡袋,惨白惨白的灯光和兴奋的新同学们。

这次,依然是selenium专场。让程序操作浏览器。

首先,依然是研究整个流程。

打开 http://welcome.bupt.edu.cn

看看怎么登录

一切显而易见,输入用户名密码,点击登录按钮。

进入界面

这时候看到有个选框,发现可以选择研究生或者本科生。在这里我不讨论这个问题,留作读者自己思考。

我们随便翻翻看看

注意到左下角有几个页码,左边还有个3136/210之类的东西。

大概研究下猜想,3136是学生总数,210是总页数。

同时注意到页码是一次显示5页,通过点击>翻入下个5页。

为了得到我们要翻多少页,需要提取出210这个数。我们已经讲过如何用xpath来索引到对应的元素。

紧接着,抓取,点击下一页,每翻五页,点击>,然后继续重复以上步骤。

直到把210页全翻完。

我们要提取的信息在classporlet-table

接着,一切都显而易见了,用selenium自动化这个步骤。

我是直接在ipython中一点点试验这个过程,最后把历史记录摘录出来写成程序,最后在ipython中打开pdb自动捕捉异常的功能或者设置断点来运行调试。

当然,也许你使用自己的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python
# -*- coding: utf-8 -*-


from selenium import webdriver
#from selenium.webdriver.common.keys import Keys
import time
import random

__author__ = 'Reverland'

"""
You know what it is...
With NO warranty.
At your OWN risk.

A quick and dirty spider implemented with selenium webdriver
to dump the students' dorm data

条码号 姓名 院系 专业 学号 班级 宿舍校区 宿舍区 宿舍楼
宿舍房号 床号 入住情况
"""


driver = webdriver.Firefox()
driver.get("http://welcome.bupt.edu.cn")
username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")
username.send_keys("2xxxxxx")
password.send_keys("xxxxx")
submit = driver.find_element_by_name("submit")
submit.click()

time.sleep(2)

# login success
# y
p = 1
xpath_p_last = '//div[@class="pagination-info clearFix"]/span'
n_pages = driver.find_element_by_xpath(xpath_p_last)
p_last = int(n_pages.text.split('/')[1])
n_student = int(n_pages.text.split('/')[0])
print "Number of Students Found: ", n_student
while (p <= p_last):
time.sleep(random.randint(3, 5))
table = driver.find_element_by_class_name("portlet-table")
# remove headers
text = table.text[45::] + '\n'
print text
with open("bupt_students_yan.txt", 'a') as f:
f.write(text.encode('utf-8'))
p += 1
if p > p_last:
print "finished"
break
if p % 5 == 1:
driver.find_element_by_link_text(">").click()
else:
driver.find_element_by_link_text(str(p)).click()

# b
option = driver.find_element_by_xpath('//select/option[@value="serieN10B"]')
option.click()
p = 1
xpath_p_last = '//div[@class="pagination-info clearFix"]/span'
n_pages = driver.find_element_by_xpath(xpath_p_last)
p_last = int(n_pages.text.split('/')[1])
n_student = int(n_pages.text.split('/')[0])
print "Number of Students Found: ", n_student
while (p <= p_last):
time.sleep(random.randint(3, 5))
table = driver.find_element_by_class_name("portlet-table")
# remove headers
text = table.text[45::] + '\n'
print text
with open("bupt_students_ben.txt", 'a') as f:
f.write(text.encode('utf-8'))
p += 1
if p > p_last:
print "finished"
break
if p % 5 == 1:
driver.find_element_by_link_text(">").click()
else:
driver.find_element_by_link_text(str(p)).click()

Happy hacking~