初探python之做一個簡單小爬蟲

SangSir發表於2019-03-02

準備工作

初探python,這個文章屬於自己的一個總結。所以教程面向新手,無技術含量。
python環境Linux基本都有,Windows下官網也提供了便利的安裝包,怎麼安裝配置網上有很多教程在此就不一一說明。
我使用的python版本為Python 3.6.4,後面的程式碼也是基於python3的。

分析需求

做一個小爬蟲離不開獲取網頁內容和匹配儲存內容,那麼我們先裝上python爬蟲的老朋友requests:
pip install requests
再裝上pymysql擴充套件,方便將匹配到的內容插入到mysql資料庫中:
pip install pymysql

第一步:獲取網頁內容

在python中有意思的是你需要什麼,就去import什麼,不像php一樣獲取網頁內容直接來個file_get_contents完事兒
廢話不多說,貼出程式碼來看一下:

# -*- coding:utf-8 -*-

# 載入 requests 模組
import requests
# GET方式獲取 Response 物件
response = requests.get(`https://www.xxx.com/`)
if response:
    # 輸出html程式碼到控制檯
    print(response.text)
else:
    # 輸出錯誤資訊
    print(`requests error`)
複製程式碼

在python中縮排一定要嚴格,初學者(4個空格為語句塊縮排)經常犯的錯誤是tab鍵和空間鍵混用,造成的縮排不一致。凡是報錯資訊看到:IndentationError: unexpected indent ,就是表示縮排不一致。
如果本身沒有編碼基礎,那麼我推薦你看一下python的基本概念:www.kuqin.com/abyteofpyth…
如果已經有了編碼基礎但對縮排這方面沒有深究,可以看python的縮排規範:www.kuqin.com/abyteofpyth…

好,寫完程式碼之後我們拿到控制檯試一下,完美輸出html程式碼

requests

第二步:正則匹配內容

既然能夠獲取html程式碼,那我們就要找出需要的部分,這就用上了正則。Python 自1.5版本起增加了 re 模組,它提供 Perl 風格的正規表示式模式。具體細節可以在菜鳥教程中檢視:www.runoob.com/python/pyth…,話不多說再貼程式碼:

# -*- coding:utf-8 -*-
# 載入 requests 模組
import requests
# 載入 re 模組
import re

response = requests.get(`https://www.xxx.com/`)
# 正則匹配文字
match = re.findall(r`<p><!--markdown-->([sS]*?)</p>`, response.text)
if match:
    # 輸出匹配的內容到控制檯
    print(match[0])
else:
    # 輸出html程式碼到控制檯
    print(response.text)
複製程式碼
re

注:原網址為隨機一句文字顯示,每重新整理一次就會變化一次。

第三步:迴圈匹配並加入資料庫中

首先我們把資料庫和表做好,可以用sql語句建立:

CREATE DATABASE IF NOT EXISTS `sentence`;
USE `sentence`;

CREATE TABLE IF NOT EXISTS `sexy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(50) NOT NULL,
  `datetime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `content` (`content`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
複製程式碼

這裡將content設定為了UNIQUE KEY,是為了保證抓取到的內容不重複,如果有已存在的值便直接跳過

# -*- coding:utf-8 -*-
# 載入 requests 模組
import requests
# 載入 re 模組
import re
# 載入 pymysql 模組
import pymysql

# 開啟資料庫連線
db = pymysql.connect(`127.0.0.1`, `root`, `root`, `sentence`, charset=`utf8`)
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()

#死迴圈到天長地久
while(True):
    response = requests.get(`https://www.xxx.com/`)
    # 正則匹配文字
    match = re.findall(r`<p><!--markdown-->([sS]*?)</p>`, response.text)
    if match:
        sql = "INSERT INTO `sexy` (`content`) VALUES (`%s`)" % (match[0])
        try:
           # 執行sql語句
           cursor.execute(sql)
           # 提交到資料庫執行
           db.commit()
        except:
           # 如果發生錯誤則回滾
           db.rollback()
        # 輸出sql語句到控制檯
        print(sql)
    else:
        # 輸出html程式碼到控制檯
        print(response.text)
複製程式碼

執行演示:

pymysql

資料庫內容:

mysql

總結

python是個好東西,萬物based on python
感覺教程貼比較難寫,每個地方都有細節,但如果講細了文章又太繁瑣,若簡單些不好取捨初學者又看不懂什麼意思,向那些寫易懂的入門教程文章的作者致敬。
注:由於原網址不方便公佈,程式碼中的網址全部替換為了xxx.com。
原始碼在Github中:github.com/st1ven/Pyth…,歡迎Star

相關文章