PythonTip >> 博文 >> chinaunix

用python来抓取网站上你需要的内容

zihua 2014-01-20 18:01:00 点击: 728 | 收藏


任务:用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.msi
Python相关教程:
http://www.iplaypython.com/

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

原文链接:http://blog.chinaunix.net/uid-29438262-id-4085459.html

作者:zihua | 分类: chinaunix | 标签: python | 阅读: 728 | 发布于: 2014-01-20 18时 |