2022年11月19日 星期六

[Python]初探爬蟲(scrapy)

隨著互聯網時代的到來,網路已成為人類生活的資料庫,只要輸入合適的關鍵字,大部分的問題可藉由搜索找到方向。然而,以另一個角度觀察,龐大的網路資料庫也易因為巨量的資料,導致容易失焦,因此如何從資料庫篩選出期望的主題資料是一個重點工作。早有耳聞Python的爬蟲功能,藉著零碎時間看了一些視頻,同時將重點摘要如下,供日後查閱,也供各位參考。

1.和R語言類似,Python亦有許多安裝包供引入,其中關於爬蟲的安裝包為requests。其中需特別提醒的是有時候光引入requests尚無法將網頁HTML源碼完整擷取下來,需利用headers的設置,模擬通過一款瀏覽器去訪問該網頁,參考源碼如下:

import requests
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
url = 'http://news.baidu.com/'
urltext = requests.get(url, headers=headers).text
print(urltext)

Note: User-Agent其實就是關於瀏覽器的描述,最快速的方式就是進到網頁後點擊F12,即看到User-Agent資訊,如下圖紅框處。



2.當取得完整的網頁HTML源碼後,接續用正則表達式來擷取目標內容,需引入正則表達式安裝包re。原理是在HTML文本中找出規律性,並善用下列觀念和指令來鎖定和擷取目標內容。

  a. 類(class):為HTML結構之一,在爬蟲的應用上,往往會用class來找出規律性和鎖定目標內容。

  b. (.*?): 用來標識欲擷取的目標內容,若可在源碼中找到規律性,如目標內容都介於A和B之間,通常可用 A(.*?)B來擷取出A和B之間的目標內容。 

  c. .*?: 用來填充一些源碼內容,可以理解為我們不需要的內容,因此僅用正則表達式的填充部分。

以下列擷取新聞網址範例說明,利用class="dot">來鎖定,同時.*?表達class到<a href之間的填充內容,(.*?)即是新聞網址位置,利用re.findall來擷取新聞網址。


# 擷取焦點新聞的網址(titleurl)

RegEx1 = r'class="dot">.*?<a href="(.*?)"'

titleurl = re.findall(RegEx1, urltext, re.S)

print(titleurl)



3.另外,當目標內容引進後,有時候尚有一些遺留字串,如<b>,</b>。可善用正則表達式的指令(re.sub)進行數據清洗,同時利用for loop,即可讓目標內容條列出來。


-----如果文章對您有幫助,打開微信掃一掃,請作者喝杯咖啡。-----





沒有留言:

張貼留言