爬蟲分步:抓取頁面、分析頁面、存儲數據。
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