1. 程式人生 > >收集資料

收集資料

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 維基百科頁面的示例:

如果要獲取一個 p a g e \color{red}{page} 物件:

page = wptools.page(‘E.T._the_Extra_Terrestrial’)

要獲取所有的資料,用.get()方法:

page = wptools.page(‘E.T._the_Extra_Terrestrial’).get()

或已經將頁面物件賦值給 p a g e \color{red}{page} 了,再獲取其資料:

page.get()

訪問 p a g e \color{red}{page} 的屬性,用.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)