Python 爬虫-股票数据的Scrapy爬虫
发布日期:2022-04-02 18:15:37 浏览次数:7 分类:博客文章

本文共 4799 字,大约阅读时间需要 15 分钟。

2017-08-06 19:52:21

目标:获取上交所和深交所所有股票的名称和交易信息

输出:保存到文件中

技术路线:scrapy

获取股票列表:

东方财富网:http://quote.eastmoney.com/stocklist.html
获取个股信息:
百度股票:https://gupiao.baidu.com/stock/
单个股票:https://gupiao.baidu.com/stock/sz002439.html

程序框架

编写spider处理链接爬取和页面解析,编写pipelines处理信息存储。

一、具体流程

步骤1:建立工程和Spider模板

步骤2:编写Spider
步骤3:编写ITEM Pipelines

  • 建立工程和Spider模板

\>scrapy startproject BaiduStocks

\>cd BaiduStocks
\>scrapy genspider stocks baidu.com
进一步修改spiders/stocks.py文件

  • 编写Spider
    •  配置stocks.py文件
    • 修改对返回页面的处理
    • 修改对新增URL爬取请求的处理

stocks.py修改前

stock.py修改后

# -*- coding: utf-8 -*-import scrapyimport reimport randomclass StocksSpider(scrapy.Spider):    name = "stocks"    start_urls = ['http://quote.eastmoney.com/stocklist.html']    user_agent_list = [\        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"\        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",\        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",\        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",\        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",\        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",\        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",\        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",\        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",\        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"]    def parse(self, response):        ua = random.choice(self.user_agent_list)        headers = {          'Accept-Encoding':'gzip, deflate, sdch, br',          'Accept-Language':'zh-CN,zh;q=0.8',          'Connection':'keep-alive',          'Referer':'https://gupiao.baidu.com/',          'User-Agent':ua          }#构造请求头        for href in response.css('a::attr(href)').extract():            try:                stock = re.findall(r"[s][hz]\d{6}",href)[0]                url = "https://gupiao.baidu.com/stock/"+stock+".html"                yield scrapy.Request(url,callback=self.parse_stock,headers = headers)            except:                continue    def parse_stock(self,response):        #itempipline模块接受的是字典类型的数据        infodict = {}        name = response.css('.bets-name').extract()[0]        keylist = response.css('dt').extract()        vallist = response.css('dd').extract()        for i in range(len(keylist)):            key = re.findall(r".*>(.*)",keylist[i])[0]            try:                val = re.findall(r">[-]?\d+\.?.*",vallist[i])[0][1:-5]            except:                val = "--"            infodict[key] = val        infodict.update({"股票名称":re.findall(r"\s+.*\(",name)[0].split()[0]+re.findall(r"\d+

 

Scrapy中提供了css选择器,可以使用css选择器进行html页面的提取。

主要的使用方法有:

<HTML>.css('a::attr(href)').extract() : 这样会提取到a标签下的href属性的值,并提取为字符串,返回一个列表

<HTML>.css('a').extract() :这样会提取所有a标签以及全部内容,转成字符串,返回一个列表

<HTML>.css('.calc').extract():这样会提取所有类型为calc的标签及其全部内容,转成字符串,返回一个列表

<HTML>.css('.calc'):不提取的话,会返回一个选择器类型,可以继续对类型为calc的便签内容进行继续提取

  • 编写Pipelines

配置pipelines.py文件

定义对爬取项(Scraped Item)的处理类,每一个类处理一个items
配置ITEM_PIPELINES选项

pipelines.py修改前:

pipelines.py修改后

# -*- 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#每一个类都是对一个itme进行处理的类class BaidustocksPipeline(object):    def process_item(self, item, spider):        return itemclass Baidustocksinfopipeline(object):    def open_spider(self,spider):        self.f = open("Baidustockinfo.txt",'w')    def close_spider(self,spider):        self.f.close()    def process_item(self,item,spider):        try:            line = str(dict(item))+"\n"            self.f.write(line)        except:            pass        return item

 

  • 配置settings.py文件

  • 最后使用 Scrapy crawl stocks 执行爬虫

 

注意事项:

在实际编写过程中遇到不少的问题,这里提一下其中的需要注意的部分。

(1)爬取的结果为403,爬取失败。这一般是反爬虫程序在作怪,使用自行配置的headers即可解决。

(2)正则表达式的匹配问题,主要是最短匹配的问题里有个更高优先级的是,最先开始匹配的拥有最高优先级。

(3)extract()提取出来的是列表,在使用的时候需要加上 [ i ],同理,re.findall()返回的也是列表,即使仅包含一个元素也需要使用[0]来进行成员的访问。

 

转载地址:https://www.cnblogs.com/hyserendipity/p/7295761.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:24点游戏
下一篇:Python map/reduce

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月24日 21时04分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

php sspi,php 内置的 web 服务器 php -s 2019-04-21
java生成结果集向量,如何解释H2o深度学习输出向量? 2019-04-21
matlab 曲线拟合求导,如何对matlab cftool拟合得到的cfit函数求导数 2019-04-21
matlab 50hzquchu,新手求消除50HZ工频干扰陷波滤波器源程序 2019-04-21
laravel没有route.php,Laravel中的RouteCollection.php中的NotFoundHttpException 2019-04-21
php服务端开启socket,php socket服务端能不能在网页端开启?而不是只能用CLI模式开启... 2019-04-21
php不需要也能输出,php 如何只输出最后生成的那个值?? 2019-04-21
php正则过滤sql关键字,使用正则表达式屏蔽关键字的方法 2019-04-21
php取整v,php取整方式分享 2019-04-21
php写模糊搜索api接口,php通过sphinxapi接口实现全文搜索 2019-04-21
oracle安装出现2932,【案例】Oracle报错ORA-19815 fast_recovery_area无剩余空间解决办法... 2019-04-21
rac数据库下oracle打小补丁,Oracle 11g RAC 环境打PSU补丁的详细步骤 2019-04-21
form表单属性名相同java_form表单提交时候有多个相同name 的input如何处理? 2019-04-21
java图片加气泡文字_图片加气泡文字 2019-04-21
java总结i o流_14.java总结I/O流 2019-04-21
java和历转为西历_日期转西暦,和暦 2019-04-21
java 远程 yarn jar_再论Yarn Client和Yarn cluster 2019-04-21
java单元测试断言_单元测试+断言 2019-04-21
java 创建压缩包_用Java创建ZIP压缩文件 2019-04-21
java typedarray_TintTypedArray.java 2019-04-21