爬取东方财富股票代码

我们打开东方财富网站:http://quote.eastmoney.com/stocklist.html

假如懒得爬,也可以用现成的股票数据源:https://stockapi.com.cn
在这里插入图片描述

在这里插入图片描述
这展示了所有股票信息,不过需要我们分页去爬取
我们可以查询具体的html代码:

<div class="stock-info" data-spm="2">
    <div class="stock-bets">
        <h1>
            <a class="bets-name" href="/stock/sz300388.html">
            国祯环保 (<span>300388</span>)
            </a>
            <span class="state f-up">已休市 2017-09-29  15:00:03
            </span>
        </h1>
        <div class="price s-stop ">
                        <strong  class="_close">--</strong>
            <span>--</span>
            <span>--</span>
                    </div>
        <div class="bets-content">
            
                                            <div class="line1">
                    <dl><dt>今开</dt><dd class="">19.92</dd></dl>
                    <dl><dt>成交量</dt><dd>8917</dd></dl>
                    <dl><dt>最高</dt><dd class="s-up">20.15</dd></dl>
                    <dl><dt>涨停</dt><dd class="s-up">21.96</dd></dl>
                    <dl><dt>内盘</dt><dd>4974</dd></dl>
                    <dl><dt>成交额</dt><dd>1786.10</dd></dl>
                    <dl><dt>委比</dt><dd>-50.69%</dd></dl>
                    <dl><dt>流通市值</dt><dd>59.98亿</dd></dl>
                    <dl><dt class="mt-1">市盈率<sup>MRQ</sup></dt><dd>50.59</dd></dl>
                    <dl><dt>每股收益</dt><dd>0.20</dd></dl>
                    <dl><dt>总股本</dt><dd>3.06亿</dd></dl>
                    <div class="clear"></div>
                </div>
                <div class="line2">
                    <dl><dt>昨收</dt><dd>19.96</dd></dl>
                    <dl><dt>换手率</dt><dd>0.30%</dd></dl>
                    <dl><dt>最低</dt><dd class="s-down">19.92</dd>
                    </dl>
                    <dl><dt>跌停</dt><dd class="s-down">
                        17.96</dd></dl>
                    <dl><dt>外盘</dt><dd>3943</dd></dl>
                    <dl><dt>振幅</dt><dd>1.15%</dd></dl>
                    <dl><dt>量比</dt><dd>0.11</dd></dl>
                    <dl><dt>总市值</dt><dd>61.35亿</dd></dl>
                    <dl><dt>市净率</dt><dd>3.91</dd></dl>
                    <dl><dt>每股净资产</dt><dd>5.14</dd></dl>
                    <dl><dt>流通股本</dt><dd>2.99亿</dd></dl>
                </div>
         <div class="clear"></div>
        </div>
    </div>

发现股票名称在class="bets-name"的a标签中,其他的数据都在dt和dd标签中

import requests
from bs4 import BeautifulSoup
import re
 
#优化,可以减少程序判断编码所花费的时间
def getHTMLText(url, code='UTF-8'):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = code
        return r.text
    except:
        return ""
 
 
def getStockList(url, stockList):
    html = getHTMLText(url, 'GB2312')
    soup = BeautifulSoup(html, 'html.parser')
    aInformaton = soup.find_all('a')
    for ainfo in aInformaton:
        try:
            stockList.append(re.findall(r'[s][hz]\d{6}', ainfo.attrs['href'])[0])
        except:
            continue
 
 
def getStockInformation(detailUrl, outputFile, stockList):
    count = 0
    for name in stockList:
        count = count + 1
        stockUrl = detailUrl + name + '.html'
        html = getHTMLText(stockUrl)
        try:
            if html == "":
                continue
            stockDict = {}
            soup = BeautifulSoup(html, 'html.parser')
            stockinfo = soup.find('div', attrs={'class': 'stock-bets'})
            stockname = stockinfo.find('a', attrs={'class': 'bets-name'})
            # 当标签内部还有标签时,利用text可以得到正确的文字,利用string可能会产生None
            stockDict["股票名称"] = stockname.text.split()[0]
            stockKey = stockinfo.find_all('dt')
            stockValue = stockinfo.find_all('dd')
            for i in range(len(stockKey)):
                stockDict[stockKey[i].string] = stockValue[i].string
            #\r移动到行首,end=""不进行换行
            print("\r{:5.2f}%".format((count / len(stockList) * 100)), end='')
            #追加写模式'a'
            f = open(outputFile, 'a')
            f.write(str(stockDict) + '\n')
            f.close()
        except:
            print("{:5.2f}%".format((count / len(stockList) * 100)), end='')
            continue
 
 
