創新專案實訓:資料爬取

專注的阿熊發表於2022-06-08

import os

import pandas as pd

import requests

# 第一步:獲取所有寶可夢的編號和名字

# 爬蟲最佳化,超時重試

def get_html(url):

     i = 0

     # 最多重連 5

     while i <= 5:

         try:

             # 最大連線等待時間 30 秒,最大響應等待時間 60

             resp = requests.get(url,timeout=(30,60))

             resp.encoding = 'utf-8'

             return resp

         except requests.exceptions.RequestException:

             i += 1

             print(' 超時 {} '.format(i))

# 生成寶可夢列表(按全國圖鑑編號)簡單版頁面後,可以註釋這段程式碼,然後需要對 data.html 進行部分修改 ( 下面會提及 )

#url = ' 寶可夢列表(按全國圖鑑編號) / 簡單版 '

#data = get_html(url)

#f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/data.html','w',encoding='utf-8')

#data.encoding='utf-8'

#f.write(data.text)

#f.close()

# 讀取 data.html ,獲取完善的編號和名字

import re

f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/data.html','r',encoding='utf-8')

#data.html 的讀取

data_html = f.read()

f.close()

# 只獲取編號和名字,多餘內容過濾

data_html = data_html.split('<td>#001')[1]

data_html = data_html.split('Enamorus</a>')[0]

data_html = '<td>#001' + data_html + 'Enamorus</a>'

# 編號

ids = re.findall('<td>#(.*?)\n</td>',data_html)

# 名字

names = re.findall('title="(.*?)"',data_html)

# 去掉世代

def func(s):

     return not ' 世代 ' in s

names = list(filter(func,names))

# 第二步:爬取各寶可夢的頁面,獲取其屬性、特性等

# 資料寫進列表裡

l = []

# 遍歷 ids, 生成各寶可夢 html, 再各自爬取

for i in range(len(ids)):

     # 每隻寶可夢資料寫入字典中

     D_data = {}

     D_data['id'] = ids[i]

     D_data[' 中文名 '] = names[i * 3]

     D_data[' 日文名 '] = names[i * 3 + 1]

     D_data[' 英文名 '] = names[i * 3 + 2]

     print(D_data)

     html = ''

     # 判斷若存在 ids 號的 html ,開啟讀取

     if os.path.exists('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/{}.html'.format(ids[i])):

         f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/' + ids[i] + '.html', 'r', encoding='utf-8')

         html = f.read()

         f.close()

     # 若不存在,生成 ids 號的 html

     else:

         url = '' + D_data[' 中文名 ']

         resp = get_html(url)

         f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/' + ids[i] + '.html', 'w', encoding='utf-8')

         resp.encoding = 'utf-8'

         f.write(resp.text)

         html = resp.text

         f.close()

     # 正規表示式,獲取屬性

     type = re.findall('title="(.*?) (屬性) ">', html)

     print(type)

     D_data[' 屬性 1'] = type[0]

     D_data[' 屬性 2'] = len(type) > 1 and type[1] or ''

     if len(D_data[' 屬性 1']) > 5 or D_data[' 屬性 1'] == '':

         D_data[' 屬性 1'] = D_data[' 屬性 2']

     if len(D_data[' 屬性 2']) > 5 or D_data[' 屬性 2'] == '':

         D_data[' 屬性 2'] = D_data[' 屬性 1']

     try:

         # 開始無法獲取,列表為空的時候跳過

         skill = re.findall('title="(.*?) (特性) ">', html)

         print(skill)

         D_data[' 特性 1'] = skill[0]

         D_data[' 特性 2'] = len(skill) > 1 and skill[1] or ''

         if len(D_data[' 特性 2']) > 5 or D_data[' 特性 2'] == '':

             D_data[' 特性 2'] = D_data[' 特性 1']

         D_data[' 特性 3'] =外匯跟單gendan5.com len(skill) > 2 and skill[2] or ''

         if len(D_data[' 特性 3']) > 5 or D_data[' 特性 3'] == '':

             D_data[' 特性 3'] = D_data[' 特性 2']

         D_data['HP'] = re.findall('title=" HP "> HP </a> </div><div style="float:right">(.*?)</div>', html)[0]

         D_data[' 攻擊 '] = re.findall('title=" 攻擊 "> 攻擊 </a> </div><div style="float:right">(.*?)</div>', html)[0]

         D_data[' 防禦 '] = re.findall('title=" 防禦 "> 防禦 </a> </div><div style="float:right">(.*?)</div>', html)[0]

         D_data[' 特攻 '] = re.findall('title=" 特攻 "> 特攻 </a> </div><div style="float:right">(.*?)</div>', html)[0]

         D_data[' 特防 '] = re.findall('title=" 特防 "> 特防 </a> </div><div style="float:right">(.*?)</div>', html)[0]

         D_data[' 速度 '] = re.findall('title=" 速度 "> 速度 </a> </div><div style="float:right">(.*?)</div>', html)[0]

     except IndexError:

         pass

# 第三步:將爬取到的資料寫入 BKM.csv 檔案中

     l.append(D_data)

     df = pd.DataFrame(l)

     df.to_csv('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/BKM.csv')

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2899477/,如需轉載,請註明出處,否則將追究法律責任。

相關文章