爬取东方财富股票代码

我们打开东方财富网站: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 = codereturn r.textexcept: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:continuedef getStockInformation(detailUrl, outputFile, stockList):count = 0for name in stockList:count = count + 1stockUrl = detailUrl + name + '.html'html = getHTMLText(stockUrl)try:if html == "":continuestockDict = {}soup = BeautifulSoup(html, 'html.parser')stockinfo = soup.find('div', attrs={'class': 'stock-bets'})stockname = stockinfo.find('a', attrs={'class': 'bets-name'})# 当标签内部还有标签时,利用text可以得到正确的文字,利用string可能会产生NonestockDict["股票名称"] = 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='')continuedef 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 reclass 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=0for href in response.css('a').extract():try:if count == 300:breakcount=count+1stockname=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:continuepassdef 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]=stockvalueyield 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.htmlclass BaidustocksPipeline(object):def process_item(self, item, spider):return itemclass 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:passreturn item

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

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

(4)运行爬虫:scrapy crawl stocks

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研数学|《1800》《1000》《660》《880》如何搭配❓

这几本书都是不同阶段对应的习题册 我觉得最舒服的使用就是方式就是基础阶段用《1800题基础部分》然后强化阶段主要刷《880题》并且强化阶段带着刷《660题》 上面是我的使用方式。之所以没有刷《1000题》是因为这本习题册的难度对我来说还是太大了&#xff0c;并且计算量很大…

LeetCode 每日一题 Day 123-136

1379. 找出克隆二叉树中的相同节点 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0c;以及一个位于原始树 original 中的目标节点 target。 其中&#xff0c;克隆树 cloned 是原始树 original 的一个 副本 。 请找出在树 cloned 中&#xff0c;与 tar…

【Python基础】—— scipy.spatial.KDTree、matplotlib.pyplot、imageio

scipy.spatial参考博客&#xff1a;Python点云处理——建立KDtree 1 KDtree算法原理 KDtree构建出了一种类似于二叉树的树形数据存储结构&#xff0c;每一层都对应原始数据中相应的维度&#xff0c;以K层为一个循环&#xff0c;因此被称为KDtree。 每一层的左右子树的划分依据…

PLC扩展更自由,钡铼IOy系列模块实现DI/DO/AI/AO任意组合

随着工业自动化的不断发展&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为工业控制领域的核心设备&#xff0c;扮演着至关重要的角色。而钡铼IOy系列模块作为PLC的重要扩展设备&#xff0c;不仅实现了DI&#xff08;数字输入&#xff09;、DO&#xff08;数字输出…

Noisy Student(CVPR 2020)论文解读

paper&#xff1a;Self-training with Noisy Student improves ImageNet classification official implementation&#xff1a;https://github.com/google-research/noisystudent 本文的创新点 本文提出了一种新的半监督方法Noisy Student Training&#xff0c;主要包括三步…

L2-3 完全二叉树的层序遍历

完全二叉树的层序遍历 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是完美二叉树。对于深度为 D 的&#xff0c;有 N 个结点的二叉树&#xff0c;若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点&#xff0c;这样的树就是完全…

防止企业数据泄密的四种有效措施

防止企业数据泄密的四种有效措施 泄密大案每天都在上演&#xff0c;受害者既有几十人的小型企业&#xff0c;也有上万人的世界500强&#xff0c;为什么这些企业都难逃数据泄露的噩梦呢&#xff1f;我们应该采取什么措施来防止信息泄密呢&#xff1f; 首先我们来看看数据泄密的…

Slf4j+Log4j简单使用

Slf4jLog4j简单使用 文章目录 Slf4jLog4j简单使用一、引入依赖二、配置 log4j2.xml2.1 配置结构2.2 配置文件 三、使用四、使用MDC完成日志ID4.1 程序入口处4.2 配置文件配置打印4.3 多线程日志ID传递配置 五. 官网 一、引入依赖 <dependencies><dependency><g…

C++项目 -- 负载均衡OJ(一)comm

C项目 – 负载均衡OJ&#xff08;一&#xff09;comm 文章目录 C项目 -- 负载均衡OJ&#xff08;一&#xff09;comm一、项目宏观结构1.项目功能2.项目结构 二、comm公共模块1.util.hpp2.log.hpp 一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ&#xff0c;实现类似…

leetcode1448.统计二叉树中的好节点数目

1. 题目描述 题目链接 2. 解题思路 首先看一下题目的“核心”&#xff0c;什么是好节点&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。也就是说&#xff0c;我们只要知道了从根节点到该节点的所有的值&#xff0c;就可以判断该节点是…

三个晚上!给干废了!MINI2440 挂载 NFS

虚拟机执行&#xff1a;sudo ifconfig tap0 10.10.10.1 up qemu 开发板&#xff1a; set bootargs noinitrd root/dev/nfs rw nfsroot10.10.10.1:/nfsroot ip10.10.10.10:10.10.10.1 ::255.255.255.0 consolettySAC0,115200 Hit any key to stop autoboot: 0 MINI2440 # set…

P5730 【深基5.例10】显示屏

思路&#xff1a; 此题只需要两层循环&#xff0c;通过数组映射即可求出答案 AC代码&#xff1a; #include<iostream>using namespace std;typedef long long ll; const int N 10; int a[N];int main() {ll n,m;cin >> n >> m;for(ll in;i<m;i){ll nu…