用Python爬虫爬取广州大学教务系统的成绩(内网访问)

在进行爬取前,首先要了解:

1、什么是CSS选择器?

每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是“选择器”。
“选择器”指明了{}中的“样式”的作用对象,也就是“样式”作用于网页中的哪些元素。
可参考:
http://www.w3school.com.cn/cssref/css_selectors.asp
http://www.ruanyifeng.com/blog/2009/03/css_selectors.html

2、常用的三种网页抓取方法(例子可能不可用,只要看方法就可以了)

正则表达式:

 # -*- coding: utf-8 -*-

 import urllib2
import re def scrape(html):
area = re.findall('<tr id="places_area__row">.*?<td\s*class=["\']w2p_fw["\']>(.*?)</td>', html)[0]
return area if __name__ == '__main__':
html = urllib2.urlopen('http://example.webscraping.com/view/United-Kingdom-239').read()
print scrape(html)

流行的BeautifulSoup模块:

 # -*- coding: utf-8 -*-

 import urllib2
from bs4 import BeautifulSoup def scrape(html):
soup = BeautifulSoup(html)
tr = soup.find(attrs={'id':'places_area__row'}) # locate the area row
# 'class' is a special python attribute so instead 'class_' is used
td = tr.find(attrs={'class':'w2p_fw'}) # locate the area tag
area = td.text # extract the area contents from this tag
return area if __name__ == '__main__':
html = urllib2.urlopen('http://example.webscraping.com/view/United-Kingdom-239').read()
print scrape(html)

强大的lxml模块:

 # -*- coding: utf-8 -*-

 import urllib2
import lxml.html def scrape(html):
tree = lxml.html.fromstring(html)
td = tree.cssselect('tr#places_neighbours__row > td.w2p_fw')[0]
area = td.text_content()
return area if __name__ == '__main__':
html = urllib2.urlopen('http://example.webscraping.com/view/United-Kingdom-239').read()
print scrape(html)

本文选用第三种网页抓取的方法:lxml(性能快,使用难度简单,只是安装难度相对困难而已,建议直接安装anaconda)

3、什么是cookie?

在 Internet 中,Cookie 实际上是指小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理。
通常情况下,当用户结束浏览器会话时,系统将终止所有的 Cookie。当 Web 服务器创建了Cookies 后,只要在其有效期内,当用户访问同一个 Web 服务器时,浏览器首先要检查本地的Cookies,并将其原样发送给 Web 服务器。这种状态信息称作“Persistent Client State HTTP Cookie” ,简称为 Cookies。
具体含义
“Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。这是很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置、花费的时间或用户首选项(如样式表)。Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦你从该网站或网络服务器退出,Cookie 也可存储在计算机的硬驱上。当访客结束其浏览器对话时,即终止的所有 Cookie。
主要用途
服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。

4、csv文件

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
可以看成是我们常见的excel文件,只不过是用逗号分隔每一个单元格而已。

完整代码如下:

 # -*- coding: utf-8 -*-

 import urllib
import urllib2
import cookielib
import lxml.html
import csv # 用户名、密码
LOGIN_USERNAME = ''
LOGIN_PASSWORD = '******' LOGIN_URL1 = 'https://cas.gzhu.edu.cn/cas_server/login'
LOGIN_URL2 = 'http://202.192.18.189/login_gzdx.aspx' def parse_form(html):
'''
获取表单提交所需的所有隐藏域
:param html: html代码
:return: 该页面的表单提交所需的所有隐藏域
'''
tree = lxml.html.fromstring(html)
data = {}
for e in tree.cssselect('form input'):
if e.get('name'):
data[e.get('name')] = e.get('value').encode('utf-8')
return data def getRecordsHTML():
'''
发送POST请求提交表单
使用cookie登录数字广大
再次使用cookie登录"http://202.192.18.189/login_gzdx.aspx"
然后再次发送POST请求提交表单查询成绩
:return:查询成绩的html
'''
mcj = cookielib.MozillaCookieJar('mcj.txt')
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(mcj))
html = opener.open(LOGIN_URL1).read()
data = parse_form(html)
data['username'] = LOGIN_USERNAME
data['password'] = LOGIN_PASSWORD
encoded_data = urllib.urlencode(data)
request = urllib2.Request(LOGIN_URL1, encoded_data)
response = opener.open(request)
print(response.geturl()) request = urllib2.Request(LOGIN_URL2, encoded_data)
response = opener.open(request)
print(response.geturl()) html = opener.open(response.geturl()).read()
tree = lxml.html.fromstring(html)
path = tree.cssselect('#headDiv > ul > li:nth-child(6) > ul > li:nth-child(1) > a')[0].get('href')
URL3 = 'http://202.192.18.185/' + \
urllib.quote(path.encode('gbk'), safe='?=&')
print(URL3) html = opener.open(URL3).read()
data = parse_form(html)
newData = {
'__VIEWSTATE': data['__VIEWSTATE'],
'__VIEWSTATEGENERATOR': data['__VIEWSTATEGENERATOR'],
'Button2': data['Button2']
}
# print('data=', newData) encoded_data = urllib.urlencode(newData)
request = urllib2.Request(URL3, encoded_data)
response = opener.open(request)
mcj.save(ignore_discard=True, ignore_expires=True)
html = response.read()
return html def main():
'''
提取并保存成绩到“在校学习成绩.csv”文件中
'''
writer = csv.writer(open('在校学习成绩.csv', 'w'))
tree = lxml.html.fromstring(getRecordsHTML())
row = [] for i in xrange(1, 100):
for j in xrange(15):
try:
row.append(tree.cssselect('#Datagrid1 > tr:nth-child(%s) > td' % i)[j].text_content().encode('utf-8'))
except Exception as e:
break
writer.writerow(row)
row = [] if __name__ == '__main__':
main()

