股票HTML网页分析:

东方财富网可以看到股票信息:

http://quote.eastmoney.com/stocklist.html

查看源代码:

R001(201008)R004(201010)RC001(202001)

可以在href中提取股票的代码,

想了解股票的具体信息,需要去百度股票查找,方法为:

'https://gupiao.baidu.com/stock/股票代码.html

查看具体股票的源代码:

国祯环保 (300388)

已休市 2017-09-29 15:00:03

--

--

--

今开
19.92
成交量
8917手
最高
20.15
涨停
21.96
内盘
4974手
成交额
1786.10万
委比
-50.69%
流通市值
59.98亿
市盈率MRQ
50.59
每股收益
0.20
总股本
3.06亿
昨收
19.96
换手率
0.30%
最低
19.92
跌停

17.96

外盘
3943手
振幅
1.15%
量比
0.11
总市值
61.35亿
市净率
3.91
每股净资产
5.14
流通股本
2.99亿

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

方法一:采用bs4库和正则表达式

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()可以提取标签元素为字符串从而实现匹配正则表达式的处理

正则表达式详解:

国祯环保 (300388)

re.findall('.*\(', stockname)[0].split()[0] + '('+re.findall('\>.*\

匹配结果:国祯环保(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('\>.*\

for i in range(len(keyList)):

stockkey=re.findall(r'>.*',keyList[i])[0][1:-5]

stockvalue=re.findall(r'>.*',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

python爬取股票图_python 股票数据爬取(两种方法)相关推荐

  1. python右对齐格式化输出_Python中格式化输出的两种方法介绍

    本篇文章给大家带来的内容是关于Python中格式化输出的两种方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 方式一:使用占位符 % 常用占位符:% s (s = string ...

  2. python求列表的中位数_python中获取中位数的两种方法

    普通方法: 对列表进行排序,然后根据长度为奇数或者偶数的不同情况计算中位数 def huahua(x): length = len(x) print(length) x.sort() print(x) ...

  3. python csv合并单元格_python中合并表格的两种方法

    合并表格要注意的是设置表格的表头,也就是是将表格第一列设置为合并表格的索引,这样合并表格的时候就会合并两个表格第一列的元素相同的行. 方法一:使用join合并import numpy as np im ...

  4. python numpy读取数据_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  5. python大神读取_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  6. 数据增加的两种方法(二)

    数据增加的两种方法(二) 开发工具与关键技术:SQL Server 2014.数据增加的两种方法(二) 作者:袁何恩 撰写时间:2019年7月26日 今天,我要和大家分享的技术是新增数据的两种方法. ...

  7. Python进阶之使用Scrapy实现自动登录Github的两种方法(POST,FormRequest,from_response)

    Python进阶之使用Scrapy实现自动登录Github的两种方法 1. 通过.FormRequest()实现登录github github1.py 2. 通过.FormRequest.from_r ...

  8. WPF中在XAML中实现数据类型转换的两种方法

    WPF中在XAML中实现数据类型转换的两种方法 原文:WPF中在XAML中实现数据类型转换的两种方法 熟悉数据绑定的朋友都知道,当我们在Model中获取一个对象的数据,常常需要对其进行数据转换后显示在 ...

  9. 怎么在python中添加文字_Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  10. python对列表进行去重_Python对列表去重的4种方法

    开发中对数组.列表去重是非常常见的需求,对一个list中的id进行去重,有下面几种方法,前面两种方法不能保证顺序, 后面两种方法可以保持原来的顺序. 下面的代码都在Python3下测试通过, Pyth ...

最新文章

  1. html脚本语言居中,web前端:CSS--几种常用的水平垂直居中对齐方法
  2. MySql中当in或or参数过多时导致索引失效
  3. Qt5 常见的控件类关系
  4. linux ssh和scp,Linux SSH 与 SCP命令简述
  5. linux java的启动内存溢出,java - Java的R代码可在Linux上运行,但不能在Windows中运行 - 堆栈内存溢出...
  6. 网上书店模板asp与html,一个简单的网上书城的例子(三)_asp实例
  7. ubuntu 安装 pycharm
  8. 【147天】尚学堂高淇Java300集视频精华笔记(108-109)
  9. 高清接口芯片---gv7600、sii9135
  10. 《Servlet和JSP学习指南》一导读
  11. NBIA Data Retriever(NBIA数据下载工具)使用
  12. python基本运算符
  13. python连接数据库--查询数据
  14. 【从C到C++学习笔记】域运算符/new/delete运算符/重载/Name managling/extern C/带函数默认值参数
  15. cmd批量修改文件名 增加文字_[Windows应用技巧][cmd篇][批量更改文件名]
  16. php字符串去重和去空,php去空格
  17. [分析力学]解题思路 - 最小作用量原理
  18. Win10安装-我们无法创建新的分区,也找不到现有的分区
  19. 无法设置默认打开方式怎么办
  20. 怎么把桌面计算机的快捷,教你在电脑桌面如何设置“一键关机”快捷图标的教程...

热门文章

  1. 信息系统安全实验——Week 8
  2. 头歌平台(EduCoder)—— Matplotlib接口和常用图形
  3. Everything Is Generated In Equal Probability HDU 6595(期望dp)
  4. Transformer+目标检测,这一篇入门就够了
  5. 天气查询调用天气API
  6. OpenLayers基础:在IIS中部署并启用CGI
  7. 10 模拟SPI驱动PS2无线手柄
  8. 时光易逝,岁月荏苒----2019年自我总结
  9. 修改Android手机内核,绕过反调试
  10. 如何启用计算机睡眠功能,如何让电脑休眠_如何开启电脑休眠模式-win7之家