收集資料
阿新 • • 發佈:2018-12-01
1、Web資料抓取
使用Beautiful Soup來提取每個HTML檔案。
- 建立一個空列表df_list,並附加字典。
- 通過rt_html資料夾中每個電影的Rotten Tomatoes HTML檔案迴圈播放。
- 開啟每個HTML檔案,並將其傳達到一個名為file的檔案控制代碼中。
- 使用pd.DataFrame()將df_list轉換為名為df的DataFrame.
from bs4 import BeautifulSoup
import os
import pandas as pd
df_list = []
folder_name = 'rt_html'
for movie_html in os.listdir(folder_name):
with open(os.path.join(folder_name, movie_html)) as file:
soup = BeautifulSoup(file, 'lxml')
title = soup.find('title').contents[0][:-len(' - Rotten Tomatoes')]
audience_score = soup.find('div', class_='audience-score master').find('span'). contents[0][:-1]
num_audience_ratings = soup.find('div', class_='audience-info hidden-xs superPageFontColor')
num_audience_ratings = num_audience_ratings.find_all('div')[1].contents[2].strip().replace(',', '')
df_list.append({'title': title,
'audience_score': int(audience_score),
'number_of_audience_ratings' : int(num_audience_ratings)})
df = pd.DataFrame(df_list, columns=['title', 'audience_score', 'number_of_audience_ratings'])
2、從網際網路下載檔案
import requests
import os
folder_name = 'XXX' #儲存檔案的資料夾名稱
if not os.path.exists(folder_name):
os.makedirs(folder_name)
url = '…'
response = requests.get(url)
with open(os.path.join(folder_name, url.split('/')[-1], mode='wb') as file:
file.write(response.content)
3、使用glob開啟文字檔案
import glob
import pandas as pd
df_list = []
for ebert_review in glob.glob('ebert_reviews/*.txt'):
with open(ebert_review, encoding='utf-8') as file:
title = file.readline()[:-1] #影評的第1行為標題(去掉最後的換行符)
review_url = file.readline()[:-1] #影評的第2行為影評連結(去掉最後的換行符)
review_text = file.read() #影評的第3行以後為影評內容
df_list.append({'title': title,
'review_url': review_url,
'review_text': review_text})
df = pd.DataFrame(df_list, columns = ['title', 'review_url', 'review_text'])
4、查詢API(wptools庫)
對於MediaWiki,Python中最新和可讀的庫是wptools。下面是wptools使用ET 維基百科頁面的示例:
如果要獲取一個 物件:
page = wptools.page(‘E.T._the_Extra_Terrestrial’)
要獲取所有的資料,用.get()方法:
page = wptools.page(‘E.T._the_Extra_Terrestrial’).get()
或已經將頁面物件賦值給 了,再獲取其資料:
page.get()
訪問 的屬性,用.data()方法。例如要獲取頁面上的影象資料列表:
page.data[‘image’]
5、JSON技能
訪問JSON檔案就像訪問Python語言下的字典和列表一樣,因為JSON物件被解釋為字典,而JSON陣列被解釋為列表。
(1)JSON陣列
要訪問圖片特性(它是一個JSON陣列)的第一個圖片:
page.data[‘image’][0]
(2)JSON物件
訪問infobox特性(它是個JSON物件)中的director鍵:
page.data[‘infobox’][‘director’]
6、用資料庫和SQL收集資料
- 連線python中的資料庫。使用SQLAIchemy連線到SQLite資料庫。
- 將pandas DataFrame裡的資料儲存至所連線的資料庫中。使用pandas的.to_sql方法儲存資料。
- 將所連線的資料庫裡的資料匯入至pandas DataFrame中。使用pandas的read_sql方法。
關聯資料庫和pandas
import pandas as pd
df = pd.read_csv('bestofrt_master.csv')
df.head(3)
(1)關聯資料庫
from sqlalchemy import create_engine
#建立SQLAlchemy引擎和空白bestofrt資料庫
engine = create_engine('sqlite://bestofrt.db')
(2)將pandas DataFrame儲存在資料庫中
將資料儲存在清理後的資料庫主要資料集()中。
#將清理後的主DataFrame('df')儲存在表格中,命名為主bestofrt.db
df.to_sql('master', engine, index=False)
(3)把資料庫讀回一個pandas DataFrame
將資料庫中的全新資料讀回一個pandas DataFrame。
df_gather = pd.read_sql('SELECT * FROM master', engine)
df_gather.head(3)