天堂伞雨伞价格联盟

VSRC唯科普 数据的存储(第5/14篇)

唯品会安全应急响应中心2018-05-18 08:25:21
VSRC唯科普 | 数据的存储

第5/14篇


随着数据的不断增多,并且需要进行数据分析时,就不能只是简单的在命令行里面运行程序了,为了可以远程使用大部分的网络爬虫,我们需要把采集到的数据存储起来。


01

媒体文件


存储媒体文件主要有2种方式:只获取URL文件链接,或直接把源文件下载下来。

你可以通过媒体文件所在的URL链接直接饮用他们,这样做的优点有:

(1)爬虫运行得更快,耗费的流量较少,因为只需要链接,不需要下载文件;

(2)可以节省很多存储空间,因为只需要存储URL链接就可以;

(3)存储URL的代码更容易写,也不需要实现文件下载代码;

(4)不下载文件能够降低目标服务器的负载;


不过这么做也有一些缺点:

(1)这些内嵌在你网站或应用中的外站URL链接被称为盗链hotlinking,使用盗链可能会让你麻烦不断,并且每个网站都会实施防盗链措施;

“盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。”

(2)由于你的链接是在其他人的服务器上,所以资源取决于第三方服务器是否运行;


如果你还在犹豫究竟是存储文件还是存储文件的URL资源,可以想想这些文件是要多次使用还是只是存储起来等着落灰,再也不会被打开了。如果答案是后者,建议最好还是只存储URL,如果是前者,那么继续往下看吧。


下列这段程序会下载http://pythonscraping.com上所有标记为src属性的文件链接:




运行结果如下:




这个程序首先使用Lambda函数选择首页上所有带有src属性的标签,然后对URL链接进行清理和标准化,获得文件的绝对路径(而且去掉了外链),最后每个都会下载到程序所在文件夹的downloaded文件里。这里Python 的os模块用来获取每个下载文件的目标文件夹,建立完整的路径。Os模块是python与操作系统进行交互的接口,他可以操作文件路径,创建目录,获取运行程序和环境的变量信息,以及其他系统相关的操作。


02

把数据存储到CSV


逗号分隔型取值格式(英文全称为Comma Separated Values,简称CSV),是一种纯文本格式,用来存储数据。在CSV中,数据的字段由逗号分开,程序通过读取文件重新创建正确的字段。


CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的(往往是私有的和/或无规范的格式)。因为大量程序都支持某种CSV变体,至少是作为一种可选择的输入/输出格式。


例如,一个用户可能需要交换信息,从一个以私有格式存储数据的数据库程序,到一个数据格式完全不同的电子表格。最可能的情况是,该数据库程序可以导出数据为“CSV”,然后被导出的CSV文件可以被电子表格程序导入。


“CSV”并不是一种单一的、定义明确的格式(尽管RFC 4180有一个被通常使用的定义)。因此在实践中,术语“CSV”泛指具有以下特征的任何文件:

(1)纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;

(2)由记录组成(典型的是每行一条记录);

(3)每条记录被分隔符分隔为字段;

(4)每条记录都有同样的字段序列。


在这些常规的约束条件下,存在着许多CSV变体,故CSV文件并不完全互通。然而,这些变异非常小,并且有许多应用程序允许用户预览文件(这是可行的,因为它是纯文本),然后指定分隔符、转义规则等。如果一个特定CSV文件的变异过大,超出了特定接收程序的支持范围,那么可行的做法往往是人工检查并编辑文件,或通过简单的程序来修复问题。因此在实践中,CSV文件还是非常方便的。


Python的csv库可以非常简单的修改CSV文件,甚至从零开始创建一个CSV文件。网络数据采集的一个常用功能就是获取HTML表格并写入CSV文件,以WIKI百科的文本编辑器https://en.wikipedia.org/wiki/Comparison_of_text_editors,对比词条中用了许多复杂的HTML表格,用到了颜色,链接,排序以及其他在写入CSV文件之前需要忽略的HTML元素。用BeautifulSoup和get_text()函数,可以用十几行代码完成这件事:




这段代码会在上层目录内新建一个CSV文件,../files/editors.csv,并且将采集到的信息保存进editors.csv内:




03

MySQL


MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。


MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。


与其他的大型数据库,例如 Oracle、DB2、SQL Server等相比,MySQL 自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQ L是开放源码软件,因此可以大大降低总体拥有成本。


