zoukankan      html  css  js  c++  java
  • scrapy实战

    采用scrapy实现对股票网站的爬取

    功能描述:

      技术路线:scrapy

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

    实例编写:

      步骤1:建立工程和spider爬虫模板

      步骤2:编写spider

      步骤3:编写item pipeline

    新建工程:

    生成名为stocks的爬虫

     打开IDE,将项目导入,首先我们要编辑spider文件夹下的stocks.py文件,使其能处理返回的url

    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():   #将a标签中的链接进行提取
                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)  #给出了处理url的响应函数,定义出一个新的函数parse_stock
                except:
                    continue
    
        def parse_stock(self, response):
            infoDict = {}
            stockInfo = response.css('.stock-bets')    #找到一个属性为stock-bets的区域
            name = stockInfo.css('.bets-name').extract()[0]   #提取股票名字
            keyList = stockInfo.css('dt').extract()           #提取每个dt标签
            valueList = stockInfo.css('dd').extract()         #提取每个dd标签
            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        #以备将列表内的信息传递给ITEM pipeline

    接下来要配置pipelines.py文件,定义对爬取项的处理类

    class BaidustockPipeline(object):
        def process_item(self, item, spider):
            return item
    
    class BaidustocksInfoPipeline(object):
        def open_spider(self, spider):  #爬虫被调用时,pipeline所启用的方法
            self.f = open('BaiduStockInfo.txt', 'w')
    
        def close_spider(self, spider): #爬虫关闭时,pipeline所启用的方法
            self.f.close()
    
        def process_item(self, item, spider):   #将每个股票的信息写入文件中
            try:
                line = str(dict(item)) + '
    '
                self.f.write(line)
            except:
                pass
            return item

    在pipelines.py中定义了一个类,为了让程序能找到这个类,需要配置ITEM_PIPELINES选项

    打开settings.py,找到ITEM_PIPELINES参数,删除注释号

     执行命令:

      

  • 相关阅读:
    NOI2013 树的计数
    拆系数FFT学习笔记
    HAOI2017 八纵八横——线段树分治+线性基
    BJOI2018链上二次求和——线段树
    [bzoj3514]Codechef MARCH14 GERALD07加强版——lct+主席树
    KD-Tree 学习笔记
    SDOI2010 捉迷藏 —— KD-Tree
    HAOI2018染色——容斥
    gitignore 不起作用的解决办法
    reids学习教程
  • 原文地址:https://www.cnblogs.com/Ragd0ll/p/10274572.html
Copyright © 2011-2022 走看看