python爬虫爬取上市公司套期保值公告(巨潮网)
摘要
巨潮资讯网的网页是通过JavaScript动态加载的,因此本文利用Selenium方法爬取该网站上市公司的套期保值公告。
主要技术路线:
1.css_selector/xpath法模拟浏览器/*面模拟浏览器
2. 自动翻页获取源代码
3. 正则提取
4. 数据清洗
5. 保存到excel文件
一、模拟浏览器操作
xpath法模拟浏览器**
- fn+f12快捷键获取巨潮网网页源码
- 源码界面点击左上角箭头,再选中搜索框,获取搜索框对应源码位置
- 对应源码>鼠标右键>copy>copy xpath获取路径
代码如下
from selenium import webdriver #引用selenium库里的webdriver功能
browser = webdriver.Chrome() #模拟谷歌的浏览器
browser.get("https://www.baidu.com/") # 通过browser.get()函数访问网址
browser.find_element_by_xpath('//*[@id="kw"]').clear() #若搜索框有默认内容则清空默认文字
browser.find_element_by_xpath('//*[@id="kw"]').send_keys('python') #自动在搜索框输入内容
browser.find_element_by_xpath('//*[@id="su"]').click() # 点击百度一下按钮
除了使用xpath法模拟浏览器外,还可用css_selector法模拟浏览器
ps:由于爬取数量太大,Selenium方法爬取数据仅模拟人工操作完成,这样会不断重复跳出新页面,效率极大的降低了。如果追求效率可使用*面模拟浏览器,它可以关闭浏览器和后台进程,不仅可以提高获取数据速度,也可以提高电脑的运行效率。代码如下:
“”"
*面模拟浏览器
“”"
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(’–headless’)
browser = webdriver.Chrome(options=chrome_options)
browser.get(‘https://www.baidu.cn’)
data = browser.page_source
print(data)
2.自动翻页获取源代码
由于巨潮网是动态网址,点击第2页、第3页等进行翻页的时候,网页地址栏中的url也没变,因此本文采用selenium法模拟鼠标点击下一页实现自动翻页。
browser.find_element_by_xpath('//*[@id="fulltext-search"]/div/div[1]/div[2]/div[4]/div[2]/div/button[2]/i').click() # 点击下一页按钮
一直点击下一页到最后一页时需要停止点击,跳出循环,需计算出总页数
计算总页数:
例:源代码中有显示总条数:共 50 条 当前显示1-10条
总页数=总条数/每页条数=50/10=5
data = browser.page_source
p_count = '</div> <span class="total-box" style="">共 (.*?) 条 当前显示.*?条</span></div>'
count = re.findall(p_count, data)[0] # 获取总条数 class ="total-box" style="" > 共 50条 当前显示1-10条 < / span >
pages = int(int(count) / 10) # 获取总页数
if pages>100:
pages=100
else:
pages=pages
# print(data)
算出总页数之后用一个for循环点击下一页即可实现自动翻页
代码如下:
# 2.自动翻页获取源代码
datas=[]
datas.append(data)
for i in range(pages):
browser.find_element_by_xpath('//*[@id="fulltext-search"]/div/div[1]/div[2]/div[4]/div[2]/div/button[2]/i').click() # 点击下一页按钮
time.sleep(2)
data = browser.page_source
datas.append(data)
time.sleep(2)
alldata = "".join(datas) # 将列表转换为字符串
# browser.quit()
3.正则提取
# 3.正则提取
p_title = '<a target="_blank".*?class="r-title">(.*?)</span>'
p_href = '<a target="_blank" href="(.*?)" data-id="'
p_shares = '<a target="_blank".*?data-seccode="(.*?)" class=' # 提取股票代码
p_date = '<a target="_blank" href=".*?;announcementTime=(.*?)" data-id="' # 提取发布日期
title = re.findall(p_title,alldata)
href = re.findall(p_href,alldata)
shares = re.findall(p_shares,alldata)
date = re.findall(p_date,alldata)
4.数据清洗
# 3.数据清洗
for i in range(len(title)):
title[i] = re.sub('<.*?>','',title[i])
href[i] = 'https://www.cnifo.com.cn' + href[i]
href[i] = re.sub('amp;','',href[i])
# print(str(i+1) + '.' + shares[i] +'-'+ title[i] + '-' + date[i])
# print(href[i])
5.保存到excel文件中
# 5. 写进excel文件
file1 = open('/Users/hsx/Desktop/爬虫/套期保值公告爬取.csv', 'a') #
file1.write(keyword + '公告completed' + '\n' + '\n')
for i in range(len(title)):
file1.write(str(i+1) + '/' + shares[i] +'/'+ title[i] + '/' + date[i] + href[i])
file1.write('----------' + '\n')
file1.close()
# 6.函数定义及调用
keywords = ['套保','套期保值']
for i in keywords:
tao_bao(i)
6.完整代码:
"""
巨潮资讯网数据挖掘实战--获取套期保值公告:
1.搜索多个关键字
2.实现翻页功能
3.正则提取
4.数据清洗
5.存储到excel
"""
from selenium import webdriver
import time
import re
def tao_bao(keyword):
# 1.*面浏览
# chrome_options = webdriver.ChromeOptions()
# chrome_options.add_argument('--headless')
# browser = webdriver.Chrome(options=chrome_options)
browser = webdriver.Chrome() # 模拟谷歌浏览器
browser.maximize_window() # 最大化页面
url='http://www.cninfo.com.cn/new/fulltextSearch?notautosubmit=&keyWord=' + keyword
browser.get(url)
time.sleep(3)
browser.find_element_by_xpath(' // *[ @ id = "calendar"] / div / span / div / div / input[1]').send_keys('2014-01-01')
browser.find_element_by_xpath('// *[ @ id = "calendar"] / div / span / div / div / input[2]').send_keys('2020-01-01')
browser.find_element_by_xpath('// *[ @ id = "calendar"] / button / i').click() # 点击搜索
time.sleep(2)
# 计算总页数
data = browser.page_source
p_count = '</div> <span class="total-box" style="">共 (.*?) 条 当前显示.*?条</span></div>'
count = re.findall(p_count, data)[0] # 获取总条数 class ="total-box" style="" > 共 23 条 当前显示21-23条 < / span >
pages = int(int(count) / 10) # 获取总页数
if pages>100:
pages=100
else:
pages=pages
# print(data)
# 2.自动翻页获取源代码
datas=[]
datas.append(data)
for i in range(pages):
browser.find_element_by_xpath(
'//*[@id="fulltext-search"]/div/div[1]/div[2]/div[4]/div[2]/div/button[2]/i').click() # 点击下一页按钮
time.sleep(2)
data = browser.page_source
datas.append(data)
time.sleep(2)
alldata = "".join(datas) # 将列表转换为字符串
# browser.quit()
# 2.正则提取
p_title = '<a target="_blank".*?class="r-title">(.*?)</span>'
p_href = '<a target="_blank" href="(.*?)" data-id="'
p_shares = '<a target="_blank".*?data-seccode="(.*?)" class=' # 提取股票代码
p_date = '<a target="_blank" href=".*?;announcementTime=(.*?)" data-id="' # 提取发布日期
title = re.findall(p_title,alldata)
href = re.findall(p_href,alldata)
shares = re.findall(p_shares,alldata)
date = re.findall(p_date,alldata)
# print(title)
# print(len(title))
# print(href)
# print(len(href))
# print(shares)
# print(len(shares))
# print(date)
# print(len(date))
# 3.数据清洗
for i in range(len(title)):
title[i] = re.sub('<.*?>','',title[i])
href[i] = 'https://www.cnifo.com.cn' + href[i]
href[i] = re.sub('amp;','',href[i])
# print(str(i+1) + '.' + shares[i] +'-'+ title[i] + '-' + date[i])
# print(href[i])
# 4. 写进excel文件
file1 = open('/Users/hsx/Desktop/爬虫/套期保值公告爬取.csv', 'a') #
file1.write(keyword + '公告completed' + '\n' + '\n')
for i in range(len(title)):
file1.write(str(i+1) + '/' + shares[i] +'/'+ title[i] + '/' + date[i] + href[i])
file1.write('----------' + '\n')
file1.close()
# 5.函数定义及调用
keywords = ['套保','套期保值']
for i in keywords:
tao_bao(i)