Python实例:网络爬虫抓取豆瓣3万本书(1)

花了些时间看了Python一整本书,写了些小例子,因为是有经验的人自学,所以很多都是跳过的。

不过学习还是得在实践中去,学一门语言还得运用中去。

去下一些例子下来,去运行,调试时最好的了。

《网络爬虫抓取豆瓣3万本书》这个代码来自:http://www.cnblogs.com/nima/p/5614662.html#

好像是这个博主的课程设计来的,还不知道人家毕业没,不过达者为先,老夫就厚颜学习一次了。

我用的是eclipse+pydev。很爽,比之前用sublime,notepad++,idle爽太多了。墙裂推荐。可以看我前一篇博客。

说回正题。

这个项目把爬虫分成了8个部分:


从用途上比我以前做的什么图书管理系统直流有用多了。

算是一个质量比较高的课程设计了。就不知道是不是从0开始做的。

又扯远了。

我只做代码分析就好了。

因为每个电脑的环境不同,我自己又用了mysql提供的数据库模块,跟原来的不同,所以一边修改一边调试,这也是加深学习的一种方式吧。

其实也可以说已经改得面目全非了,哈哈哈哈哈

先看代码:

step1.py

# -*- coding:utf-8 -*-
# 创建相关的数据库

import tool.DbManager

dbManager = tool.DbManager.DbManager() #已经在里面进行初始连接了
#创建数据库,原来不用加的。
dbManager.execNonQuery(r"create database doubanbook ;")
#使用新创建的数据库
dbManager.execNonQuery(r"use doubanbook;")
#构建了表book,
dbManager.execNonQuery(r"""
CREATE TABLE book (
  id int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  bookname varchar(100) NOT NULL COMMENT '书名',
  bookurl varchar(150) NOT NULL COMMENT '书入口',
  bookimg varchar(150) DEFAULT NULL COMMENT '书图片',
  bookinfo varchar(250) DEFAULT NULL COMMENT '书出版信息',
  bookstar varchar(45) DEFAULT NULL COMMENT '书评价星数',
  bookno varchar(45) NOT NULL COMMENT '书编号',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='书表';
""")
#构建了表booktag,
dbManager.execNonQuery(r"""
CREATE TABLE booktag (
  id int(11) NOT NULL AUTO_INCREMENT,
  bookname varchar(100) DEFAULT NULL COMMENT '书名',
  bookno varchar(45) DEFAULT NULL COMMENT '书编号',
  booktag varchar(45) DEFAULT NULL COMMENT '书标签',
  bookkind varchar(45) DEFAULT NULL COMMENT '书分类',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='书标签';
""")
#构建了表booktial,
dbManager.execNonQuery(r"""
CREATE TABLE bookdetial (
  id int(11) NOT NULL AUTO_INCREMENT,
  bookname varchar(100) NOT NULL COMMENT '书名',
  bookno varchar(45) NOT NULL COMMENT '书编号',
  bookinfo text COMMENT '书出版信息',
  bookintro text COMMENT '书介绍',
  authorintro text COMMENT '作者介绍',
  peoples int(11) DEFAULT NULL COMMENT '评价人数',
  starts varchar(100) DEFAULT NULL COMMENT '星级情况',
  other text COMMENT '其他信息',
  mulu mediumtext COMMENT '图书目录',
  comments mediumtext COMMENT '评论人',
  PRIMARY KEY (id),
  UNIQUE KEY bookno_UNIQUE (bookno)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='图书详情表';
""")
# DbManager.py
import mysql.connector #引入数据库的模块

config={'host':'127.0.0.1',#数据库所在的主机地址,默认127.0.0.1  
        'user':'root',  #用户
        'password':'root',  #密码
        'port':3306 ,#默认即为3306  
        'database':'test',#数据库名称  
        'charset':'utf8'#默认即为utf8  
        } 

class DbManager:
	"""
	对mysql.connector的简单封装,实现基本的连接
	"""

	def __init__(self ): 
		self.__initConnect()

	def __initConnect(self):
		"""
		得到连接信息
		返回: conn.cursor()
		""" 
		self.conn = mysql.connector.connect(**config)#链接,通过这个来操作链接
		self.cur = self.conn.cursor() #游标,通过这个访问数据库
		if not self.cur:
			raise (NameError, "连接数据库失败")

	def execQuery(self, sql):
		"""
		执行查询语句
		返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段

		调用示例: 
				resList = dbManager.execQuery("SELECT id,NickName FROM WeiBoUser")
				for (id,NickName) in resList:
					print(str(id),NickName)
		"""
		self.cur.execute(sql)
		#print("查询语句:"+sql)
		resList = self.cur.fetchall()
		return resList

	def execNonQuery(self, sql):
		"""
		执行非查询语句

		调用示例:
			cur = self.__GetConnect()
			cur.execute(sql)
			self.conn.commit()
			self.conn.close()
		"""
		try:
			self.cur.execute(sql)
			self.conn.commit()
			print('执行语句成功')
		except Exception:  # 出现异常回滚
			print('执行SQL语句失败:'+sql)
			self.conn.rollback()
			raise


	def __del__(self):
		self.cur.close()

#测试语句
def testinsert():
	dbManager = DbManager()
	dbManager.ExecNonQuery("insert into `bookdetial` (booknafme) values ('你哈') ")
#测试语句
def testselect():
	dbManager = DbManager()
	print(dbManager.execQuery('SELECT * FROM t_test_paper limit 10'))
 
#测试语句
if __name__ == '__main__':
	# testinsert()
	testselect()

总结:

1.第一步的代码,是创建数据库以及相关的表,在第一次运行之后,就不需要运行了。

其实如果不需要根据运行的情况,在运行的时候创建表,我是觉得直接用可视化工具创建表示更加省功夫的。

2.期间还是发现很多问题的,mysql是模块名,所以自己的模块就不能有相同的模块名,否则会报一些奇怪的错误。

3.sql语句里面,表名、字段名是不需要单引号包着的,或者可以用`包着,这个就是键盘上面tab上一个,或者1左边那个符号,不知道叫什么。

毕业这么多年才知道,因为一直用Navicat来创建表的。或许这就是使用可视化工具的副作用吧。

4.好多地方可以优化的,不过就先不纠结了,现阶段看多几份代码可能更加有效果。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值