利用python3.4爬取学校教务系统,并封装成api供app调用(一)

利用python3.4爬取学校教务系统,并封装成api供app调用(一)

为何是python3.4?因为我学习的python就是3.4版本的,所以这里讲如何用python3.4实现对学校教务系统的抓取。具体怎么爬,有很多人都讲的很好了,这里不再复述,关键谈一谈我是如何用python3.4实现这些个过程的。
目前大部分的python爬虫教程都是基于2.7的,我这里写这个文章的目的呢,一是加强对python爬虫这块业务的了解,二是希望对想用python3.x进行爬虫的人有所帮助。
开始正文之前,这里先推荐我学习python爬虫时的两篇爬虫专栏,他们对我的启发很大,不过是基于python2.7的,下面贴出原文链接。

  • Python爬虫学习系列教程
  • Python爬虫入门教程

  • 为何想到用python来爬虫
    启发于知乎的这篇回答(能利用爬虫技术做到哪些很酷很有趣很有用的事情?)想着自己也能做一款校园级的应用出来就开干了
    首先是python的学习,看的是廖雪峰的python教程也就大概看了个基础就开始了爬虫这块儿
    好了扯了这么多没用的啦,下面咱们开干。

  • 第一步抓取校园网新闻
    万事都从简单的开始,首先抓取的是学校的新闻列表,这一块比较简单不需要登录啥的,连抓包分析都省了,直接访问新闻的url就可以抓取到。
    这里要提一下,在python2.x中的urllib和urllib2这两个库在python3.x中整合成了urllib一个库。但是用法上还是类似。具体代码如下:
#-*-conding: UTF-8-*-
from  urllib import request #导入urllib库中的request模块
import re
def focus_newslist():
    focusnewsUrl = 'http://xxx.xxx.xxx.htm' #要闻的链接
    with request.urlopen(focusnewsUrl) as f:
        print('Status:',f.status,f.reason)
        for k, v in f.getheaders():
            print('%s:%s' % (k,v))
        dataAll=f.read() #使用read()方法读取数据,否则返回的是一个请求对象的描述
        print (dataAll) #打印结果

利用python3.4爬取学校教务系统,并封装成api供app调用(一)_第1张图片
可以看到打印出了html源码,和response返回的头部信息与状态码
使用request.urlopen(focusnewsUrl)就实现了对数据的请求。这里我们传入了新闻链接的url。下面是urlopen()可以传入的参数,这里我们只关注url就可以了,其余的后面再说。
`urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
这样是实现了数据的抓取,但是这样还是不够的,还要对我们的数据进行提取才行。于是我使用正则表达式对内容进行提取。在源代码的基础上稍作修改

#-*-conding: UTF-8-*-
from  urllib import request #导入urllib库中的request方法
import re
def focus_newslist():
    focusnewsUrl = 'http://xxx.xxx.xxx.htm' #要闻的链接
    with request.urlopen(focusnewsUrl) as f:
        print('Status:',f.status,f.reason)
        for k, v in f.getheaders():
            print('%s:%s' % (k,v))
        dataAll=f.read()
        # 使用正则表达式,提取新闻列表ul标签下内容
        data_ul=re.findall('.*?(
    .*?.*?.*?.*?.*?.*?
).*?
',dataAll.decode('utf-8'),re.M|re.S) for datas in data_ul: i=datas matchdata=re.findall('(.*?)(.*?).*?(.*?)',i,re.S) items=[] # 使用列表来存储,抽取出来的内容 for item in matchdata: # 使用字典来讲抽取的内容,填入列表中 items.append({'url':item[0].replace("\n","").strip('.'), 'title':item[1].replace(" ","").strip('\r\n'), 'time':item[2].replace("\n","").strip('()'), 'content':item[3].replace("\r\n","").strip(' ')}) for content in items: print(content) # 打印内容

利用python3.4爬取学校教务系统,并封装成api供app调用(一)_第2张图片
之所以封装成字典形式,是便于后面转换为json格式做调用。

这里只是简单讲了下,如何使用python3.x的urllib库的使用,代码还有很多不完善的地方,将在后面的文章中,完善整个爬取过程和思路。
初次写这类,文章若有不好的地方欢迎讨论指教。

你可能感兴趣的:(python3爬虫学习笔记)