1. 程式人生 > >【爬蟲入門】【正則表示式】抓取糗事百科的段子2.0

【爬蟲入門】【正則表示式】抓取糗事百科的段子2.0

在原有基礎上,增加寫入資料庫操作和網頁翻頁操作

import sqlite3, re
from urllib.request import Request, urlopen


class DBTool(object):
    """
    將資料儲存到資料庫的工具類,主要負責資料庫的增刪改查操作。
    """
    connect = None  # 類屬性需要先宣告
    cursor = None

    # 操作資料庫:
    #   1.建立資料庫的連線物件,建立遊標,這兩個物件一般連線一次即可;2.資料的增刪改查;3.關閉資料庫物件、關閉遊標物件,一般都是在資料儲存完畢之後關閉即可。
    @classmethod
    def create_db_cursor(cls):
        cls.connect = sqlite3.connect('qsbk.db')  # 連線資料庫
        cls.cursor = cls.connect.cursor()  # 建立遊標

    @classmethod
    def insert_sql(cls, tuple_data):
        """
        執行資料插入sql語句的函式
        :param tuple_data: 使用DataTool工具類整理過後的資料
        :return:
        """
        sql_str = 'INSERT INTO qs(nick_name,level,content,vote_number,connent_number) values ("%s","%s","%s","%s","%s")' % (
        tuple_data[0], tuple_data[1], tuple_data[2], tuple_data[3],tuple_data[4])
        # 開始執行sql語句
        cls.cursor.execute(sql_str)
        cls.connect.commit()

    @classmethod
    def close_db_cursor(cls):
        cls.cursor.close()
        cls.connect.close()

修改QSBKSpider類的parse_list_html(self, html)函式為

class QSBKSpider(object):
    """
    爬蟲類
    """
        def parse_list_html(self, html):
        """
        解析上一個函式請求的html原始碼
        :param html: 列表頁的網頁原始碼
        :return:
        """
        if html:
            # 使用正則表示式解析網頁原始碼
            # 寫正則注意事項:
            # 1.儘量找到要匹配的零散的資料所在的標籤,而且這個標籤必須和這些零散的資料一樣能夠迴圈。因為findall()函式在迴圈匹配資料的時候,是按照整個正則表示式規則迴圈匹配的。
            # 2.在參考網頁中"審查元素"來設定正則匹配規則的時候,一定要確認是否和"網頁原始碼"中的標籤順序、屬性順序等保持一致,如果不一致的話,必須參考"網頁原始碼"來設定正則匹配規則。因為"審查元素"中的Html程式碼是經過Js渲染之後的原始碼。
            pattern = re.compile(
                r'<div class="article block.*?>.*?<div class="author clearfix">.*?<h2>(.*?)</h2>.*?<div class="articleGender.*?">(.*?)</div>.*?<div class="content">.*?<span>(.*?)</span>.*?<div class="stats">.*?<i class="number">(.*?)</i>.*?<i class="number">(.*?)</i>',
                re.S)
            results_list = re.findall(pattern, html)
            for data in results_list:
                new_data = self.tool.process_tuple_data(data)
                # print(new_data)
                DBTool.insert_sql(new_data)
        else:
            print("html原始碼為None")

呼叫修改為

# 建立資料庫物件、遊標物件
DBTool.create_db_cursor()

obj = QSBKSpider()
#迴圈爬取多頁資料
for x in range(1,10):
    #range()取[1,10)之間的整數,能取1,無法取到10
    html = obj.get_list_html(x)
    obj.parse_list_html(html)

# 關閉資料庫物件、遊標物件
DBTool.close_db_cursor()