Linux作为操作系统,Apache和 Nginx作为 Web 服务器,MySQL 作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“或“LNMP”组合。


MySQL与Python的整合

python 没有内置的MySQL支持工具,不过有许多开源的库可以用来与MySQL做交互,最有名的一个库就是PyMySQL。将服务器处于运行状态,就可以使用以下命令链接数据库:




这段程序有两个对象:连接对象conn和光标对象cur


连接/光标模式是数据库编程中常用的模式。连接模式除了要连接数据库之外,还需要发送数据库信息,处理回滚操作(当一个查询或一组查询被中断时,数据库需要回到初始状态,一般用事务控制手段实现状态回滚),创建新的光标对象等。


而一个连接可以有很多个光标,一个光标跟踪一个状态state信息,通过调用光标函数,比如cur.fetchone()可以获取查询结果。用完光标和连接之后记得关闭,否则将会导致数据库无法关闭,最终耗费数据库资源。


当数据库连接WIKI百科的信息之后,可以使用下列程序往数据库内存储数据:




查看存储的结果如下:






首先,charst=’utf-8’要增加到链接字符串里面,然后要注意store函数的两个参数:title和content,并把这两个参数加到一个insert光标内执行,并用光标进行确认。


这是一个让光标和连接操作分离的好例子;当光标捏存储了一些数据库与数据库上下文context信息时,需要通过连接的确认操作先将信息传进数据库,再将信息插入数据库。

最后要注意的是,finally语句是在程序主循环外面,代码最底下,这样做可以保证无论程序执行中发生中断或抛出异常,光标和连接都会在程序结束之前关闭。


虽然PyMySQL规模不大,但是里面有一些非常实用函数,具体可以参考Python的DBAPI标准文档。


04

EMAIL


与网页通过HTTP协议传输一样,邮件通过SMTP传输。


SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。


通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。


跟大多数应用层协议一样,SMTP也存在两个 端:在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服 务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。


SMTP协议与人们用于面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务 器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再尝试建立该连接。


SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。 在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息。


用Python发送一封邮件只需要9行代码:




Python有2个包可以发送邮件:smtplib和email


smtp实例封装一个smtp连接,它支持所有的SMTP和ESMTP操作指令,如果host和port参数被定义,则smtp会在初始化期间自动调用connect()方法,如果connect()方法失败,则会触发SMTPConnectError异常,timeout参数设置了超时时间。在一般的调用过程中,应该遵connetc()、sendmail()、quit()步骤。




唯科普 | 《数据采集》目录

A.K.A "小白终结者"系列

第1篇、初识网络通信

第2篇、来点更精彩的正则表达式吧

第3篇、多种数据采集方式

第4篇、让我们加入点API

第5篇、数据的存储

第6篇、我们如何读取文件

第7篇、海量数据如何清洗

第8篇、谈点自然语言的处理

第9篇、穿越网页表单与登录窗口的采集

第10篇、关于数据的采集姿势

第11篇、图像识别与文字处理

第12篇、避开采集的陷阱

第13篇、开始来点正经的吧

第14篇、一点总结与心得



VSRC | 唯科普



VSRC 唯科普 来了!

唯科普是VSRC一个面向大众的科普专栏,唯科普旨在分享各种有趣的干货文章,将会由浅入深,推出各种专题连载,此次的《小白终结者系列之“基于Python的数据采集》,暂定有14篇,该系列将会从底层网络通信开始,讲解数据包的传递,正则表达式的书写,基于API的数据采集,数据存储,文件读取,数据清洗,自然语言处理等。希望唯科普,能受到大家的喜欢。大家若有任何想法,欢迎随时与我们交流。



精彩原创文章投稿有惊喜!

欢迎投稿!

VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送(至少为500元唯品卡)我们为您准备的丰富奖品包括但不仅限于:MacbookAir、VSRC定制雨伞,VSRC定制水杯以及VSRC精美靠枕(活动最终解释权归VSRC所有)


我们聆听您宝贵建议


不知道,大家都喜欢阅读哪些类型的信息安全文章?

不知道,大家都希望我们更新关于哪些主题的干货?

现在起,只要您有任何想法或建议,欢迎直接回复本公众号留言!

精彩留言互动的热心用户,将有机会获得VSRC赠送的精美奖品一份!

同时,我们也会根据大家反馈的建议,选取热门话题,进行原创发布!


点击原文阅读 VSRC唯科普 |(第4/14篇)