了解Python,学会Python,实战python
通过这次Python实训,我收获了很多,一方面学习到了许多以前没学过的专业知识与知识的应用,另一方面还提高了自我动手做项目的潜力。本次实训是对我潜力的进一步锻炼,也是一种考验。从中获得的诸多收获,也是很可贵的,是十分有好处的。
在实训中我学到了许多新的知识,是一个让我把书本上的理论知识运用于实践中的好机会,原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。在这次实训中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等。其次,实训中的项目作业也使我更加有团队精神。
下面是对这次实训内容的概括以及总结
Python简介以及环境搭建:
Python是一种开源语言,Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
搭建Python环境我们只需要一个解析器和一个编译器,解析器我们可以选择从Python官方网站上下载,也可以直接去安装Anaconda(这个东西不但有完整的Python解析器,而且自带很多Python常用库,甚至还有可以运行代码的IDE)。随后我们找到了PyCharm-Professional这样一个专业IDE以求更好地编写代码。关于PyCharm这个东西的激活问题,你可以去网上搜索各种破解方法或者加入一个教学团队获得永久激活权限。
Python基础的学习(有着扎实的C的基础,Python基础很简单):
Python是我新接触的一门语言,但不是我接触的第一门语言。Python与我之前接触的C,C++甚至Pascal都不同。学过Java的同学讲,Python的语法和一些方法都与Java类似,但是又不完全相同。
通过两天的对Python基础的学习我发现Python是一门十分简洁的语言,它的思想和C类语言有着很大的区别,它没有变量类型,它所有的仅仅是数据类型;它没有数组,取而代之的是列表,元组和字典等等。这些区别让我学习起来十分的不适应,下学期开设Java课程后,我会将Java和Python结合起来学习,这样估计我对Python这门语言的理解会更深一些。
与C类语言最大的不同的是,Python的方法非常强大,而且Python的代码非常简洁,你甚至不需要特别调用任何库就可以用一个方法完成对线性数据结构的增删改查。由于树形数据结构没有涉及到,所以没能体会到树形结构增删改查在Python中的实现,但是我从网上可以查到:Python用一个列表就可以实现树形结构的存储,实现方式类似于C中用纯属组实现堆。当然Python里没有struct,但是我们可以使用定义类的方法来帮助我们满足对于struct的需求。同样的,你也可以使用类来实现更为复杂的树形数据结构。
那么问题来了,既然Python能用一个小列表实现树,那么Python怎么实现图呢?
其实很简单:Python中有一个数据存储结构叫字典,如果我们同时使用字典和列表,就可以完美的实现图。而且,用这种方法实现图,在求最短路的时候,只需要一遍循环,配合Python独有的强大的方法就可以求得最短路径。
当然,对于树和图的实现,这么紧张的课程安排里面老师也不会去讲,但是作为一个计科专业的学生,这些问题我们不得不去考虑(虽然在我们工作后,这些数据结构基本不需要手写,直接调用库函数就可以了,但是知其所以然对于技术领域的我们来说永远是没有错的)。
Python爬虫的学习(核善的微笑):
众所周知,Python涉及的领域非常之广。大数据,人工智能,机器学习,网络爬虫等等一些当今世界尖端领域,Python都在其中充当着一个不可替代的角色。由于时间有限,此次实训我们只学习了网络爬虫。
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
这里我总结了爬虫的基本原理——通用框架
1.挑选种子URL;
2.讲这些URL放入带抓取的URL列队;
3.取出带抓取的URL,下载并存储进已下载网页库中。此外,讲这些URL放入带抓取URL列队,进入下一循环。
4.分析已抓取列队中的URL,并且将URL放入带抓取URL列队,从而进去下一循环。
那么问题来了,URL是个什么玩意儿QAQ?
这就是我十分痛苦的地方了:Python网络爬虫——注意“网络”两个字,是需要Python和网络知识进行结合,但是我目前只是学习了Python,对于html一窍不通,所以就很绝望。但是整个教室没接触过Java和html的人就我一个,只能少数服从多数。然后呢,然后就更绝望了:从requests到beautifulsoup4只用了一上午的时间,然后我迷失了一上午,紧接着下午开始讲json和csv结构存储……
于是我从CSDN上找了MTbaby博主的Python爬虫实践——零基础快速入门系列教程。效果“似乎”还不错,学到xpath的时候我还在想:单从浏览器源码上复制xpath这也太简单了,然而事实并非如此。当正式运用xpath写作业的时候,我遇见了一系列十分诡异的错误:首先是复制的xpath解析器报错,让老师改了之后,再用requests解析出来的的列表居然是空列表?!然后我去网上找解决方案,给出的解决方案主要有这几种:
1.浏览器会自动添加/tobdy规范html代码格式,此时应该讲/tobdy去掉即可。
2.你需要爬取的数据是被注释的,需要你讲数据源码粘贴到htmlIDE里进行编译然后利用正则表达式去掉注释。
3.网站有反爬虫机制,需要写一个header去欺骗它的防御系统。
4.真正的数据源码被隐藏了,需要分析网页源码。
然后我就头大了,去掉/tobdy这我会,但是我这段xpath里没有这玩意儿啊!之后的三种估计要等到我看了html之后才会,于是我决定硬看html和beautifulsoup4。硬看当然效果不好,我被活生生卡在了这里,没有专业知识去干活,就跟没有米让你去做饭一样。这些东西对于之前学过Java和html的人来说很简单,我舍友已经开始爬pixiv上的插画了,然而Java和html又不是我一两个小时就能学会的。所以在学习爬虫的道路上我遇见了这个时间段最大的困难。
这里科普一下JSON和CSV
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。
CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的描述。使用的字符编码同样没有被指定,但是7-bitASCII是最基本的通用编码。
随后被迫学习html(学的我脑壳疼):
超文本标记语言,标准通用标记语言下的一个应用。是 网页制作必备的编程语言“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
超文本标记语言的结构包括“头”部分、和“主体”部分,其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。
url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
层叠样式表CSS是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。
CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。
经历过对html基础的学习,现在已经可以搭建简单的静态网页。
对html的学习也比较有规律和循循渐进,首先是初步对html的了解,然后是对各个标签的学习和使用,标签不难,只不过短时间还不能完全吸收完全部,毕竟记忆有限,学到后面也会忘记一些前面的知识。所以只能通过练习,不断得巩固和积累。
学完了html的标签,接下来是CSS了。学到这CSS就会发现,前面学的标签很多都用不上了。但知识这东西,都是从积累开始的,从浅到深,从易到难。
CSS也是基本学完了,白天的时间基本都是听爬虫,很少有时间练习,听课的时候都感觉听得懂,但真真练习的时候就会发现词穷了,不知道下一步该写什么单词好,只能说明我学得还不够,练习得还不到位。
在做练习的时候,发现在html中添加了一个:
的图片,bg用了左浮动,但是CSS中没添加no-repeat;结果还是只会显示一张图片,并没有平铺在网页上。不知道是img 属性不会平铺,还是用了左浮动不会平铺。
无序列表和浮动一起用的时候还不是特别灵活,还需多加练习。
学习没有捷径,只能一步一步脚踏实地得打好基础。
Python项目实战(也不算实战,其实就是一个进阶练习):
爬取豆瓣图书信息
检查并复制《追风筝的人》书名的xpath如下:
//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a
我们按照同样套路来尝试一下,结果返回空值!
注意:浏览器复制的 xpath 信息并不是完全 可靠的,浏览器经常会自己在里面增加多余的 tbody 标签,我们需要手动把这些标签删掉。
修改xpath后再来尝试一下:完美,终于把数据搞下来了,接着往下走
切记:浏览器复制xpath 不是完全可靠的,看到tbady标签要特别注意,可以去网页源码看看是否这一层级。
对比不同的书名的xpath信息,分别复制《追风筝的人》,《小王子》,《围城》,《解忧杂货铺》“书名”的xpath信息进行对比,比较可以发现书名的xpath信息仅仅table后的序号不一样,并且跟书的序号一致,于是去掉序号,我们就可以得到所有书名通用的xpath信息。看起来是不是很简单,但其实这里面的坑你是想不到的。
这里我们默认书名和评分爬到的都是完全、正确的信息,这种默认情况一般没有问题,但其实是有缺陷的,如果我们某一项少爬或者多爬了信息,或者有些书根本就没有评分,那么两种数据的量就不一样了,从而匹配错误,
书名的标签肯定在这本书的框架内,于是我们从书名的标签上找,发现覆盖整本书的标签,把xpath信息复制下来:
//*[@id="content"]/div/div[1]/div/table[1]
我们将整本书和书名、评分的xpath信息进行对比,不难发现,书名和评分 xpath 的前半部分和整本书的xpath 一致,那我们可以通过这样写 xpath 的方式来定位信息:
book = f.xpath('//*[@id="content"]/div/div[1]/div/table[1]')
title = title = div.xpath('./tr/td[2]/div[1]/a/@title')
score = div.xpath('./tr/td[2]/div[2]/span[2]/text()')
OK,已经搞定一个页面了,下面我们爬取所有页面,共25页的信息。
先来看一下翻页后,url 是如何变化的。
第一页:
第二页:
第三页:
第四页:
…… ……
url 变化很规律,只是start=() 的数字不一样而已
而且是已每页25为单位递增。什么?25?这不正是每页书籍的数量吗?
所以只需要加个循环即可。
下面是代码:
import requests
from lxml import etree
import time
for i in range(10):
url = 'https://book.douban.com/top250?start={}'.format(i*25)
data = requests.get(url).text
f = etree.HTML(data)
books = f.xpath('//*[@id="content"]/div/div[1]/div/table')
for div in books:
title = div.xpath('./tr/td[2]/div[1]/a/@title')[0]
score = div.xpath('./tr/td[2]/div[2]/span[2]/text()')[0]
comment = div.xpath('./tr/td[2]/p[2]/span/text()')
num = div.xpath('./tr/td[2]/div[2]/span[3]/text()')[0].strip('(').strip().strip(')')
href = div.xpath('./tr/td[2]/div[1]/a/@href')[0]
time.sleep(1) #加个睡眠,防止IP被封
if len(comment)>0:
rint('{}-->{}-->{}-->{}-->{}'.format(title,score,comment[0],num,href))
else:
print('{}-->{}-->{}-->{}'.format(title,score,num,href))
print('\n')
注意:这里加个sleep语句,以免爬太快,IP被封,虽然豆瓣反爬虫力度不大,但还是要养成这个习惯,去爬任何网站都适用。
对这次实训整个过程我有如下总结:
一、继续学习,不断提升理论涵养。
在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
二、努力实践,自觉进行主角转化。
只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。务必在实际的工作和生活中潜心体会,并自觉的进行这种主角的转换。
能够说这次Python实训不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的学习中我会把学到的理论知识和实践经验不断的应用到实际中,为实现理想而努力。