上次有朋友問怎麼抓取交易所網站的數據,特別是歷史數據,這裏特別推薦使用selenium這一自動化測試框架。web
本來selenium是用來完成大量基於瀏覽器的自動化測試的,但因爲能夠方便地執行JS代碼,摸擬用戶點擊和操做,瀏覽器
所以能夠與PYTHON結合實現一些稍微複雜一點的網頁抓取操做。框架
下面就以抓取交易所網站的統計數據爲例,說明二者結合的一些用法。測試
跟普通的抓取操做相比,稍微複雜一點的地方在於:網站
1)以下圖所示,默認抓取上交所網頁數據只能取到最近一個工做日的統計數據,若是想取過去的數據,只能人工點擊日曆控件完成日期選擇,不能輸入,所以必須:ui
a)去掉日期元素的只讀屬性spa
b)清空原有日期值,設置想讀取的日期值code
c)因爲頁面有延遲加載的狀況,所以必須在合適的點設定必定的等待時間ip
#encoding:utf8 """ @author:xuyuming @contact:283548048@qq.com @time:2016/8/8 22:47 """ fromseleniumimportwebdriver importtime ###############################取深交所相關統計數據################################################# driver=webdriver.Chrome() driver.get("http://www.szse.cn/main/marketdata/tjsj/jyjg/") #抓取上交所交易日曆數據 driver.find_element_by_name("txtDate").clear() #設置統計數據的數據日期 driver.find_element_by_name("txtDate").send_keys("2016-08-05") #點擊查詢按鈕 driver.find_element_by_id("1804_tab1_btn").click() time.sleep(1) #股票總成交金額 ,從CHROME自帶的「檢查」功能獲取XPATH路徑爲 //*[@id="REPORTID_tab1"]/tbody/tr[2]/td[3] total_tradeamt=driver.find_element_by_xpath("//*[@id='REPORTID_tab1']/tbody/tr[2]/td[3]").text #股票總流通市值 //*[@id="REPORTID_tab1"]/tbody/tr[2]/td[8] negotiableValue=driver.find_element_by_xpath('//*[@id="REPORTID_tab1"]/tbody/tr[2]/td[8]').text #b股總成交金額 tradeamtB=driver.find_element_by_xpath('//*[@id="REPORTID_tab1"]/tbody/tr[4]/td[3]').text #b股總流通市值 negotiableValueB=driver.find_element_by_xpath('//*[@id="REPORTID_tab1"]/tbody/tr[4]/td[8]').text driver.quit() # 深市A股總流通市值爲深市總市值減去深市B股總市值 negotiableValueA_sz=int(negotiableValue.replace(',',''))-int(negotiableValueB.replace(',','')) # 深市A股總成交額爲深市總成交額減去深市B股總成交額 tradeamtA_sz=int(total_tradeamt.replace(',',''))-int(tradeamtB.replace(',','')) #打印A股流通市值和成交金額 printnegotiableValueA_sz,tradeamtA_sz ##################################取上交所相關統計數據############################################### #remove readonly attribute driver=webdriver.Chrome() driver.get("http://www.sse.com.cn/market/stockdata/overview/day/") #等待一秒鐘,確保頁面加載完畢,以便於後續修改DOM元素只讀屬性後不會被頁面延遲加載後覆蓋 time.sleep(1) #去掉元素的只讀屬性 driver.execute_script("var setDate=document.getElementById('start_date2');setDate.removeAttribute('readonly');") #定位到日期控件 setDatElement=driver.find_element_by_xpath("//input[@id='start_date2']") #清除內容 setDatElement.clear() #從新填上指定的值 setDatElement.send_keys("2016-08-05") #點擊「查詢」按鈕 driver.find_element_by_id("btnQuery").click() time.sleep(1) negotiableValueA_sh=driver.find_element_by_xpath('//*[@id="tableData_934"]/div[2]/table/tbody/tr[3]/td[3]/div').text #取最新的滬市A股成交金額 //*[@id="tableData_934"]/div[2]/table/tbody/tr[5]/td[3]/div trdAmtA_sh=driver.find_element_by_xpath('//*[@id="tableData_934"]/div[2]/table/tbody/tr[5]/td[3]/div').text #取最新的滬市A股平均市盈率 profitRateA_sh=driver.find_element_by_xpath('//*[@id="tableData_934"]/div[2]/table/tbody/tr[7]/td[3]/div').text #打印滬市成交金額 ,流通市值以及總體市盈率 printnegotiableValueA_sh,trdAmtA_sh,profitRateA_sh driver.quit()