运行结果:

生成的csv文件如下:

因为上面的代码已经将cookie信息保存下来了,下次访问我们就可以用下面的代码:

 # -*- coding: utf-8 -*-

 import urllib
import urllib2
import cookielib
import lxml.html
import csv def parse_form(html):
'''
获取表单提交所需的所有隐藏域
:param html: html代码
:return: 该页面的表单提交所需的所有隐藏域
'''
tree = lxml.html.fromstring(html)
data = {}
for e in tree.cssselect('form input'):
if e.get('name'):
data[e.get('name')] = e.get('value').encode('utf-8')
return data def getRecordsHTML():
mcj = cookielib.MozillaCookieJar()
mcj.load('mcj.txt', ignore_discard=True, ignore_expires=True)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(mcj))
URL3 = 'http://202.192.18.185/xscj_gc.aspx?xh=1406100037'
html = opener.open(URL3).read()
data = parse_form(html)
newData = {
'__VIEWSTATE': data['__VIEWSTATE'],
'__VIEWSTATEGENERATOR': data['__VIEWSTATEGENERATOR'],
'Button2': data['Button2']
} encoded_data = urllib.urlencode(newData)
request = urllib2.Request(URL3, encoded_data)
response = opener.open(request)
html = response.read()
return html def main():
writer = csv.writer(open('在校学习成绩2.csv', 'w'))
tree = lxml.html.fromstring(getRecordsHTML())
row = [] for i in xrange(1, 100):
for j in xrange(15):
try:
row.append(tree.cssselect('#Datagrid1 > tr:nth-child(%s) > td' % i)[j].text_content().encode('utf-8'))
except Exception as e:
break
writer.writerow(row)
row = [] if __name__ == '__main__':
main()

本文地址:http://www.cnblogs.com/jacen789/p/8058897.html

更新版本的爬虫:https://github.com/Jacen789/GzhuGradesCrawler

用Python爬虫爬取广州大学教务系统的成绩(内网访问)的更多相关文章

  1. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  2. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  3. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  4. python爬虫爬取内容中,-xa0,-u3000的含义

    python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310

  5. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  6. python爬虫—爬取英文名以及正则表达式的介绍

    python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...

  7. 一个简单的python爬虫,爬取知乎

    一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...

  8. python爬虫-爬取百度图片

    python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...

  9. python爬虫---爬取王者荣耀全部皮肤图片

    代码: import requests json_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win ...

随机推荐

  1. Bootstrap学习笔记(4)--导航栏

    相关类: nav, nav-pills, nav-tags, nav-stacked ul里使用,导航格胶囊,方片外观,堆叠外观 navbar, navbar-header, navbar-brand ...

  2. 使用导出导入(datapump)方式将普通表切换为分区表

    随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式. 有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区表:使用EXCHANGE PARTITION方式来 ...

  3. 绝对详细!Nginx基本配置、性能优化指南

    大多数的Nginx安装指南告诉你如下基础知识——通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了!而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能 ...

  4. 在后台运行Python脚本服务

    在服务器,程序都是后台运行的,当写的python脚本时,需要:   你要是想python robot.py & 是不行的,一旦用户登出,脚本就自动退出了.用at, cron也可以实现不过我发现 ...

  5. 通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术

    通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages( JSP)技术.Velocity.Tiles.iText 和 POI.Spring MVC ...

  6. php -- 用文本来存储内容,file_put_contents,serialize,unserialize

    根据存储的内容来划分 字符串: file_put_contents :将一个字符串写入文件 语法:int file_put_contents ( string $filename , mixed $d ...

  7. 去死吧!USB转串口!!!

    首先,这个题目有两种歧义:1.USB转232串口(严格说就是这种)! 2.USB转USART串口(通常都是这么叫,认为就是这,理论上是错误的,歧义所在)! USB转TTL.USB转232.USB转串口 ...

  8. 移动ChemDraw结构有什么方法

    ChemDraw软件是一款比较常见的化学绘图软件,化学专业的领域的人常常会用到它.本教程主要是针对新手用户,让其了解一些ChemDraw的一些基本操作,以便其能尽快上手早日用到工作中.下面我们就来给大 ...

  9. oh my zsh 切换 bash

    zsh切换bash bash切换zsh 切换bash chsh -s /bin/bash 切换zsh chsh -s /bin/zsh

  10. AWS系列-EC2实例添加磁盘

    注意:添加的磁盘,必须和挂载的实例是在同一可用区. 1.1 如下图,打开EC2控制台,打开卷,点击创建卷 1.2 选择磁盘配置 磁盘类型:如下图 磁盘大小:如图,最小500G,最大16T 可用区:注意 ...