Python手記-6:爬蟲技術基礎(網頁結構基礎+MySQL 8.0+Redis 5安裝)

爬蟲分步:抓取頁面、分析頁面、存儲數據。

1.抓取頁面

1.1 網頁結構基礎

1.2 HTML基礎知識

1.3 div區塊

1.4 Requests 庫

2. 解析頁面

3. 存儲數據(MySQL 8.0+Redis 5.0.4安裝)

3.1 Linux下MySQL 8.0安裝

3.2 Linux下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:

安裝完畢:

2. 解析頁面

獲取網頁源代碼的之後,需要提取其中的數據信息,也就是我們想要爬取的對象,這裏有幾個常用的解析庫需要安裝,具體什麼時候用具體用哪個先不予深究,先看下官方介紹:

安裝類似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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章