冻葱Tewi
一个菜鸡。
冻葱Tewi
冻葱的Python学习笔记03-用selenium扒取自招名单

今天放学后照例来到了机房查一下看看山东大学(sdu)的自招初审名单有没有发布,然后惊喜的发现——巨慢无比的山东大学终于发布了他的自招初审名单!然后我就想知道,濮阳一高除了我们几个OIer之外,还有没有其他的同学也通过了自招呢?正好前几天了解到了一些python的第三方库,所以就趁热(现学现卖)想撸个扒名单的爬虫(估计根本称不上)。

使用了selenium库的webdriver,是通过模拟用户操作来实现自动化过程的一个库。所以就是一简单的模拟,所以很快就撸了出来。

思路就是进入网页后查找网页内的<tr>标签,然后吧<tr>标签内的<td>元素都打印到输出文件里。然后再检查有没有下一页,如果有就下一页继续,如果没就是到底儿了,返回就可以。所以就写了个递归,这样可以避免每次换学校的时候手动输入页数之类的。

但是还是出了一些小问题。比如我还并不会输出到xls文件里,所以就只能打印到txt文件里,再靠复制的笨方法得到一个xls表格。稍微搜索了一下,好像直接操作xls需要再安装一个第三方库,时间原因,还是使用了笨方法,以后再弄个xls版本。

第二个小问题是,因为未知原因,在扒到第四页时,会突然抛出异常并停止运行。搜了一下,在打开文件的时候强制了一下编码,然后就可以正常运行了,问题大概算是解决了。

https://dctewi.com/wp-content/uploads/2018/05/change.png

另外一个比较难受的问题是——在扒到最后一页,没有找到下一页按钮时,程序也会抛出异常并且停止运行。虽然并不会造成什么不良影响,但是脚本最底下的关闭文件语句不会被执行。这个时候如果直接关掉shell和浏览器的话,辛苦扒下来的数据就付诸东流咯。所以要在抛出异常的shell页面手动再输入一行out.close(),然后关闭页面即可。

https://dctewi.com/wp-content/uploads/2018/05/alittleError.png

过程

1.首先是安装python的第三方库selenium,因为我们要用到这个神奇的库。在selenium的官网下载好这个库的压缩包,然后解压这个tar.gz,放到一个能写出来名字的路径(本例中放在了D:\selenium-3.11.0\)然后打开命令行,移动到这个路径,并进行安装——

D:
cd D:\selenium
python setup.py install
https://dctewi.com/wp-content/uploads/2018/05/install-selenium.png

2.如果你使用的浏览器是chrome,那么请下载对应版本的chromedriver.exe用来自动化操作chrome。

3.然后就是编写代码了,这里贴上我的Ver.1,即输出txt并且需要在最后手动out.close()的版本——

#Let's see the people who are admitted!
#

import os
from selenium import webdriver #导入selenium中的webdriver

#Function
def GetData( page ):
    #Get elements
    names = page.find_elements_by_css_selector('tr')
    #For every students in this page
    for name in names:
        data = name.find_elements_by_css_selector('td')
        for datum in data:
            out.write(datum.text + '    ')
        pass
        out.write('\n')
    pass
    
    #Try to find next page
    hrefs = page.find_elements_by_css_selector('a')
    for href in hrefs:
        if href.text == '下一页>>':
            href.click()
            page.implicitly_wait(10)
            GetData( page )
        pass
    pass
    return

#Main
#Open browser & get page
page = webdriver.Chrome('c:\chromedriver.exe') #输入对应的chromedriver的路径,如果加入了PATH,则可以省略参数。
page.get('https://gaokao.chsi.com.cn/zzbm/mdgs/detail.action?oid=476749380&lx=1') #打开sdu的初审名单网页。
page.implicitly_wait(10) #隐式等待一下下
#Open outfile
out = open('list.txt', 'w', encoding='utf-8') #创建一个输出文件~
#Get Data 
GetData( page ) #开始工作咯
#Over!
out.close() #存一下(这个版本因为还不知道的原因,并不能运行到这一句,所以需要手动close)

#
# (c) 2018 DCTewi

4.跑一下,完成~

笔记

  1. 隐式等待:driver.implicitly_wait( time ) 这个函数会一直等待加载完成或者时间结束(单位秒)但是如果页面中动态元素过多,可能返回加载完成的时候并没有加载完毕,这时候需要配合显式等待一起使用。
  2. open()中的编码设置:即上述代码中的encoding = ‘utf-8’,这样可以避免一些奇怪的问题。
  3. css选择器的使用:很的很好用!比xpath好用!(逃)

Ver. 2 输出xls的版本

经过我的一番搜索,决定使用xlrd和xlwt两个库来输出到xls。和selenium一样,下载解压之后,在命令行内运行python setup.py install 就可以使用这个库咯。

输出xls使用xlwt,这个库使用xls = xlwt.Workbook()来创建一个xls,使用new_sheet = xls.add_sheet( sheet_name )来创建一个新的表,写入内容则使用了new_sheet( row, col, label = ”)操作,最后在来一个xls.save( file_name )保存文件,完成~

不过和之前的代码不同的是,需要多出两个参数来控制行和列,所以简单修改了一下——当然,肯定会有更好的方法啦~

上代码:

#Let's see the people who are admitted!
#

import os
from selenium import webdriver
import xlwt

#Function
def GetData( page, index ):
    #Get elements
    names = page.find_elements_by_css_selector('tr')
    #For every students in this page
    for name in names:
        data = name.find_elements_by_css_selector('td')
        col = 1
        for datum in data:
            outsheet.write( index, col, label = datum.text )
            col += 1
        pass
        index += 1
    pass
    
    #Try to find next page
    hrefs = page.find_elements_by_css_selector('a')
    for href in hrefs:
        if href.text == '下一页>>':
            href.click()
            page.implicitly_wait(10)
            GetData( page, index )
        else:
            page.quit()
        pass
    pass
    return

#Main
#Open browser & get page
page = webdriver.Chrome('d:\chromedriver.exe')
page.get('https://gaokao.chsi.com.cn/zzbm/mdgs/detail.action?oid=476749380&lx=1')
page.implicitly_wait(10)
#Open outfile
outxls = xlwt.Workbook(encoding = 'utf-8')
outsheet = outxls.add_sheet('List')
#Get Data 
GetData( page, 1 )
#Over!
outxls.save('SDU_list_2018.xls')

#
# (c) 2018 DCTewi

不过还是有需要在最后一页抛出异常之后手动输入outxls.save(‘somename.xls’)的毛病,算了,能用就行。就当是自定义文件名的功能了(逃)

以上就是冻葱的第三次python学习笔记。

冻葱要加油高考咯~最后冲刺!

赞赏
本站采用BY-NC-SA-4.0 国际许可协议, 转载请保留出处。
首页      笔记      冻葱的Python学习笔记03-用selenium扒取自招名单
https://dctewi.com/wp-content/uploads/2019/02/head-croped-small-middle-300x300.jpg

冻葱Tewi

文章作者

这个站点的蒟蒻站长~欢迎大家来晃悠!

发表评论

textsms
account_circle
email

冻葱Tewi

冻葱的Python学习笔记03-用selenium扒取自招名单
今天放学后照例来到了机房查一下看看山东大学(sdu)的自招初审名单有没有发布,然后惊喜的发现——巨慢无比的山东大学终于发布了他的自招初审名单!然后我就想知道,濮阳一高除了我们几个O…
扫描二维码继续阅读
2018-05-09
标签云
隐藏
变装