数据库MySQL和Python

/ 0评 / 0

    在上次搞到百度地图API的时候我底下也写了不少检测小程序。在这个过程中我遇到了不少的问题:数据量或者是生产结果很小的时候使用命令行或者用PyCharm的控制台输出是蛮好用还挺酷炫的,但是数据采集我总不能到大后期还是一两条吧,想了这个问题之后我写了一个遍历列表中大学附近网吧个数的程序(我没写正则表达式来匹配//因为不会。。):

    这样一下一运行我发现 一个很严重的问题,我这样输出结果都是在控制台/命令行模式下 ,于是在稍稍改进之后存储到了txt文件 当中。说来也是滑稽,210条结果就弄的很是头大,如果要是数据量再次持续增长那我肯定是要扑街的,而数据库成了我 存储的最佳选择 。但是在这之前我有两个 历程:存储为文件,存储为CVS

存储为媒体文件

    存储媒体文件有两种主要的方式:只获取文件的URL链接,或者把源文件直接下载下来,我们可以通过媒体文件所在的URL来直接引用,这样做有不少优点:

爬虫运行得更快,耗费的流量更少,因为只要链接,不需要下载文件。
可以节省很多存储空间,因为只需要存储 URL 链接就可以。
存储 URL 的代码更容易写,也不需要实现文件下载代码。
不下载文件能够降低目标主机服务器的负载。 

    当然,这种赤裸的下载方式肯定也有不少缺点:

这些内嵌在你的网站或应用中的外站 URL 链接被称为盗链hotlinking), 使用盗链可能会让你麻烦不断,每个网站都会实施防盗链措施。
因为你的链接文件在别人的服务器上,所以你的应用就要跟着别人的节奏运行了。
盗链是很容易改变的。 如果你把盗链图片放在博客上,要是被对方服务器发现,很可能被恶搞。如果你把 URL 链接存起来准备以后再用,可能用的时候链接已经失效了,或者是变成了完全无关的内容。
现实中的网络浏览器不仅可以请求 HTML 页面并切换页面,它们也会下载访问页面上所有的资源。下载文件会让你的爬虫看起来更像是人在浏览网站,这样做反而有好处。

    接下来就是老生常谈了:采集一个网页的一张图片并下载(这里我选取了非js的动态网页//比如bilibili 或者是js https重定向的百度。)

    虽然在此只是有针对性的采集了logo,但是爬虫要是这么怂的那还写锤子。继续:

(奥对了,你要是有幸看到角落里的这个垃圾程序的时候别乱换一些危险未知的网址去运行,天知道会下载下来什么,没有任何校检(因为我不会写也看不懂别人的削减)尤其是当你用管理员权限运行这个程序时, 电脑基本已经处于危险之中。如果执行了网页上的一个文件, 那个文件把自己传送到了 ../../../../usr/bin/python 里面, 会发生什么呢?下一次你再运行 Python 程序时,你的电脑就可能会安装恶意软件。 那时候我岂不是很尴尬)

    上面强行用os内库提供了一波支持,os 模块是Python 与操作系统进行交互的接口, 它可以操作文件路径,创建目录,获取运行进程和环境变量的信息,以及其他系统相关的操作。

把数据存储到CVS

    CSVComma-Separated Values,逗号分隔值)是存储表格数据的常用文件格式。 Microsoft Excel 和很多应用都支持 CSV 格式,因为它很简洁。 Python 一样, CSV 里留白( whitespace)也是很重要的:每一行都用一个换行符分隔,列与列之间用逗号分隔( 因此也叫“逗号分隔值”)。 CSV 文件还可以用 Tab 字符或其他字符分隔行,但是不太常见,用得不多。
    Python csv 库可以非常简单地修改 CSV 文件,甚至从零开始创建一个 CSV 文件:

