爬蟲 | 基本步驟和解析網頁的幾種方法

abloger發表於2024-06-05

爬蟲的步驟可以簡單的概括為:

  1. 獲取網頁並拿到HttpResponse物件,一般都是urllib庫或者requests庫
    # 設定要爬取的網頁,以及headers偽裝瀏覽器(最基本防反扒手段)
    url = 'https://example.com'
    headers = {
"User-Agent":"裡面的內容在瀏覽器--network--選擇一個html檢視Headers -- requests headers -- User-Agent"
}

    # urllib
    import urllib.request
    response = urllib.request.urlopen(url = url, headers = headers)
    response.read()  #>>>> 讀取網頁內容

    # requests
    import requests
    response = requests.get(url = url, headers = headers)
    response.text()  #>>>> 讀取網頁內容
  1. 解析網頁(正則、bs4、xpath)
"""正規表示式"""

# 先用compile預載入自定義的正規表示式(這樣速度快點)
 entity_regex = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>'
                                  r'.*?<br>(?P<year>.*?)&nbsp'
                                  r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                                  r'.*?<span>(?P<number>\d+)人評價</span>', flags=re.S)
        
        # 用迭代器獲取,還可以寫作re.finditer(entity_regex, page_content)
        entity_iter = entity_regex.finditer(page_content)

# 從迭代器中將各組資料單獨提取,則是group,如果直接提取字典,則是groupdict
        for entity in entity_iter:
        # print(entity.group('name'))
        # print(entity.group('year').strip())  # 因為年份前面有空格,所以用strip
        # # print(type(name.group('year').strip()))  # 用.*?匹配到的數字,格式是str字串
        # print(entity.group('score'))
        # print(entity.group('number'))
        # # print(type(name.group('number')))  # 用\d+匹配到的數字,格式依舊是str字串,因為正則匹配到的內容都用str返回

            dic = entity.groupdict()
            dic['year'] = dic['year'].strip()  # 單獨處理一下year的空白
  1. 儲存(csv)
  最好是一開始就設定好儲存檔案路徑等,如果不想用with open,那就直接用open+close
"""這裡最需要注意的就是處理with open 和 for迴圈的關係,否則一不留神就容易導致dic的值或者檔案被反覆覆蓋,只剩下最後一點資料"""
  
  # 用with open
    with open('top250.csv', 'w', encoding='utf-8') as f:  # 1) 建立一個文件
      csv_writer = csv.writer(f)                          # 2) 建立一個可寫物件
      csv_writer.writerow(dic.values())                   # 3)寫入

  # 用open + close
      f = open('top250.csv', 'w', encoding='utf-8')       # 1) 建立一個文件
      csv_writer = csv.writer(f)                          # 2) 建立一個可寫物件
      csv_writer.writerow(dic.values())                   # 3)寫入
      f.close()                                           # 4) 關閉檔案
  1. 關閉響應
   response.close() 
'''別忘了!'''

相關文章