设为首页 收藏本站
查看: 415|回复: 0

[经验分享] 使用python抓取某网站数据

[复制链接]

尚未签到

发表于 2017-4-29 11:24:56 | 显示全部楼层 |阅读模式
任务:抓取某网站数据(物品,参数,图片)
近来对于python的学习热情比较高,感觉用起来比较方便,效率也好,就决定采用python来做上述任务,Mysql来存储数据。
 
Mysql版本:
mysql-5.1.35-win32.msi管理工具:Navicatfor 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
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 thisMySQL 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> flushprivileges;
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'

ifsys.getdefaultencoding() != default_encoding:

    reload(sys)

sys.setdefaultencoding(default_encoding)
  8, 代码内部的中文字符串在命令行中显示乱码
使用中文字符串的地方,在字符串前面追加u,表明这是1个unicode字符串,如u'总共’
  9, eclipse插件pydev报setdefaultencoding不存在,但是却能正常执行
python解释器启动时会自动删除sys模块的setdefaultencoding()方法, 使得运行时不能调用, 所以需要通过reload(sys)重新加载
python2.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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370728-1-1.html 上篇帖子: 用python进行GUI开发的选择 下篇帖子: 四Python对象和面向对象(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表