(十)"股票数据Scrapy爬虫"(读书笔记
2018-01-24 本文已影响231人
努力奋斗的durian
1."股票数据定向爬虫"实例介绍
2."股票数据定向爬虫"实例编写
3."股票数据定向爬虫"实例优化
4.scrapy单元小结及应用展望
5.python爬虫的总结
6."股票数据Scrapy爬虫"完整的代码
网页链接【Python网络爬虫与信息提取】.MOOC. 北京理工大学
https://www.bilibili.com/video/av9784617/index_55.html#page=60
最近更新:2018-01-24
1."股票数据定向爬虫"实例介绍
1.1功能描述

1.2数据网站的确定
- 获取股票链接:
东方财富网http://quote.eastmoney.com/stocklist.html - 获取个股信息:
百度股票https://gupiao.baidu.com/stock/
单个股票[https://gupiao.baidu.com/stock/sz002439.html]
(https://gupiao.baidu.com/stock/sz002439.html)

1.3了解scrapy框架结构
- 在这个框架中编写爬虫程序,即一个spiders,需要处理链接爬取以及网页解析的功能.
- 同时编写ITEM Pipelines处理解析后的股票数据,并将这些数据存储在文件中

2."股票数据定向爬虫"实例编写

2.1步骤建立工程和Spider模板

在cmd中输入命令1,命令2,命令3,并根据提交命令的地址中查找spider文件下的stocks.py文件.,具体如截图:

2.2编写Spider

- 整个爬虫框架的初始链接,这个爬虫最开始的地方是从东方财富网获得列表,最开始的链接应该是东方财富网股票列表的url信息,爬取相关的信息.
- 对爬取回来的内容要做相关的解析,在东方财富网的股票列表中间查找股票的代码,并生成与百度股票相关的url链接
- 做一个for循环,对链接a标签的信息进行提取
- 写一个try and except上,把精力放在有效的爬取上,而错误的信息用except进行处理.
- 用正则表达式获取其中的股票代码,生成百度股票页面对应的链接
- url就是对应股票单个股票对应的链接信息
- 可以把这个新的请求重新提交给scrapy框架,用yield关键词将pass变成一个生成器.
- callback给出了处理url对应响应的处理函数,为了与页面当前的函数有所区分,我们定义一个新的函数叫parse_stock函数
- parse_stock函数从百度股票中提取页面信息的方法.由于这个函数最终要返回提取的信息给ITEM Pipelines,items是一个字典类型,对每一个页面生成一个空字典.
- 结合百度股票各股页面信息,用css提取信息.找到属性为stock-bets的区域
- 然后在这个区域中,我们进一步检索bets-name,并把相关的字符串提取出来,此时我们拿到股票的名字
- 对股票的其他信息键和值进行提取,用css选取dd和dt标签.
- 最后将股票的名称进行更新
到此这个infoDict保持了一个股票页面提取的股票名称以及相关的信息,把这个信息交给后续处理的ITEM Pipelines模块.
2.3编写ITEM Pipelines
spider是将已处理了所有的股票信息,以字典的类型封装成items类,给到了ITEM Pipelines模块,

2.3.1配置pipelines.py文件
-
找到pipelines.py这个文件,并打开,有一个类叫BaidustocksPipeline,这里的每一个类,都有一个items处理的过程,如截图:
2.3.2定义对爬取项(Scraped Item)的处理类
- 对每一个items进行处理.定义新类的原因是尝试定义新类的方法,通过配置文件,用框架找到我们新定义的类.并且用这个类处理spider提出和提取的相关items信息,
- 在每个Pipelines中有三个方法,每个方法对应一个函数.
- open_spider是指爬虫被调用时,对应pipelines启动的方法
- process_item是指对每一个items项进行处理时对应的方法,也是pipelines最主体的函数.打开的爬虫的时候,我们希望建立一个文件,关闭文件的时候,我们希望文件被关闭.而处理items的时候希望每一个股票信息写到这个文件中,在process_item中需要将获得的股票字典信息,写入一个文件,
2.3.3配置ITEM_PIPELINES选项
因定义了一个新的类,需要scrapy框架能够找到它.
- 需要找到一个文件叫settings.py,进行修改ITEM_PIPELINES选项.

-
在settings.py文件中寻找一个参数叫ITEM_PIPELINES,修改里面的类名,如截图:
2.4代码编写总结
- 这里生成了一个spider,能够从东方财富网站获得股票的列表,并且针对每一个股票列表,生成一个百度股票的链接,并向百度股票的链接进行爬取,对爬取后的信息经过spider处理,提取其中的关键信息,形成字典,并将字典以item类的形式,给到了ITEMPIPELINES进行后续处理;
- 执行命令:
在cmd中输入:scrapy crawl stocks
3."股票数据定向爬虫"实例优化

这里的32是指32个链接
4.scrapy单元小结及应用展望
4.1scrapy的爬虫的单元总结

4.2scrapy的爬虫的地位
具有持续爬取,商业服务,高可靠性的功能和特点

4.3scrapy的爬虫的应用展望


5.python爬虫的总结




6."股票数据Scrapy爬虫"完整的代码
6.1stocks.py页面的代码
import scrapy
import re
class StocksSpider(scrapy.Spider):
name = 'stocks'
start_urls = ['http://quote.eastmoney.com/stocklist.html']
def parse(self, response):
for href in response.css("a::attr(href)").extract():
try:
stock = re.findall(r"[s][hz]\d{6}", href)[0]
url ="http://gupiao.baidu.com/stock/"+stock+".html"
yield scrapy.Request(url,callback=self.parse_stock)
except:
continue
def parse_stock(self, response):
infoDict={}
stockInfo=response.css(".stock-bets")
name=stockInfo.css(".bets-name").extract()[0]
keyList=stockInfo.css("dt").extract()
valueList=stockInfo.css("dd").extract()
for i in range(len(keyList)):
key =re.findall(r'>.*</dt>',keyList[i])[0][1:-5]
try:
val=re.findall(r'\d+\.?.*</dd>',valueList[i])[0][1:-5]
except:
val='--'
infoDict[key]=val
infoDict.update(
{"股票名称":re.findall('\s.*\(',name)[0].split()[0]+ \
re.findall("\>.*\<",name)[0][1:-1]})
yield infoDict
6.2pipelines.py页面的代码
class BaidustocksPipeline(object):
def process_item(self, item, spider):
return item
class BaidustocksInfoPipeline(object):
def open_spider(self,spider):
self.f = open("BaiduStockInfo.txt","a")
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
6.3settings.py页面的代码
ITEM_PIPELINES = {
'BaiduStocks.pipelines.BaidustocksInfoPipeline': 300,
}