所需套件:bs4, selenium, pandas, lxml。
另外,我們還需要瀏覽器chromedriver。
In [ ]:
from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd
In [ ]:
urlMain="http://www.cacanews.com/cat91/92?sort=quality" # 想從這裡抓資料
urlLogin='http://www.cacanews.com/site/login' # 要先登入才能抓到我們想要的資料
In [ ]:
browser=webdriver.Chrome("/Users/chweng/Desktop/chromedriver")
In [ ]:
chromePath="/Users/chweng/Desktop/chromedriver"
browser=webdriver.Chrome(chromePath) # 開啟測試用的chrome瀏覽器
browser.get(urlLogin) # 以瀏覽器進入登入帳號的頁面
In [ ]:
# 找到帳密輸入區塊的ID後,輸入帳密
emailID=browser.find_element_by_id("LoginForm_username")
emailID.send_keys("chihung@honghutech.com") # 輸入帳號
passwd=browser.find_element_by_id("LoginForm_password")
passwd.send_keys("tmp12345") # 輸入密碼
# 找到登入按鈕,並按下登入按鈕以登入頁面
signin=browser.find_element_by_class_name('btn-primary')
signin.click() # 登入頁面
In [ ]:
# 登入完畢後,即可去目標頁面爬取我們想要的資料
browser.get(urlMain)
webText=browser.page_source # 得到網頁原始碼
soup=BeautifulSoup(webText,'lxml') # 將網頁原始碼交給Beautifulsoup解析
In [ ]:
# 已經得到目標頁面原始碼。故可以先將測試用瀏覽器關閉
browser.quit()
In [ ]:
# 找到名稱為h3, 並且class是media-head開頭的 HTML tag
divs=soup.select('h3[class^="media-head"]')
In [ ]:
# 將標題,和該標題發佈的日期存成兩個清單
titles=[]
dates=[]
for div in divs:
titles.append(div.text.split(divs[0].span.text)[1].strip())
dates.append(div.next_sibling.next_sibling.text.split("|")[1].strip())
In [ ]:
# 將清單轉存Pandas資料表,以利之後的資料處理
df=pd.DataFrame({"title":titles,"dates":dates})
In [ ]:
df
In [ ]:
# 將爬取得來的資料轉成csv檔案儲存
df.to_csv("content_farm_example.csv")