目录
- 序言
- excel文件准备
- 全部代码
序言
互动易平台链接:https://irm.cninfo.com.cn/views/interactiveAnswer
需要提前下载好三个库,都可以用pip install轻松下载,稍微麻烦点儿的是需要去下载个对应版本的chromedriver.exe驱动,放到python或者Anaconda的文件夹目录下,然后添加环境变量(这部分报错了自行百度即可,操作起来不麻烦的)
注意time.sleep()是必要的,一是为了避免频繁操作被浏览器提醒,二是在网络不好的情况下让网页加载完全,否则都会导致报错,一定不要图快,建议在网络环境较好的情况下运行
这之中还会遇到诸多问题,在代码的注释里也都写到了,其他需求可以做参考。
excel文件准备
文件名建议直接命名为info.xlsx,读取时使用该路径,文件需要至少包括code(股票代码)和year(年份)
全部代码
详细解释已写在注释中
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd
import requests
from urllib.request import urlopen
from bs4 import BeautifulSoupindex1=1 # 数据所在行
index2=1 # 数据所在行
dtype={'code':str,'year':str}
dfInfo=pd.read_excel('info.xlsx',sheet_name='Sheet1',dtype=dtype)#导入基础信息表
#创建已回复空表
df1=pd.DataFrame(columns=['code','name','year','url','Answer','Atime','Question','Qtime'],index=range(1,30001))
#创建未回复空表
df2=pd.DataFrame(columns=['code','name','year','Question','Qtime'],index=range(1,5001))# 创建浏览器对象,并全屏,进入互动易平台
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://irm.cninfo.com.cn/views/interactiveAnswer')
time.sleep(4)# 根据行序号,对sourcedf进行遍历
# 如果信息较多,建议可以分批运行,支持中断
startRow=1
endRow=100
for i in range(startRow,endRow+1):#在新表中保存信息code=dfInfo['code'][i]name=dfInfo['name'][i]year=dfInfo['year'][i]print(str(i)+' '+code+' '+name+' '+year)###一系列的点击输入操作driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[1]').click()time.sleep(0.5)#根据是否首次输入,调整输入内容if i==startRow:driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[1]').send_keys('20'+year[2:]+'-01-01')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[2]').send_keys('20'+year[2:]+'-12-31')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[2]/div/input').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[1]/div/div[1]/input').send_keys(code)time.sleep(1)else:driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[1]').send_keys(8*Keys.BACKSPACE)time.sleep(0.5) driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[1]').send_keys(year[2:]+'-01-01')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[2]').send_keys(8*Keys.BACKSPACE)time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[3]/div/div/input[2]').send_keys(year[2:]+'-12-31')time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[2]/div/input').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[1]/div/div[1]/input').send_keys(6*Keys.BACKSPACE)time.sleep(0.5)driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[1]/div/div[1]/input').send_keys(code)time.sleep(1)#点击确定driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[4]/button[1]').click()time.sleep(1)#点击进入已回复界面driver.find_element_by_xpath('//*[@id="tab-11"]').click()time.sleep(1) #收集已回复的信息for j in range(200):for k in range(1,11):#如果当页有十条数据,就获取并写入信息,如果不足十条就跳出当前循环try: Question=driver.find_element_by_xpath(f'//*[@id="pane-11"]/div[{k}]/span/span/a/div[1]/span').textAnswer=driver.find_element_by_xpath(f'//*[@id="pane-11"]/div[{k}]/span/span/a/div[2]/span[1]/span').textAtime=driver.find_element_by_xpath(f'//*[@id="pane-11"]/div[{k}]/a/span/span[2]/span[2]').textelement=driver.find_element_by_xpath(f'//*[@id="pane-11"]/div[{k}]/span/span/a') url=element.get_attribute('href')df1['code'][index1]=codedf1['name'][index1]=namedf1['year'][index1]=yeardf1['url'][index1]=url df1['Question'][index1]=Questiondf1['Answer'][index1]=Answerdf1['Qtime'][index1]=Atimeindex1+=1except:break #如果有下一页按钮就点击,否则跳出当前循环try:driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[2]/div/button[2]').click()time.sleep(1)except:break#点击进入未回复界面driver.find_element_by_xpath('//*[@id="tab-1"]').click()time.sleep(1) #收集未回复的信息for a in range(200):for b in range(1,11):#如果当页有十条数据,就获取并写入信息,如果不足十条就跳出当前循环try: Question=driver.find_element_by_xpath(f'//*[@id="pane-1"]/div[{b}]/span/span/a/div/span').textQtime=driver.find_element_by_xpath(f'//*[@id="pane-1"]/div[{b}]/a/span/span[2]/span[2]').textdf2['code'][index2]=codedf2['name'][index2]=namedf2['year'][index2]=year df2['Question'][index2]=Questiondf2['Qtime'][index2]=Qtimeindex2+=1except:break #如果有下一页按钮就点击,否则跳出当前循环try:driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div[2]/div[1]/div[2]/div/button[2]').click()time.sleep(1)except:break# 每隔100个保存一次,防止中途断网或报错导致前边运行完成的数据丢失if i%100 == 0:df1.to_excel('result1.xlsx')df2.to_excel('result2.xlsx')
# 保存最终版,如果不是一次性运行完,可以将结果复制到新表中后关闭,随后调整startrow和endrow进行下一阶段的运行
df1.to_excel('result1.xlsx')
df2.to_excel('result2.xlsx')