Python3网络爬虫数据采集.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Python3网络爬虫数据采集.pdf》由会员分享,可在线阅读,更多相关《Python3网络爬虫数据采集.pdf(222页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 图灵社区的电子书没有采用专有客 户端,您可以在任意设备上,用自 己喜欢的浏览器和PDF阅读器进行 阅读。 但您购买的电子书仅供您个人使用, 未经授权,不得进行传播。 我们愿意相信读者具有这样的良知 和觉悟,与我们共同保护知识产权。 如果购买者有侵权行为,我们可能 对该用户实施包括但不限于关闭该 帐号等维权措施,并可能追究法律 责任。 ? 图 灵 程 序 设 计 丛 书 人 民 邮 电 出 版 社 北 京 Web Scraping with Python Collecting Data from the Modern Web 美Ryan Mitchell 著 陶俊杰 陈小莉 译 Python网
2、络数据采集 Beijing Cambridge Farnham Kln Sebastopol Tokyo OReilly Media, Inc.授权人民邮电出版社出版 内 容 提 要 本书采用简洁强大的 Python 语言,介绍了网络数据采集,并为采集新式网络中的各种数据类 型提供了全面的指导。第一部分重点介绍网络数据采集的基本原理: 如何用 Python 从网络服务器 请求信息,如何对服务器的响应进行基本处理,以及如何以自动化手段与网站进行交互。第二部 分介绍如何用网络爬虫测试网站,自动化处理,以及如何通过更多的方式接入网络。 本书适合需要采集 Web 数据的相关软件开发人员和研究人员阅读。
3、 定价:59.00元 读者服务热线:(010)51095186转600 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京东工商广字第 8052 号 著 美 Ryan Mitchell 译 陶俊杰 陈小莉 责任编辑 岳新欣 执行编辑 李 敏 责任印制 杨林杰 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315 网址 北京 印刷 开本:8001000 1/16 印张:13.5 字数:280千字 2016年 3 月第 1 版 印数:12 001 14 500册 2016年 10 月北京第 4 次印刷 著作权合同
4、登记号 图字:01-2015-8108号 (2016.10重印) 欢迎加入非盈利Py t h o n 编程学习交流QQ群783462347,群里免费提供500+本Py t h o n 书籍! iii 版权声明 2015 by Ryan Mitchell. Simplifi ed Chinese Edition, jointly published by OReilly Media, Inc. and Posts 因为每个 MySQL 实例可以有多个数据库,所以使用某个数据库之前需要指定数据库的 名称: USE scraping; 从现在开始(直到关闭 MySQL 链接或切换到另一个数据库之前)
5、 ,所有的命令都运行在这 个新的“scraping”数据库里面。 所有操作看着都非常简单。那么,在数据库里创建数据表的方法应该也类似吧?让我们在 数据库里创建一个表来存储采集的网页: CREATE TABLE pages; 结果显示错误: ERROR 1113 (42000): A table must have at least 1 column 和数据库不同,MySQL 数据表必须至少有一列,否则不能创建。为了在 MySQL 里定义字 段(数据列) ,你必须在CREATE TABLE 语句后面,把字段的定义放进一个带括 号的、内部由逗号分隔的列表中: CREATE TABLE pages
6、(id BIGINT(7) NOT NULL AUTO_INCREMENT, title VARCHAR(200), content VARCHAR(10000), created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id); 每个字段定义由三部分组成: 名称(id、title、created等) 数据类型(BIGINT(7)、VARCHAR、TIMESTAMP) 其他可选属性(NOT NULL AUTO_INCREMENT) 在字段定义列表的最后,还要定义一个“主键” (key) 。MySQL 用这个主键来组织表的内 容,便于后
7、面快速查询。在本章后面的内容里,我将介绍如何调整这些主键以提高数据库 的查询速度,但是现在,用表的id列作为主键就可以。 语句执行之后,你可以用DESCRIBE查看数据表的结构: DESCRIBE pages; +-+-+-+-+-+-+ | Field | Type | Null | Key | Default | Extra | +-+-+-+-+-+-+ | id | bigint(7) | NO | PRI | NULL | auto_increment | | title | varchar(200) | YES | | NULL | | 70 第 5 章 | content | v
8、archar(10000) | YES | | NULL | | | created | timestamp | NO | | CURRENT_TIMESTAMP | | +-+-+-+-+-+-+ 4 rows in set (0.00 sec) 当然,这还是一个空表。你可以在 pages 表里插入一些测试数据,如下所示: INSERT INTO pages (title, content) VALUES (Test page title, This is some te st page content. It can be up to 10,000 characters long.); 需
9、要注意的是,虽然 pages 表里有四个字段(id、title、content、created) ,但实际上 你只需要插入两个字段(title和content)的数据即可。因为id字段是自动递增的(每 次新插入数据行时 MySQL 自动增加 1) ,通常不用处理。另外,created字段的类型是 timestamp,默认就是数据加入时的时间戳。 当然,我们也可以自定义四个字段的内容: INSERT INTO pages (id, title, content, created) VALUES (3, Test page title, This is some test page content
10、. It can be up to 10,000 characters long., 2014- 09-21 10:25:32); 只要你定义的整数在数据表的id字段里没有,它就可以顺利插入数据表。但是,这么做 非常不好;除非万不得已(比如程序中断漏了一行数据) ,否则让 MySQL 自己处理id和 timestamp字段。 现在表里有一些数据了,你可以用很多方法来选择这些数据。下面是几个SELECT语句的 示例: SELECT * FROM pages WHERE id = 2; 这条语句告诉 MySQL, “从 pages 表中把id字段中等于 2 的整行数据全挑选出来” 。这个 星号(*
11、)是通配符,表示所有字段,这行语句会把满足条件(WHERE id = 2)的所有字段 都显示出来。如果id字段里没有任何一行等于 2,就会返回一个空集。例如,下面这个不 区分大小写的查询,会返回title字段里包含“test”的所有行(%符号表示 MySQL 字符 串通配符)的所有字段: SELECT * FROM pages WHERE title LIKE %test%; 但是,如果你的表有很多字段,而你只想返回部分字段怎么办?你可以不用星号,而用下 面的方式: SELECT id, title FROM pages WHERE content LIKE %page content%; 这
12、样就只会返回title字段包含“page content”的所有行的id和title两个字段了。 DELETE语句语法与SELECT语句类似: 存储数据 71 DELETE FROM pages WHERE id = 1; 由于数据库的数据删除后不能恢复,所以在执行DELETE语句之前,建议用SELECT确认 一下要删除的数据(本例中,就是用SELECT * FROM pages WHERE id = 1查看) ,然后把 SELECT *换成DELETE就可以了,这会是一个好习惯。很多程序员都有过一些DELETE误操 作的伤心往事,还有一些恐怖故事就是有人慌乱中忘了在语句中放WHERE,结果把
13、所有客 户数据都删除了。别让这种事发生在你身上! 还有一个需要介绍的语句是UPDATE: UPDATE pages SET title=A new title, content=Some new content WHERE id=2; 结合本书的主题,后面我们就只用这些基本的 MySQL 语句,做一些简单的数据查询、创 建和更新工作。如果你对这个强大数据库的命令和技术感兴趣,推荐你去看 Paul DuBois 的 MySQL Cookbook( 。 5.3.3 与Python整合 Python 没有内置的 MySQL 支持工具。不过,有很多开源的库可以用来与 MySQL 做交互, Python
14、 2.x 和 Python 3.x 版本都支持。最有名的一个库就是 PyMySQL( PyMySQL/PyMySQL) 。 写到这里的时候,PyMySQL 的版本是 0.6.2,你可以用下面的命令下载并安装它: $ curl -L | tar xz $ cd PyMySQL-PyMySQL-f953785/ $ python setup.py install 如果需要更新,请检查最新版的 PyMySQL,并修改第一行下载链接中的版本号进行更新。 安装完成之后,你就可以使用 PyMySQL 包了。如果你的 MySQL 服务器处于运行状态, 应该就可以成功地执行下面的命令(记得把 root 账户密
15、码加进去) : import pymysql conn = pymysql.connect(host=127.0.0.1, unix_socket=/tmp/mysql.sock, user=root, passwd=None, db=mysql) cur = conn.cursor() cur.execute(USE scraping) cur.execute(SELECT * FROM pages WHERE id=1) print(cur.fetchone() cur.close() conn.close() 这段程序有两个对象:连接对象(conn)和光标对象(cur) 。 72 第 5
16、 章 连接 / 光标模式是数据库编程中常用的模式,不过刚刚接触数据库的时候,有些用户很难 区分两种模式的不同。连接模式除了要连接数据库之外,还要发送数据库信息,处理回滚 操作(当一个查询或一组查询被中断时,数据库需要回到初始状态,一般用事务控制手段 实现状态回滚) ,创建新的光标对象,等等。 而一个连接可以有很多个光标。一个光标跟踪一种状态(state)信息,比如跟踪数据库的 使用状态。如果你有多个数据库,且需要向所有数据库写内容,就需要多个光标来处理。 光标还会包含最后一次查询执行的结果。通过调用光标函数,比如cur.fetchone(),可以 获取查询结果。 用完光标和连接之后,千万记得把
17、它们关闭。如果不关闭就会导致连接泄漏(connection leak) ,造成一种未关闭连接现象,即连接已经不再使用,但是数据库却不能关闭,因为数 据库不能确定你还要不要继续使用它。这种现象会一直耗费数据库的资源,所以用完数据 库之后记得关闭连接! 刚开始的时候,你最想做的事情可能就是把采集的结果保存到数据库里。让我们用前面维 基百科爬虫的例子来演示一下如何实现数据存储。 在进行网络数据采集时,处理 Unicode 字符串是很痛苦的事情。默认情况下,MySQL 也 不支持 Unicode 字符处理。不过你可以设置这个功能(这么做会增加数据库的占用空间) 。 因为在维基百科上我们难免会遇到各种各
18、样的字符,所以最好一开始就让你的数据库支持 Unicode: ALTER DATABASE scraping CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE pages CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE pages CHANGE title title VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE
19、pages CHANGE content content VARCHAR(10000) CHARACTER SET utf8mb4 CO LLATE utf8mb4_unicode_ci; 这四行语句改变的内容有:数据库、数据表,以及两个字段的默认编码都从utf8mb4 (严格说来也属于 Unicode,但是对大多数 Unicode 字符的支持都非常不好)转变成了 utf8mb4_unicode_ci。 你可以在title或content字段中插入一些德语变音符(umlauts)或汉语字符,如果没有 错误就表示转换成功了。 现在数据库已经准备好接收维基百科的各种信息了,你可以用下面的程序来存储
20、数据: from urllib.request import urlopen from bs4 import BeautifulSoup import re import datetime import random 存储数据 73 import pymysql conn = pymysql.connect(host=127.0.0.1, unix_socket=/tmp/mysql.sock, user=root, passwd=None, db=mysql, charset=utf8) cur = conn.cursor() cur.execute(USE scraping) random
21、.seed(datetime.datetime.now() def store(title, content): cur.execute(INSERT INTO pages (title, content) VALUES (%s, %s), (title, content) mit() def getLinks(articleUrl): html = urlopen(http:/en.wikipedia.org+articleUrl) bsObj = BeautifulSoup(html) title = bsObj.find(h1).get_text() content = bsObj.fi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python3 网络 爬虫 数据 采集
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内