一个python经典爬虫诞生的全过程

原文爬的是山东大学的学校网站,源码在文章最后

先来准备一下工具:HttpFox插件。

这是一款http协议分析插件,分析页面请求和响应的时间、内容、以及浏览器用到的COOKIE等。

可以非常直观的查看相应的信息。

点击start是开始检测,点击stop暂停检测,点击clear清除内容。

一般在使用之前,点击stop暂停,然后点击clear清屏,确保看到的是访问当前页面获得的数据。

乍一看我们拿到了三个数据,两个是GET的一个是POST的,但是它们到底是什么,应该怎么用,我们还一无所知。

所以,我们需要挨个查看一下捕获到的内容。

没错,收到了一个ACCOUNT的cookie,并且在session结束之后自动销毁。

那么提交之后收到了哪些信息呢?

我们来看看后面的两个GET数据。

既然已经知道了我们向服务器发送了什么数据,也知道了我们接收到了什么数据,基本的流程如下:

首先,我们POST学号和密码--->然后返回cookie的值

然后发送cookie给服务器--->返回页面信息。

获取到成绩页面的数据,用正则表达式将成绩和学分单独取出并计算加权平均数。

OK,看上去好像很简单的样纸。那下面我们就来试试看吧。

但是在实验之前,还有一个问题没有解决,就是POST的数据到底发送到了哪里?

再来看一下当初的页面:

现在万事俱备啦,所以只需要把链接应用到爬虫里面,看看能否查看到成绩的页面。

从httpfox可以看到,我们发送了一个cookie才能返回成绩的信息,所以我们就用python模拟一个cookie的发送,以此来请求成绩的信息:

我们将代码稍稍整理一下,然后用正则来取出数据:

运行的效果如图:

源码:

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

#---------------------------------------

# 程序:山东大学爬虫

# 版本:0.1

# 作者:why

# 语言:Python 2.7

# 小编为大家推荐一个学习交流群:308754087,群里有人都快满了~大家遇到啥问题都可以在里面交流!是一个非 常好的学习交流地方~欲进从速欧~各种PDF等你来下载,全部免费,只为帮助大家快速入门

# 操作:输入学号和密码

# 功能:输出成绩的加权平均值也就是绩点

#---------------------------------------

import urllib

import urllib2

import cookielib

import re

import string

class SDU_Spider:

# 申明相关的属性

def __init__(self):

self.cookieJar = cookielib.CookieJar() # 初始化一个CookieJar来处理Cookie的信息

self.postdata=urllib.urlencode({'stuid':'201100300428','pwd':'921030'}) # POST的数据

self.weights = [] #存储权重,也就是学分

self.points = [] #存储分数,也就是成绩

self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar))

def sdu_init(self):

# 初始化链接并且获取cookie

myRequest = urllib2.Request(url = self.loginUrl,data = self.postdata) # 自定义一个请求

# 打印返回的内容

# print result.read()

self.deal_data(result.read().decode('gbk'))

self.calculate_date();

# 将内容从页面代码中抠出来

def deal_data(self,myPage):

myItems = re.findall('.*?

(.*?)

.*?

(.*?)

.*?',myPage,re.S) #获取到学分

for item in myItems:

self.weights.append(item[0].encode('gbk'))

self.points.append(item[1].encode('gbk'))

#计算绩点,如果成绩还没出来,或者成绩是优秀良好,就不运算该成绩

def calculate_date(self):

point = 0.0

weight = 0.0

for i in range(len(self.points)):

if(self.points[i].isdigit()):

point += string.atof(self.points[i])*string.atof(self.weights[i])

weight += string.atof(self.weights[i])

print point/weight

#调用

mySpider = SDU_Spider()

mySpider.sdu_init()

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180207A0L12400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券