【爬蟲入門】【正則表示式】抓取糗事百科的段子2.0
阿新 • • 發佈:2019-01-09
在原有基礎上,增加寫入資料庫操作和網頁翻頁操作
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()