requests爬取股票信息

这里讨论的股票信息没有隐藏在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()

 

你可能感兴趣的:(python)