3小时的Python学习成果展示(附源码)

背景

前天买了个新玩具叫树莓派,研究了不少资料后发现,大家基本上都会使用自带的Python来写一些程序,实现一些好玩的东西。

于是就开始找一些Python的基础资料开始学习,这里推荐廖雪峰的Python教程

突然想起一个编程经验分享里提到,带着目的直接开始写,遇到问题搜索解决,这样学习才是更自然的方法。

于是搜了一个实战的项目案例:Python爬虫实战一之爬取糗事百科段子

为什么选择采集项目?

因为目前做互联网产品,经常需要采集一些数据做分析,学会使用Python做数据采集,应用场景广泛,Python语言据说也很适合这方面的工作。

具体代码(注释说明)

1
# _*_coding:utf-8_*_  
# 引入采集用的http类库,以下库都是python自带  
import urllib
import urllib2
# 引入正则表达式库
import re
# 引入csv库
import csv
# 之前没加下面的内容会报错,说什么ACSII码兼容之类的问题
import sys
reload(sys)
sys.setdefaultencoding('utf-8')


# 定义一个把采集到的字段写入CSV的方法
def createListCSV(fileName = '', dataList = []):
	with open(fileName, 'w') as csvFile:
		# 这句很重要,写入BOM头,否则Mac上的Excel打开文件乱码(被坑了半天,这句网上搜到的,管用)
		csvFile.write('\xEF\xBB\xBF');
		csvWriter = csv.writer(csvFile, delimiter = ',')
		# 写个表格的头,方便Excel上的筛选操作
		csvWriter.writerow([u"作者", u"内容", u"点赞数", u"评论数"])  
		for data in dataList:
			csvWriter.writerow(data)
			csvFile.close

# 采集的第二页做测试
page = 2
# 模拟浏览器Header,不写的话很多网站是禁止采集的
joeseesun_agent = 'Mozilla/4.0 (compatible; MSIE 10.0; Windows NT)'
headers = {}
headers['Joeseesun-Agent'] = joeseesun_agent
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
try:
	# 创建请求并获取到内容对象
	request = urllib2.Request(url, headers = headers)
	response = urllib2.urlopen(request)
	# 把获取的内容对象转化为utf-8文本
	content = response.read().decode('utf-8')
	# 写正则匹配需要的字段,先通过sublime的正则验证无误后填进去
	pattern = re.compile("<div.*>\s*<div.*>\s*<a.*\s*<img.*\s*</a>\s*<a.*>\s*<h2>(.*?)<\/h2>\s*<\/a>\s*</div>\s*<div.*\s*(.*)\s*<\/div>\s*<div.*\s*<span.*?><i.*?>(\d+)<.*\s*<span.*\s*<span.*\s<a.*\s<i.*?>(\d+)")
	# 找到所有匹配的数据
	items = re.findall(pattern, content)
	# 创建一个存储采集内容的列表
	qiushiData = []
	for item in items:
		# 替换<br />为换行符
		replaceBR = re.compile('<br/>')
		text = re.sub(replaceBR, "\n", item[1])
		# 打印内容到Terminal
		print text+"\n"
		print u"作者:%s\t点赞:%s\t评论:%s" %(item[0], item[2], item[3]) + "\n"
		# 把数据写到列表对象中
		qiushiData.append([item[0], text, item[2], item[3]])
	# 把列表写入CSV
	createListCSV("test.csv", qiushiData)
# 不懂,抄过来的异常处理代码
except urllib2.URLError, e:
	if hasattr(e, "code"):
		print e.code
	if hasattr(e, "reason"):
		print e.reason

运行代码后的控制台输出结果如下:

生成的CSV文件,通过Excel筛选处理后结果:

总结

去年学习过一点Nodejs开发,所以学起来Python觉得不算很难,而且发现基础知识都是相通的,就像李笑来老师说的:“知识获取的越多,学习速度会越来越快。”

会编程真的是很实用的技能,立马感觉手里多了把“瑞士军刀”。

一些经验分享

  1. 遇到出错提示,找到对应行去解决。

  2. 多用搜索引擎搜索,你遇到的问题别人早就遇到并解决了。比如遇到CSV乱码时,搜“python csv 中文乱码”

  3. 基础知识很重要,一定要刻意练习,比如正则表达式。

  4. 带着想法去找解决方案。比如一开始只是采集输出到控制台,但想到如何存CSV跟别人分享或导入数据库,就开始了CSV读写方面的研究。

  5. 最好有“科学上网”工具,这样访问国外资料网站会顺畅很多,能提高效率。