上次有朋友问怎么抓取交易所网站的数据,特别是历史数据,这里特别推荐使用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()