任务:用Python来抓取网站上你需要的内容
近来对于 python 的学习热情比较高,感觉用起来比较方便,效率也好,就决定采用 python 来做上述任务,Mysql 来存储数据。
Mysql 版本:
mysql-5.1.35-win32.msi 管理工具: Navicat for MySQL
相关模块:
Python 2.5 + MySQLdb ( MySQL-python-1.2.2.win32-py2.5.exe ) + BeautifulSoup 3.0
python 2.5Windows 安装版下载地址:
http://www.python.org/ftp/python/2.5/python-2.5.msiPython相关教程:
MySQLdb 下载地址:
http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.2/MySQL-python-1.2.2.win32-py2.5.exe/download
BeautifulSoup 下载地址:
http://www.crummy.com/software/BeautifulSoup/download/3.x/BeautifulSoup-3.0.0.py
BeautifulSoup 官网文档:
http://www.crummy.com/software/BeautifulSoup/documentation.zh.html
程序中使用的模块:
traceback : traceback.format_exc() 处理异常时输出错误日志
urllib2 :通过 url 访问相应网站(设置 HTTP 代理防止被网站封IP导致无法访问)
urlparse : urlparse.urlparse 把 url 解析成六部分,方便处理
urlparse.urljoin(baseUrl, relativeUrl) 根据既存的绝对 URL ,把一相对 URL 转换成相应的决定 URL (当抓取网站中 link 等链接使用相对路径,可以非常方便地取得 link 对应的绝对路径 URL )
os : os.path.exists 路径是否存在
os.path.join 把路径和文件名称合成新的路径
os.sep 操作系统分隔符
os.makedirs 创建多层次的目录
os.makedir() 创建当层目录
time : time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 取得当前时间
3 天半的开发过程中出现了不少问题,记录如下:
1, MySQLdb 使用不了。
由于 MySQLdb 作者不提供对 Windows 平台 python2.7 的安装包,作为新手没有办法就只好退回使用python2.5
2, 下载了 BeautifulSoup 后不知道怎么使用
使用 BeautifulSoup 时只需要下载 BeautifulSoup-3.0.0.py 这个文件(注意下载后把版本号删除,这样使用时import BeautifulSoup 才不会出错【 python 文件的文件名就是模块名】)
文件名中删除了 -3.0.0 后, pydev 中报错,不知道什么原因,但可以正常导入使用
3, MySQLdb 控制事务时发现不起作用
检查: 1 ,数据库创建时是否允许使用事务 2 ,表创建时是否允许支持事务 InnoDB
4, 程序报错: Error No. 1130 Host 'x.x.x.x' is not allowed to connect to this MySQL server
这是由于 mysql 服务端 root 用户所对应的客户端权限设置问题(安装 mysql 时注意选择允许通过 ip 访问数据库)。默认所对应的客户端地址只有 localhost (也就是服务端的机器),所以要增加相应的地址。下面增加任何地址都可以访问 mysql 服务端的 root 用户
# mysql
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456';
或者 mysql> grant all privileges on *.* to 'root'@'192.168.1.1' identified by '123456' with grant option;
mysql> flush privileges;
mysql> exit
5, 程序报错: Error Nr. 1045 Access denied for user"root@COMPUTERNAME"(using password: NO)
Root 用户没有密码不让访问,设置密码为 123456
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
6, 程序插入,读取数据到 mysql 都是乱码
Python 文件设置编码 utf-8 (文件前面加上 # -*- coding: utf-8 -*-)
Python 文件保存时的编码utf-8
MySQL 数据库 charset=utf-8
Python 连接 MySQL 是加上参数 charset=utf8
7, 在eclipse 插件pydev 中正常,迁移到命令行执行后,显示编码错误,程序无法执行。
追加如下代码:
import sys
# 兼容命令行执行
default_encoding ='utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding (default_encoding)
8, 代码内部的中文字符串在命令行中显示乱码
使用中文字符串的地方,在字符串前面追加 u ,表明这是 1 个 unicode 字符串,如u'总共’
9, eclipse 插件pydev 报 setdefaultencoding不存在,但是却能正常执行
python 解释器启动时会自动删除 sys 模块的 setdefaultencoding() 方法 , 使得运行时不能调用 , 所以需要通过reload(sys) 重新加载
python 2.3 以后的默认编码是 ascii
python3 .0 开始默认编码为 utf-8
10, 报错: OperationalError: (1040, 'Too many connections')
发现 mysql 的默认最大连接数为 100 ,出现上述错误的原因mysql事务控制时连接没有及时释放掉
查看 mysql 当前活动的连接:到 mysql 安装目录的 bin 文件夹下运行
mysqladmin -uroot -p123456 -h192.168.3.79 processlist