IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    Reverland (lhtlyy@gmail.com)发表于 2015-04-05 00:00:00
    love 0

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

    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自动捕捉异常的功能或者设置断点来运行调试。

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

    #!/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~



沪ICP备19023445号-2号
友情链接