这里讨论的股票信息没有隐藏在js当中的方法
主要利用requests来get每个股票的text
再交替利用re和bs4来解析text里的信息
最后再按照当前的时间来保存股票的信息
由于requests的爬取速度慢,可以选择关闭每个界面编码的识别(假设每个界面的编码相同),可以略微提升速度
显示了完成的进度状况
生成的数据大概在2M左右
# 股域网 https://hq.gucheng.com/gpdmylb.html
# -*- coding: utf-8 -*-
import requests
import re
import bs4
import time
import os
import traceback
def GetHtmlText(url):
try:
hd = {'user-agent': 'Mozilla/5.0'}
r = requests.get(url, headers=hd, timeout=30)
r.raise_for_status()
#r.encoding = r.apparent_encoding
print(r.url)
return r.text
except:
print('getHtmlText error')
print('status.code:{}'.format(r.status_code))
return None
def ParsePage(html, ilt):
try:
plt_basic = re.search(
r'.*?(.*?)
.*?(.*?)
.*?(.*?).*?',
html, flags=re.S)
basic = [plt_basic.group(1), plt_basic.group(2), plt_basic.group(3),
plt_basic.group(4)] # [股票名称,股票代码,交易状态,更新时间]
plt_price = re.search(
r'.*?em class=".*?">(.*?).*?(.*?).*?(.*?).*?',
html, flags=re.S)
price = [plt_price.group(1), plt_price.group(2),
plt_price.group(3)] # [当前股价,涨跌额,涨跌幅]
plt_HL = re.search(
r'.*?- 最高
.*?- (.*?)
.*?- 最低
.*?- (.*?)
.*?
',
html, flags=re.S)
HL = [plt_HL.group(1), plt_HL.group(2)] # [最高价,最低价]
plt_data = re.search(
r'.*?今开 .*?(.*?) .*?昨收 .*?(.*?) .*?'
r'.*?.*?- 涨停
.*?- (.*?)
.*?- 跌停
.*?- (.*?)
.*?
'
r'.*?.*?- 换手率
.*?- (.*?)
.*?- 振幅
.*?- (.*?)
.*?
'
r'.*?.*?- 成交量
.*?- (.*?)
.*?- 成交额
.*?- (.*?)
.*?
'
r'.*?.*?- 内盘
.*?- (.*?)
.*?- 外盘
.*?- (.*?)
.*?
'
r'.*?.*?- 委比
.*?- (.*?)
.*?
'
r'.*?.*?- (.*?)
.*?- 市净率
.*?- (.*?)
.*?
'
r'.*?.*?- 流通市值
.*?- (.*?)
.*?- 总市值
.*?- (.*?)
.*?
'
, html, flags=re.S)
data = [plt_data.group(1), plt_data.group(2), plt_data.group(3), plt_data.group(4), plt_data.group(5),
plt_data.group(6), plt_data.group(7), plt_data.group(8), plt_data.group(9), plt_data.group(10),
plt_data.group(11), plt_data.group(12), plt_data.group(13), plt_data.group(14), plt_data.group(15)]
# [今开,昨收,涨停,跌停,换手率,振幅,成交量,成交额,内盘,外盘,委比,市盈率(动),市净率,流通市值,总市值]
ilt.append([basic, price, HL, data])
except:
traceback.print_exc()
def PrintWrite(ilt):
s = [['股票名称', '股票代码', '交易状态', '更新时间'],
['当前股价', '涨跌额', '涨跌幅'],
['最高价', '最低价'],
['今开', '昨收', '涨停', '跌停', '换手率', '振幅', '成交量', '成交额', '内盘', '外盘', '委比', '市盈率(动)', '市净率', '流通市值', '总市值']]
root = 'stock/'
ti = time.gmtime()
path = root + time.strftime('%m_%d_%H_%M', ti) + '.txt'
if not os.path.exists(root): # 判断目录是否存在
os.mkdir(root)
with open(path, 'wt')as fp:
for item in ilt:
try:
for i in range(len(item)):
for j in range(len(item[i])):
if ((i + 1) == 4) and ((j + 1) % 5 == 0):
fp.write('{}:\t{}\n'.format(s[i][j], item[i][j]))
continue
fp.write('{}:\t{}\t'.format(s[i][j], item[i][j]))
fp.write('\n')
fp.write('\n\n')
except:
print('PrintWrite error')
def main():
info = list()
url_all = 'https://hq.gucheng.com/gpdmylb.html'
html_all = GetHtmlText(url_all)
match_all = re.search(r'(.*) ', html_all, flags=re.S)
try:
soup = bs4.BeautifulSoup(match_all.group(1), 'html.parser')
xx=len(soup('a'))
count=0
for line in soup('a'):
html = GetHtmlText(line.attrs['href'])
ParsePage(html, info)
count+=1
print('当前完成:{:.2f}%({}|{})'.format(count/xx*100,count,xx))
PrintWrite(info)
except:
print('error match')
traceback.print_exc()
main()