def main():
    listUrl = 'http://quote.eastmoney.com/stocklist.html'
    detailUrl = 'https://gupiao.baidu.com/stock/'
    outputFile = 'C:/Users/Administrator/Desktop/out.txt'
    stockList = []
    getStockList(listUrl, stockList)
    getStockInformation(detailUrl, outputFile, stockList)
main()
 

方法2.采用Scrapy框架和正则表达式库
(1)建立工程和Spider模板(保存为stocks.py文件)
在命令行中进入:E:\PythonProject\BaiduStocks

输入:scrapy startproject BaiduStocks 建立了scrapy工程

输入:scrapy genspider stocks baidu.com 建立spider模板,baidu.com是指爬虫限定的爬取域名,在stocks.py文件删去即可

(2)编写spider爬虫(即stocks.py文件)
采用css选择器,可以返回选择的标签元素,通过方法extract()可以提取标签元素为字符串从而实现匹配正则表达式的处理

正则表达式详解:

<a class="bets-name" href="/stock/sz300388.html">
            国祯环保 (<span>300388</span>)
            </a>

re.findall(‘.(‘, stockname)[0].split()[0] + ‘(’+re.findall(’>.<’, stockname)[0][1:-1]+‘)’

匹配结果:国祯环保(300388)

因为’('为正则表达式语法里的基本符号,所以需要转义

正则表达式从每行开始匹配,匹配之后返回[’ 国祯环保 ('],采用split将空白字符分割,返回[‘国祯环保’,‘(’]

# -*- coding: utf-8 -*-
import scrapy
import re
 
class StocksSpider(scrapy.Spider):
    name = 'stocks'
    start_urls = ['http://quote.eastmoney.com/stocklist.html']
 
    def parse(self, response):
        fo=open(r'E:\PythonProject\BaiduStocks\oo.txt','a')
        #fo.write(str(response.css('a').extract()))
        count=0
        for href in response.css('a').extract():
            try:
                if count == 300:
                    break
                count=count+1
                stockname=re.findall(r'[s][hz]\d{6}',href)[0]
                stockurl='https://gupiao.baidu.com/stock/' + stockname + '.html'
                #fo.write(stockurl)
                yield scrapy.Request(url= stockurl,headers={"User-Agent":"Chrome/10"} ,callback=self.stock_parse)
            except:
                continue
        pass
 
 
    def stock_parse(self,response):
        ffo=open(r'E:\PythonProject\BaiduStocks\stockparse.txt','a')
        stockDict={}
        #提取标签中class="stock-bets"的标签元素
        stockinfo=response.css('.stock-bets')
        #将提取出来的标签转化为字符串列表,然后取第一个
        stockname=stockinfo.css('.bets-name').extract()[0]
        #ffo.write(stockname)
        keyList=stockinfo.css('dt').extract()
        #ffo.write(str(keyList))
        valueList=stockinfo.css('dd').extract()
        stockDict['股票名称'] = re.findall('.*\(', stockname)[0].split()[0] + '('+re.findall('\>.*\<', stockname)[0][1:-1]+')'
        for i in range(len(keyList)):
            stockkey=re.findall(r'>.*</dt>',keyList[i])[0][1:-5]
            stockvalue=re.findall(r'>.*</dd>',valueList[i])[0][1:-5]
            stockDict[stockkey]=stockvalue
        yield stockDict
 
 
 

(3)编写PipeLine(即pipelines.py文件)

系统自动生成了Item处理类BaiduStocksPipeline,我们不采用系统生成,新建一个BaiduStocksinfoPipeline类,并书写Item处理函数

# -*- coding: utf-8 -*-
 
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
 
 
class BaidustocksPipeline(object):
    def process_item(self, item, spider):
        return item
 
 
class BaidustocksinfoPipeline(object):
    #爬虫打开时执行
    def open_spider(self,spider):
        self.f=open(r'E:\PythonProject\BaiduStocks\BaiduStocks\asdqwe.txt','a')
 
    # 爬虫关闭时执行
    def close_spider(self,spider):
        self.f.close()
        
    #处理Item项
    def process_item(self,item,spider):
        try:
            self.f.write(str(item)+'\n')
        except:
            pass
        return item

此时要修改配置文件setting.py文件

ITEM_PIPELINES = {
    'BaiduStocks.pipelines.BaidustocksinfoPipeline': 300,
}

(4)运行爬虫:scrapy crawl stocks

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/549311.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序-绘制图片并分享下载(painter)

1、引入painter插件 painter官网地址 1.1 可通过官网的方法引入painter插件&#xff0c; 官方插件下载地址 1.2 可下载本文附带的插件包直接引入 1.2.1 复制下载下来的文件中的painter文件夹&#xff0c;将其放在components目录下 1.2.2 页面中引入并使用 .json {"…

边缘计算网关主要有哪些功能?-天拓四方

随着物联网&#xff08;IoT&#xff09;的快速发展和普及&#xff0c;边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备&#xff0c;边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

hot100 -- 链表(中)

不要觉得力扣核心代码模式麻烦&#xff0c;它确实比不上ACM模式舒服&#xff0c;可以自己处理输入输出 只是你对 链表 和 return 的理解不到位 &#x1f442; ▶ 屿前世 (163.com) &#x1f442; ▶ see you tomorrow (163.com) 目录 &#x1f382;两数相加 &#x1f6a9;删…

Python 全栈体系【四阶】(二十八)

第五章 深度学习 四、TensorFlow 1. Tensorflow 简介 1.1 什么是 Tensorflow TensorFlow 由谷歌人工智能团队谷歌大脑&#xff08;Google Brain&#xff09;开发和维护的开源深度学习平台&#xff0c;是目前人工智能领域主流的开发平台&#xff0c;在全世界有着广泛的用户群…

项目升级到jdk21后 SpringBoot相关组件的适配

了解到jdk21是一个LTS版本&#xff0c;可以稳定支持协程的功能。经过调研&#xff0c;将目前线上的jdk8升级到21&#xff0c;使用协程提升并发性能。 目前系统使用springBoot 2.0.3.RELEASE&#xff0c;并且引入了mybatis-spring-boot-starter、spring-boot-starter-data-redi…

电商技术揭秘22:智能仓储与物流优化(上)

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

Hot100【十一】: 347. 前 K 个高频元素

class Solution {public int[] topKFrequent(int[] nums, int k) {// 1.建立hash表来存储每个元素以及它的频率HashMap<Integer, Integer> num2Fre new HashMap<Integer, Integer>();for (int num : nums) {num2Fre.put(num, num2Fre.getOrDefault(num, 0) 1);}/…

白盒测试-基本路径覆盖

​ 路径覆盖可以使程序中的路径都被测试到&#xff0c;但是&#xff0c;要对程序中的路径做到完全覆盖经常是无法实现的。为了解决这一难题&#xff0c;我们需要在保证测试质量的前提下把测试的路径数量压缩到一定的范围内 ​ 基本路径覆盖法是在程序控制流图的基础上&#xf…

基于ADB的Scrcpy实现电脑控制手机

Scrcpy是一个开源的&#xff0c;基于ADB&#xff08;Android 调试桥&#xff09;的手机到电脑上的投屏操控的实现&#xff0c;本文将介绍如何搭建开发环境&#xff0c;使得在Windows系统中去控制投屏的安卓手机。 1. 安装投屏软件 下载Scrcpy软件到电脑上&#xff0c;该软件中…

JVM主要知识点详解

目录 1. 性能监控和调优 1.1 调优相关参数 1.2 内存泄漏排查 1.3 cpu飙⾼ 2. 内存与垃圾回收 2.1JVM的组成&#xff08;面试题&#xff09; 2.2 Java虚拟机栈的组成 2.3 本地方法栈 2.4 堆 2.5 方法区&#xff08;抽象概念&#xff09; 2.5.1 方法区和永久代以及元空…

【vue】Pinia-2 安装Pinia,使用store

1. 安装Pinia 在项目路径下执行npm install pinia 在package.json中查看 2. 使用store 在main.js中添加 import { createPinia } from pinia const pinia createPinia()修改createApp方法 最后示例如下&#xff08;三处修改&#xff09; import { createApp } from vue //…

基于Docker构建CI/CD工具链(七)使用Jmeter进行自动化压测

上一篇文章中&#xff0c;我们详细介绍了构建 Apifox Cli 的 Docker 镜像的步骤&#xff0c;并通过简单的示例演示了如何利用 GitLab 的 CI/CD 功能&#xff0c;将构建好的镜像利用在自动化测试作业中。在今天的文章中&#xff0c;我们将重点讨论如何构建 JMeter 的 Docker 镜像…

【高通平台】如何升级蓝牙的firmware

1. 您可以使用以下命令升级固件 adb push apbtfw11.tlv /bt_firmware/image/ adb push apnv11.bin /bt_firmware/image/ adb shell sync 或者 adb push crbtfw21.tlv /vendor/bt_firmware/image adb push crnv21.bin /vendor/bt_firmware/image adb shell sync 查看代码路径…

项目5-博客系统3+接口完

1.实现显示用户信息 ⽬前⻚⾯的⽤⼾信息部分是写死的. 形如 我们期望这个信息可以随着用户登陆而发生改变. • 如果当前⻚⾯是博客列表⻚, 则显⽰当前登陆⽤⼾的信息. • 如果当前⻚⾯是博客详情⻚, 则显⽰该博客的作者⽤⼾信息. 注意: 当前我们只是实现了显⽰⽤⼾名, 没有…

Linux学习(1)

参考学习韩顺平老师 第一章&#xff1a;LINUX 开山篇-内容介绍 1.2.Linux 使用在那些地方 linux运营工程师主要做&#xff1a; 服务器规划 调试优化 对系统进行日常监控 故障处理 对数据的备份和处理 日志的分析 1.3.Linux 的应用领域 1.个人桌面领域的应用 …

短视频底层逻辑分析

短视频底层逻辑 1.迭代模型_ev 2.Douyin的本质_ev 3.Douyin的审核机制_ev 4.平台趋势_ev 5.定位_ev 6.建立用户期待_ev 7.好内容的定义_ev 8怎么做好内容_ev 9.如何做好选题_ev 10.如何快速模仿_ev 11.账号拆解的底层逻辑_ev 12选人的重要性_ev 13.内容的包装_ev 14.打造大IP的…

easyexcel升级3.3.4失败的经历

原本想通过easyexcel从2.2.6升级到3.3.3解决一部分问题&#xff0c;结果之前的可以用的代码&#xff0c;却无端的出现bug 1 Sheet index (1) is out of range (0…0) 什么都没有改&#xff0c;就出了问题&#xff0c;那么问题肯定出现在easyexcel版本自身.使用模板填充的方式进…

Innodb之redo日志

Innodb引擎执行流程 redo log ​ MySQL中的redo log&#xff08;重做日志&#xff09;是实现WAL&#xff08;预写式日志&#xff09;技术的关键组件&#xff0c;用于确保事务的持久性和数据库的crash-safe能力。借用《孔乙己》中酒店掌柜使用粉板记录赊账的故事&#xff0c;…

Flask前端页面文本框展示后端变量,路由函数内外两类

一、外&#xff01;路由函数外的前后端数据传输 Flask后端 ↓ 首先导入包&#xff0c;需要使用 后端&#xff1a;flask_socketio来进行路由外的数据传输&#xff0c; from flask_socketio import SocketIO, emit 前端&#xff1a;还有HTML头文件的设置。 <!DOCTYPE …

【云原生数据库:原理与实践】1- 数据库发展历程

1-数据库发展历程 1.1 数据库发展概述 从1960年&#xff1a;Integrated Database System&#xff08;IDS&#xff09;&#xff0c;该系统是一个网状模型&#xff08;Network Model&#xff09;到 IMS&#xff08;Information Management System&#xff09;&#xff0c;使用了…