美文网首页Python网络爬虫与信息提取
(十)"股票数据Scrapy爬虫"(读书笔记

(十)"股票数据Scrapy爬虫"(读书笔记

作者: 努力奋斗的durian | 来源:发表于2018-01-24 08:40 被阅读231次

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数据网站的确定

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,
}

相关文章

网友评论

    本文标题:(十)"股票数据Scrapy爬虫"(读书笔记

    本文链接:https://www.haomeiwen.com/subject/bfuyaxtx.html