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'<header class="stock_title">.*?<h1>(.*?)</h1>.*?<h2>(.*?)</h2>.*?<em>(.*?)</em>.*?<time>(.*?)</time>',
            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'<div class="s_price">.*?em class=".*?">(.*?)</em>.*?<em class=".*?">(.*?)</em>.*?<em class=".*?">(.*?)</em>.*?</div>',
            html, flags=re.S)
        price = [plt_price.group(1), plt_price.group(2),
                 plt_price.group(3)]  # [当前股价,涨跌额,涨跌幅]
        plt_HL = re.search(
            r'<dl class="s_height">.*?<dt>最高</dt>.*?<dd class=".*?">(.*?)</dd>.*?<dt>最低</dt>.*?<dd class=".*?">(.*?)</dd>.*?</dl>',
            html, flags=re.S)
        HL = [plt_HL.group(1), plt_HL.group(2)]  # [最高价,最低价]
        plt_data = re.search(
            r'<div class="s_date">.*?<dt>今开</dt>.*?<dd class=".*?">(.*?)</dd>.*?<dt>昨收</dt>.*?<dd>(.*?)</dd>.*?</dl>'
            r'.*?<dl>.*?<dt>涨停</dt>.*?<dd class=".*?">(.*?)</dd>.*?<dt>跌停</dt>.*?<dd class=".*?">(.*?)</dd>.*?</dl>'
            r'.*?<dl>.*?<dt>换手率</dt>.*?<dd>(.*?)</dd>.*?<dt>振幅</dt>.*?<dd>(.*?)</dd>.*?</dl>'
            r'.*?<dl>.*?<dt>成交量</dt>.*?<dd>(.*?)</dd>.*?<dt>成交额</dt>.*?<dd>(.*?)</dd>.*?</dl>'
            r'.*?<dl>.*?<dt>内盘</dt>.*?<dd>(.*?)</dd>.*?<dt>外盘</dt>.*?<dd>(.*?)</dd>.*?</dl>'
            r'.*?<dl>.*?<dt>委比</dt>.*?<dd>(.*?)</dd>.*?</dl>'
            r'.*?<dl>.*?<dd>(.*?)</dd>.*?<dt>市净率</dt>.*?<dd>(.*?)</dd>.*?</dl>'
            r'.*?<dl>.*?<dt>流通市值</dt>.*?<dd>(.*?)</dd>.*?<dt>总市值</dt>.*?<dd>(.*?)</dd>.*?</div>'
            , 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'<section class="stockTable">(.*)</section>', 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()

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值