1. 程式人生 > >Python學習之路 (五)爬蟲(四)正則表示式爬去名言網

Python學習之路 (五)爬蟲(四)正則表示式爬去名言網

auth Python標準庫 我們 color 匯總 eight code 比較 school

爬蟲的四個主要步驟

  1. 明確目標 (要知道你準備在哪個範圍或者網站去搜索)
  2. 爬 (將所有的網站的內容全部爬下來)
  3. 取 (去掉對我們沒用處的數據)
  4. 處理數據(按照我們想要的方式存儲和使用)

什麽是正則表達式

正則表達式,又稱規則表達式,通常被用來檢索、替換那些符合某個模式(規則)的文本。

正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。

給定一個正則表達式和另一個字符串,我們可以達到如下的目的:

  • 給定的字符串是否符合正則表達式的過濾邏輯(“匹配”);
  • 通過正則表達式,從文本字符串中獲取我們想要的特定部分(“過濾”)。

技術分享圖片

正則表達式匹配規則

技術分享圖片

Python 的 re 模塊

在 Python 中,我們可以使用內置的 re 模塊來使用正則表達式。

有一點需要特別註意的是,正則表達式使用 對特殊字符進行轉義,所以如果我們要使用原始字符串,只需加一個 r 前綴,示例:

r‘chuanzhiboke\t\.\tpython‘

使用正則爬去名言網的名言,只獲取首頁的10條數據

from urllib.request import urlopen
import re

def spider_quotes():

    url 
= "http://quotes.toscrape.com" response = urlopen(url) html = response.read().decode("utf-8") # 獲取 10 個 名言 quotes = re.findall(<span class="text" itemprop="text">(.*)</span>,html) list_quotes = [] for quote in quotes: # strip 從兩邊開始搜尋,只要發現某個字符在當前這個方法的範圍內,統統去掉
list_quotes.append(quote.strip("“”")) # 獲取 10 個名言的作者 list_authors = [] authors = re.findall(<small class="author" itemprop="author">(.*)</small>,html) for author in authors: list_authors.append(author) # 獲取這10個名言的 標簽 tags = re.findall(<div class="tags">(.*?)</div>,html,re.RegexFlag.DOTALL) list_tags = [] for tag in tags: temp_tags = re.findall(<a class="tag" href=".*">(.*)</a>,tag) tags_t1 = [] for tag in temp_tags: tags_t1.append(tag) list_tags.append(",".join(tags_t1)) # 結果匯總 results = [] for i in range(len(list_quotes)): results.append("\t".join([list_quotes[i],list_authors[i],list_tags[i]])) for result in results: print(result) #調取方法 spider_quotes()

BeautifulSoup4解析器

BeautifulSoup 用來解析 HTML 比較簡單,API非常人性化,支持CSS選擇器、Python標準庫中的HTML解析器,也支持 lxml 的 XML解析器。

官方文檔:http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0

使用BeautifulSoup4獲取名言網首頁數據

from urllib.request import urlopen
from bs4 import BeautifulSoup

url = "http://quotes.toscrape.com"
response = urlopen(url)

# 初始化一個 bs 實例
#  對應的response對象的解析器, 最常用的解析方式,就是默認的  html.parser
bs = BeautifulSoup(response, "html.parser")

#  獲取 10  個  名言
spans = bs.select("span.text")
list_quotes = []
for span in spans:
    span_text = span.text
    list_quotes.append(span_text.strip("“”"))

# 獲取 10 個名言的作者
authors = bs.select("small")
list_authors = []
for author in authors:
    author_text = author.text
    list_authors.append(author_text)

# 獲取這10個名言的  標簽
divs = bs.select("div.tags")
list_tags = []
for div in divs:
    tag_text = div.select("a.tag")
    tag_list = [ tag_a.text for tag_a in tag_text]
    list_tags.append(",".join(tag_list))

#結果匯總
results = []
for i in range(len(list_quotes)):
    results.append("\t".join([list_quotes[i],list_authors[i],list_tags[i]]))

for result in results:
    print(result)

Python學習之路 (五)爬蟲(四)正則表示式爬去名言網