爬虫分步:抓取页面、分析页面、存储数据。
3. 存储数据(MySQL 8.0+Redis 5.0.4安装)
1.抓取页面
1.1 网页结构基础
网页分为HTML、CSS、JavaScript三部分,有位大佬曾拿网页以人作比拟,HTML是骨架,JavaScript是肌肉,CSS是肌肤,形象至极。以Google Chrome浏览器为例,F12键或者右键“查看网页源代码”即可查看当前的网页源代码。
通过“选择”按钮和“Elements”选项卡可以获取网页指定区域的源代码文本格式及位置信息,另外结合google analytics对目标网页进行访问数据统计和分析,感兴趣的可以了解下。
1.2 HTML基础知识
推荐阅读https://www.runoob.com/html/html-tutorial.html,本节内容参考该分享。
- <!DOCTYPE html> 声明为 HTML5 文档,<!DOCTYPE>声明有助于浏览器中正确显示网页;
- <html> 元素是 HTML 页面的根元素;
- <head> 元素包含了文档的元(meta)数据,如 <meta charset="utf-8"> 定义网页编码格式为 utf-8;
- <title> 元素描述了文档的标题;
- <body> 元素包含了可见的页面内容;
- <h1>~<h6> 元素定义标题,字号逐级变小;
- <p> 元素定义段落。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>爬虫基础—HTML</title>
</head>
<body>
<h1>第1个标题</h1>
<p>第1个段落</p>
<h1>第2个标题</h1>
<p>第2个段落</p>
<a href="https://book.douban.com/tag/绘本">带链接的内容</a>
</body>
</html>
以上内容存为.html文件,双击该文件:
1.3 div区块
- <div> 是HTML最主要的区块,由于它属于块级元素,浏览器会在其前后显示折行,如果与 CSS 一同使用,<div> 元素可用于对大的内容块设置样式属性。
- <div> 元素的另一个常见的用途是文档布局,取代了使用表格定义布局的老式方法,使用 <table> 元素进行文档布局不是表格的正确用法,<table> 元素的作用是显示表格化的数据。
1.4 Requests 库
Requests唯一的一个非转基因的 Python HTTP 库,人类可以安全享用,属于第三方库,参详https://requests.readthedocs.io/zh_CN/latest/,使用它先正确安装它,方式:
-
[root@chengyu ~]# pip install request
-
[root@chengyu ~]# conda install request
-
如果是Pycharm中安装:File—>Settings—>你的Project name—>Interpreter—>“+”—>输入request—>install
-
自主选择request版本可以下载源码安装,如下:
可以通过Github获取到代码:git clone git://github.com/kennethreitz/requests.git
也可以curl下载tarball:$ curl -OL https://github.com/requests/requests/tarball/master
下载后,执行安装:
$ cd requests
$ pip install .
Requests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美运行,Requests功能特性:
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持
.netrc
关于request库的使用指路:https://requests.readthedocs.io/zh_CN/latest/user/quickstart.html。
另外关于自动化测试工具selenium库的安装就不赘述了,下面就ChromeDrive驱动(Chrome浏览器下配合selenium库实现网页抓取)的安装配置做一下简单的说明,这里仅说明Windows环境下的情况。
-
查看Chrome的版本,帮助—>“关于Google Chrome”,如下版本号81.0:
-
打开ChromeDrive官网,选择对应Chrome版本号81.0的安装包下载http://npm.taobao.org/mirrors/chromedriver/,将chromedriver.exe放置到Python的Scripts目录下。
安装完毕:
2. 解析页面
获取网页源代码的之后,需要提取其中的数据信息,也就是我们想要爬取的对象,这里有几个常用的解析库需要安装,具体什么时候用具体用哪个先不予深究,先看下官方介绍:
-
lxml库(XML Path Language):座右铭为“the thrills without the strangeness”,python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高,具体介绍和使用参详官方https://lxml.de/。
-
Beautiful Soup库:和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据,官文https://www.crummy.com/software/BeautifulSoup/bs4/doc/。
-
PyQuery库:提供和jQuery相似的语法来解析HTML文档,支持CSS选择器。相较之下,它的文案真的,额,有点弱:https://pyquery.readthedocs.io/en/latest/或https://pypi.org/project/pyquery/。
安装类似Request库。
3. 存储数据(MySQL 8.0+Redis 5.0.4安装)
说到存储就得说到数据库:关系型或者非关系型,本文中以关系型数据库MySQL 8.0和非关系数据库Redis 5.0.4为例。
3.1 Linux下MySQL 8.0安装
Windows下MySQL的安装傻瓜式就不多说了,这里就啰嗦一下Linux环境下的,这是之前一台测试机上的安装笔记,凑个数。
- MySQL源码包下载
[root@chengyu ~]# cd /home/software/mysql/
[root@chengyu mysql]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.12.tar.gz
[root@chengyu mysql]# tar zxvf mysql-8.0.12.tar.gz
- 依赖包安装
相关的依赖包需求可以参详:https://dev.mysql.com/doc/refman/8.0/en/source-installation.html。
[root@chengyu mysql]# yum -y install cmake gcc gcc-c++ ncurses ncurses-devel libaio-devel openssl openssl-devel
- Boost下载安装
Mysql5.7版本更新后有很多变化,比如json等,安装必须要BOOST库,不过mysql的官网源码有带boost库的源码和不带boost库的源码两种,因此有两种安装方式,其实都是一样的,仅仅是不带boost库源码的需要单独安装boost,boost库可以大大地提高软件的开发效率,就像C#里类库,或者JAVA里类库,它是C++的类库。
[root@chengyu mysql]# wget --no-check-certificate https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.gz
[root@chengyu mysql]#tar -zxvf /home/software/mysql/boost_1_67_0.tar.gz -C /usr/local
[root@chengyu mysql]#cd /usr/local
[root@chengyu local]# mv boost_1_67_0 boost
[root@chengyu local]#cd boost/
[root@chengyu boost]#./bootstrap.sh
[root@chengyu boost]#./b2 install
- 创建MySQL安装目录与数据文件目录:
[root@chengyu mysql]# mkdir -p /usr/local/mysql
[root@chengyu mysql]# mkdir -p /home/mysql
[root@chengyu mysql]# mkdir -p /home/mysql/data
[root@chengyu mysql]# mkdir -p /home/mysql/logs
- 创建MySQL用户
[root@chengyu mysql]# groupadd mysql
[root@chengyu mysql]# useradd -r -g mysql -s /bin/false mysql
[root@chengyu mysql]# chown -R mysql:mysql /usr/local/mysql
[root@chengyu mysql]# chown -R mysql:mysql /home/mysql
- 添加MySQL PATH路径并开放3306端口
[root@chengyu ~]#vim /etc/profile
#for mysql
export MYSQL_HOME=/usr/local/mysql
export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
[root@chengyu mysql]# source /etc/profile
防火墙的3306端口默认没有开启,若要远程访问,需要开启这个端口
[root@chengyu ~]#vim /etc/sysconfig/iptables
-A INPUT-m state--state NEW-m tcp-p tcp--dport 3306
-j ACCEPT
[root@chengyu ~]#/etc/init.d/iptables restart
或者systemctl restart iptables
-
使用cmake编译并安装MySQL
[root@chengyu mysql]# cd mysql-8.0.12/
# 编译
[root@chengyu mysql-8.0.12]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/home/mysql/data \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_0900_ai_ci \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_BOOST=/usr/local/boost
# 安装MySQL 8
[root@chengyu mysql-8.0.12]#make&&make install
设置开机启动:
[root@chengyu mysql-8.0.12]# cd /usr/local/mysql
[root@chengyu mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@chengyu mysql]# chmod 755 /etc/init.d/mysqld
[root@chengyu mysql]# chkconfig --add mysqld
[root@chengyu mysql]# chkconfig --level 345 mysqld on
[root@chengyu mysql]# chkconfig --list mysqld
-
初始化配置
[root@chengyu mysql]# bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/home/mysql/data --user=mysql
2018-09-13T06:11:05.514846Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2018-09-13T06:11:05.515424Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.12) initializing of server in progress as process 12285
2018-09-13T06:11:08.729118Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: rakcnujab6,C
2018-09-13T06:11:10.601783Z 0 [System] [MY-013170] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.12) initializing of server has completed
从MySQL 5.7.18开始,my-default.cnf不再包含在分发包中或由分发包安装,这里我们从其他版本的MySQL中拷贝一份my-default.cnf,并做相应的修改。
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# These are commonly set, remove the # and set as required.
basedir =/usr/local/mysql
datadir =/home/mysql/data
port = 3306
# server_id = .....
socket = /usr/local/mysql/mysql.sock
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- 启动MySQL
[root@chengyu mysql]# systemctl start mysqld
[root@chengyu mysql]# systemctl status mysqld
- 登录数据库并修改初始密码:
[root@chengyu mysql]# mysql -uroot -p
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> set password='123456';
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
初始化的MySQL 8与MySQL5.6.xx不同之处:
(1)初始化工具不同
MySQL5.6.xx使用的是mysql_install_db,MySQL5.7.6+开始官方推荐使用mysqld -initialize。
(2)初始化数据库不同
MySQL5.6.xx初始化之后存在mysql,information_schema,performance_schema,test四个数据库,MySQL5.7.6+初始化之后存在mysql,information_schema,performance_schema,sys四个数据库。
(3)初始化用户不同
MySQL5.6.xx初始化之后存在root@localhost,root@'::1',root@'hostname',''@'localhost',''@'hostname'五个用户,MySQL5.7.6+初始化之后存在mysql.sys,root@localhost用户
(4)初始化root密码
MySQL5.6.xx初始化之后root用户密码为空,MySQL5.7.6+初始化之后会为root@localhost用户生成随机密码。
MySQL的安装到这里结束,另Python与MySQL要交互还需要PyMySQL库的协助,PyMySQL库的安装类似Request库,略过。
3.2 Linux下Redis 5.0.4安装
Redis的代码遵循ANSI-C编写,可以在所有POSIX系统(如Linux, *BSD, Mac OS X, Solaris等)上安装运行,而且Redis并不依赖任何非标准库,也没有编译参数必需添加。非关系型数据库Redis在Windows下的图形界面形式的安装比较简单,就不说了,这里仅Linux环境情况简单说明下。
- 下载解压Redis
Redis可以到它的官网:http://www.redis.cn/进行下载:
[root@chengyu ~]# mkdir -p /home/softwares/nosql
[root@chengyu ~]# cd nosql/
[root@chengyu nosql]# wget http://download.redis.io/releases/redis-5.0.4.tar.gz
Redis可以解压至任何目录,一个make安装即可获得执行、配置文件。
[root@chengyu nosql]# tar xzf redis-5.0.4.tar.gz
[root@chengyu nosql]# cd redis-5.0.4
- 编译
[root@chengyu redis-5.0.4]# make
或者
[root@chengyu redis-5.0.4]# make test
报错:
报错对安装没事:对于最新稳定版5.0.4,可以先进行make test,test完毕后,顺利会有绿色字体提示:
再执行:make&make install。
make命令执行完成之后,会在src目录下生成8个可执行文件,主要几个分别是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump,它们的作用如下:
(1)redis-server:Redis服务器的daemon启动程序;
(2)redis-cli:Redis命令行操作工具。或者通过telnet进行纯文本协议操作;
(3)redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能;
(4)redis-check-dump:用于本地数据库检查;
(5)redis-check-aof:更新日志检查。
-
安装
可以使用make install PREFIX=/usr/local/redis 指定安装目录
[root@chengyu redis-5.0.4]# mkdir -p /usr/local/redis
[root@chengyu redis-5.0.4]# make install PREFIX=/usr/local/redis
-
自启动
make install安装命令是不带自启动脚本的,而redis官方提供了一个手动编译时的自启动脚本,但是需要通过另外一个工具来安装,切换到目录中的utils目录下:
[root@chengyu ~]# /home/softwares/nosql/redis-5.0.4/utils/install_server.sh
在/etc/init.d/目录下可以看到redis_6379这个自启动脚本(也可以自己编写自启动脚本):
[root@chengyu ~]# ll /etc/init.d/
###########################
PATH=/usr/local/redis/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
REDIS_CLI=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/etc/redis.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$REDIS_CLI -p $REDISPORT SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
##############################
[root@chengyu ~]# systemctl start redis_6379
[root@chengyu ~]# systemctl status redis_6379
- 查看进程,确认Redis已经启动
[root@chengyu ~]# ps -ef | grep redis 验证并关闭Redis服务
[root@chengyu ~]# redis-cli ping
PONG
[root@chengyu ~]# redis-cli shutdown
[root@chengyu ~]# redis-cli ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused
- 用客户端测试一下是否启动成功
[root@chengyu ~]# redis-cli
127.0.0.1:6379> set ss 10
OK
127.0.0.1:6379> get ss
"10"
另外想要除本地以外的机子访问,需设置:vim /etc/redis.conf
bind 192.183.3.194 127.0.0.1
protected-mode no
设置密码(保证连接保密与安全性):
requirepass redistest
daemonize yes