爬取沪深a股数据

首先从东方财富网获取股票代码

再从网易财经下载股票历史数据

import requests
import random
from bs4 import BeautifulSoup as bs
import time
import redis
import re
import json

def get_stock_names():
    """
    通过东方财富网上爬取股票的名称代码,并存入redis数据库和本地txt文档
    """
    rds = redis.from_url(‘redis://:[email protected]:6379‘, db=1, decode_responses=True)   # 连接redis db1

    url = "http://quote.eastmoney.com/stocklist.html"
    headers = {
            ‘Referer‘: ‘http://quote.eastmoney.com/center/gridlist.html‘,
            ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36‘
        }

    response = requests.get(url, headers=headers).content.decode(‘utf-8‘)   # 网站编码为gbk 需要解码
    soup = bs(response, ‘lxml‘)
    all_ul = soup.find(‘div‘, id=‘table_wrapper-table‘).find_all(‘ul‘)   # 获取两个ul 标签数据
    with open(‘stock_names.txt‘, ‘w+‘, encoding=‘utf-8‘) as f:
        for ul in all_ul:
            all_a = ul.find_all(‘a‘)            # 获取ul 下的所有的a 标签
            for a in all_a:
                rds.rpush(‘stock_names‘, a.text)       # a.text 为a标签中的text数据  rpush将数据右侧插入数据库
                f.write(a.text + ‘\n‘)

def get_data(stocklist, outfile=r‘D:\PycharmProjects\web_scraping\stockdata‘):
    headers = {
        ‘Referer‘: ‘http://quotes.money.163.com/‘,
        ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36‘
    }
    for stock_code, stock_name in stocklist:
        try:
            #stock_code = stock_name.split(‘(‘)[1].split(‘)‘)[0]
            # 由于东方财富网上获取的代码一部分为基金,无法获取数据,故将基金剔除掉。
            # 沪市股票以6,9开头,深市以0,2,3开头,但是部分基金也是2开头,201/202/203/204这些也是基金
            # 另外获取data的网址股票代码 沪市前加0, 深市前加1
            if int(stock_code[0]) in [0, 2, 3, 6, 9]:
                if int(stock_code[0]) in [6, 9]:
                    stock_code_new = ‘0‘ + stock_code
                elif int(stock_code[0]) in [0, 2, 3]:
                    if not int(stock_code[:3]) in [201, 202, 203, 204]:
                        stock_code_new = ‘1‘ + stock_code
                    else: continue
                else: continue
            else: continue

            stock_url = ‘http://quotes.money.163.com/trade/lsjysj_{}.html‘.format(stock_code)
            respones = requests.get(stock_url, headers=headers).text
            soup = bs(respones, ‘lxml‘)
            start_time = soup.find(‘input‘, {‘name‘: ‘date_start_type‘}).get(‘value‘).replace(‘-‘, ‘‘)  #获取起始时间
            end_time = soup.find(‘input‘, {‘name‘: ‘date_end_type‘}).get(‘value‘).replace(‘-‘, ‘‘)  #获取结束时间
            time.sleep(random.choice([1, 2]))  #两次访问之间休息1-2秒
            download_url = "http://quotes.money.163.com/service/chddata.html?code={}&start={}&end={}&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP".format(stock_code_new, start_time, end_time)
            data = requests.get(download_url, headers=headers)
            file_name = outfile + ‘\\{}.csv‘.format(stock_code)
            with open(file_name, ‘wb‘) as f:
                for chunk in data.iter_content(chunk_size=10000):  #批量写入数据
                    if chunk:
                        f.write(chunk)
            print("{}数据已下载".format(stock_code))

        except Exception as e:
            print("{}({})数据下载报错".format(stock_name, stock_code))
            print(e)

#从东方财富网获取股票代码及名称
stocklist = []  #3769支,只有‘0‘,‘3‘,‘6‘开头的
max_page = 189
for i in range(max_page):
    url = ‘‘‘http://1.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112405721872315676919_1566176986516&pn={}
    &pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:13,m:0+t:80,m:1+t:2&
    fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152
    &_=1566176986517‘‘‘.format(i+1)
    response = requests.get(url).content.decode(‘utf-8‘)
    json_text = re.sub(r‘jQuery112405721872315676919_1566176986516\(‘, ‘‘, response)[:-2]
    #json_str = re.sub(r‘\)‘, ‘‘, response)
    json_text = json.loads(json_text)
    for fi in json_text[‘data‘][‘diff‘]:
        stocklist.append([fi[‘f12‘], fi[‘f14‘]])

# 从网易财经下载数据
get_data(stocklist, outfile=r‘D:\PycharmProjects\web_scraping\stockdata‘)

  

参考资料:

爬虫:爬取股票历史交易数据

爬取东方财富股票信息网

Python爬虫(5):比Selenium快100倍的方法爬东方财富网财务报表

原文地址:https://www.cnblogs.com/iupoint/p/11375932.html

时间: 2024-10-21 07:30:34

爬取沪深a股数据的相关文章

[python]初试页面抓取——抓取沪深股市交易龙虎榜数据

[python]抓取沪深股市交易龙虎榜数据 python 3.5.0下运行 没做自动建立files文件夹,需要手动在py文件目录下建立files文件夹后运行 #coding=utf-8 import gzipimport http.cookiejar import urllib.request import urllib.parse import json import os import time import datetime def getOpener(head): # deal with

python 爬取天猫美的评论数据

笔者最近迷上了数据挖掘和机器学习,要做数据分析首先得有数据才行.对于我等平民来说,最廉价的获取数据的方法,应该是用爬虫在网络上爬取数据了.本文记录一下笔者爬取天猫某商品的全过程,淘宝上面的店铺也是类似的做法,不赘述.主要是分析页面以及用Python实现简单方便的抓取. 笔者使用的工具如下 Python 3--极其方便的编程语言.选择3.x的版本是因为3.x对中文处理更加友好. Pandas--Python的一个附加库,用于数据整理. IE 11--分析页面请求过程(其他类似的流量监控工具亦可).

python爬取ajax动态生成的数据 以抓取淘宝评论为例子

在学习python的时候,一定会遇到网站内容是通过ajax动态请求.异步刷新生成的json数据的情况,并且通过python使用之前爬取静态网页内容的方式是不可以实现的,所以这篇文章将要讲述如果在python中爬取ajax动态生成的数据. 至于读取静态网页内容的方式,有兴趣的可以查看博客内容. 这里我们以爬取淘宝评论为例子讲解一下如何去做到的. 这里主要分为了四步: 一 获取淘宝评论时,ajax请求链接(url) 二 获取该ajax请求返回的json数据 三 使用python解析json数据 四

02. 爬取get请求的页面数据

目录 02. 爬取get请求的页面数据 一.urllib库 二.由易到难的爬虫程序: 02. 爬取get请求的页面数据 一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2. 二.由易到难的爬虫程序: 1.爬取百度首页面所有数据值 1 #!/usr/bin/env python 2 # -*

03.爬取get请求的页面数据

urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2. 二.由易到难的爬虫程序: 1.爬取百度首页面所有数据值 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #导包 4 import urllib.request 5 import urllib.parse

python网络爬虫第三弹(<爬取get请求的页面数据>)

一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是通过代码模拟浏览器发送请求,其常被用到的子模块在 python3中的为urllib.request 和 urllib.parse,在python2中的是 urllib 和 urllib2 二.由易到难首页面所有的数据值 1.爬取百度首页所有的数据值 import urllib.request import urllib.parse url = 'http://www.baidu.com' # 通过 URLopen

爬虫学习 Python网络爬虫第三弹《爬取get请求的页面数据》

爬虫学习 Python网络爬虫第三弹<爬取get请求的页面数据> 一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib.parse,在Python2中是urllib和urllib2. 二.由易到难的爬虫程序: 1.爬取百度首页面所有数据值 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #导包 4

使用python爬取东方财富网机构调研数据

最近有一个需求,需要爬取东方财富网的机构调研数据.数据所在的网页地址为: 机构调研 网页如下所示: 可见数据共有8464页,此处不能直接使用scrapy爬虫进行爬取,因为点击下一页时,浏览器只是发起了javascript网络访问,然后将服务器返回的数据插入网页,无法通过网址直接获取对应页的的页面数据. 通过chrome的开发者工具,我们可以看到点击下一页按钮背后发起的网页访问: 在点击下一页时,浏览器向地址发起了访问.我们分析一下这个地址的结构: http://data.eastmoney.co

Python爬取天气网历史天气数据

我的第一篇博客,哈哈哈,记录一下我的Python进阶之路! 今天写了一个简单的爬虫. 使用python的requests 和BeautifulSoup模块,Python 2.7.12可在命令行中直接使用pip进行模块安装.爬虫的核心是利用BeautifulSoup的select语句获取需要的信息. pip install requests pip install bs4 以武汉市2017年5~7月的历史为例爬取天气网中武汉市的历史天气数据. 7月对应的网址为http://lishi.tianqi