得到这样一个表格(.cvs)


    Python 新建文件的机制考虑得非常周到( bullet-proof)。如果 ../test.csv不存在, Python 会自动创建文件(不会自动创建文件夹)。如果文件已经存在, Python 会用新的数据覆盖 test.csv 文件。网络数据采集的一个常用功能就是获取 HTML 表格并写入 CSV 文件。
    维基百科的文本编辑器对比词条( https://en.wikipedia.org/wiki/Comparison_of_text_editors) 中用了许多复杂的 HTML 表格, 用到了颜色、链接、排序,以及其他在写入 CSV 文件之前需要忽略的HTML 元素。用 BeautifulSoup get_text() 函数 :

最终正题

    之前对于数据库是有使用过oracle和mysql两个的,这里暂时使用mysql来与python整合使用:但遗憾的是python没有内置支持mysql的库。所以得日常pip一下:

这里给个传送门(我自己用pycharm偷懒的):http://blog.csdn.net/wklken/article/details/7253245

    在完成上面的环境搭建之后就能够进入正题了。(每次搭环境都贼累。希望有时间出一系列软件安装或者是环境搭建的博文)

    我之前课设做医院门诊管理系统遗留下来的孤儿系统的数据库:


    这段程序有两个对象:连接对象( conn)和光标对象( cur)。连接 / 光标模式是数据库编程中常用的模式,不过刚刚接触数据库的时候,有些用户很难区分两种模式的不同。 连接模式除了要连接数据库之外,还要发送数据库信息,处理回滚操作(当一个查询或一组查询被中断时,数据库需要回到初始状态,一般用事务控制手段实现状态回滚),创建新的光标对象,等等。而一个连接可以有很多个光标。 一个光标跟踪一种状态state)信息,比如跟踪数据库的使用状态。如果你有多个数据库,且需要向所有数据库写内容,就需要多个光标来处理。光标还会包含最后一次查询执行的结果。 通过调用光标函数,比如 cur.fetchone(),可以获取查询结果。用完光标和连接之后, 千万记得把它们关闭。如果不关闭就会导致连接泄漏connection leak), 造成一种未关闭连接现象, 即连接已经不再使用,但是数据库却不能关闭,因为数据库不能确定你还要不要继续使用它。 这种现象会一直耗费费数据库的资源,所以用完数据库之后记得关闭连接!

    其实路走到这里我们离胜利也就不远了,但是准备工作并未做完,遍历的数据大多很不是你能控制的那种规范格式 ,而我在之前的很多次开发和编程当中字符编码问题一直让我很头疼,所以为了避免待会出现各种奇怪的东西,请创建一个支持unicode编码的库来存放数据。(也可以统一输入输出为utf-8)

    创建一个用于遍历存储的库:


进行遍历


    这里有几点需要注意:首先, charset='utf8' 要增加到连接字符串里。这是让连接 conn 把所有发送到数据库的信息都当成 UTF-8 编码格式(当然,前提是数据库默认编码已经设置成 UTF-8)。
    然后要注意的是
store 函数。它有两个参数: title content,并把这两个参数加到了一个 INSERT 语句中并用光标执行,然后用光标进行连接确认。这是一个让光标与连接操作分离的好例子; 当光标里存储了一些数据库与数据库上下文( context)的信息时,需要通过连接的确认操作先将信息传进数据库,再将信息插入数据库。
    最后要注意的是,
finally 语句是在程序主循环的外面,代码的最底下。这样做可以保证,无论程序执行过程中如何发生中断或抛出异常( 当然,因为网络很复杂,你得随时准备遭遇异常),光标和连接都会在程序结束前立即关闭。 (前段时间使用I/O流时惯用的操作。很棒的解决办法呢。)

    还有这个程序的运行并不顺利,环境就整的我够呛,还好工具多网络猛,官方文档:http://legacy.python.org/dev/peps/pep-0249/ 当然我其实开了很多的后门,没有主键且支持可以空的表结构,外加一个申请10000长度的表空间,在一定意义上来讲我已经是失败者了。但是无奈这是现在我能看懂的唯一解决办法了。坑挖好,会来填的//还有其他的遍历。慢慢摸索(话说最近要开始找工作了我真的想先点菜。加油啦。)

发表评论

电子邮件地址不会被公开。 必填项已用*标注