Python爬虫实例:Scrapy爬取股票信息到SQL数据库

今天给大家分享一个之前完成的爬虫实例,利用Scrapy库和docker爬取股票信息。
这个案例的目标是爬取股票的信息并存放到SQL Server当中。
这应该算是爬虫入门必学的案例了,话不多说,直接上干货。

首先看一下我们今天要用到的库和工具:

from scrapy import Spider, Request
from scrapy_splash import SplashRequest
import scrapy
import re
from getStock.items import GetstockItem

用到的库有:
scrapy 爬虫库
re 用于匹配我们需要的网站信息
scrapy_splash 帮助我们爬取动态网站的信息
(如果不知道什么是动态网站的话,最简单的说法就是不能直接用request库爬取的网站)
需要注意scrapy_splash是要额外安装的

pip install scrapy_splash

用到的工具:
Docker
SQL Server2019

相信大家对sql已经很熟悉了,可能对docker比较陌生。
Docker图标

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
它的应用场景主要是:
1、Web 应用的自动化打包和发布。
2、自动化测试和持续集成、发布。
3、在服务型环境中部署和调整数据库或其他的后台应用。
4、从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

大家可以点击下面的链接去对docker进行更深入的了解和学习。
Docker简易教程
Win10下安装Docker
SqlServer2019安装教程

接下来就进入到我们的代码部分吧

headers = {
    
    
    'User-Agent': 'User-Agent:Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11'
}

#给我们的爬虫加一个伪装的header防止被网站检测到

我们的目标是要首先要去到东方财富网中获取我们所有股票的代码,再去到搜狐股票网中获取对应股票我们需要的信息。
在这里插入图片描述
对着我们的代码右键检查,可以跳转到代码这个元素在网站中的位置
在这里插入图片描述
我们的目标是提取到圈圈中的股票代码,使用re和css可以很简单的完成这个目标

 class StockSpider(scrapy.Spider):
    name = 'stock'
    start_urls = ['http://quote.eastmoney.com']


    def start_requests(self):
        url = 'http://quote.eastmoney.com/stock_list.html'
        yield SplashRequest(url, self.parse, headers=headers)

    def parse(self, response):
        for href in response.css('a::attr(href)').extract():
            try:
                stock = re.findall(r"\d{6}", href)[0]
                url = 'http://q.stock.sohu.com/cn/' + stock
                yield SplashRequest(url, self.parse1,args={
    
    'wait':5}, headers=headers )
            except:
                continue

注意我们这里在parse中返回的URL是搜狐网站的链接加上我们的股票代码所形成的URL,这个url可以帮助我们跳转到每一个股票所在的信息页面。
例如平安银行(000001)的URL链接就是:https://q.stock.sohu.com/cn/000001
在这里插入图片描述
那么接下来我们就要取出每一个股票中我们所需要的信息了。在这里博主提取了的是每一个股票的:股票代码,股票名称,现时价格,昨收价格,开盘价格,最高价格,最低价格,总交易额,所属行业,日期,初步建议
同样的我们右键检查跳转到我们需要提取的元素位置

在这里插入图片描述
在这里可以找到我们所需要的股票信息,接下来就可以用简单粗暴的xpath进行提取。

    def parse1(self, response):
        item = GetstockItem()

        try:
            stockinfo = response.xpath('// *[ @ id = "contentA"] / div[2] / div / div[1]')
            item['name'] = stockinfo.xpath('//*[@class="name"]/a/text()').extract()[0]
            item['code'] = stockinfo.xpath('//*[@class="code"]/text()').extract()[0].replace('(','').replace(')','')
            item['date'] = stockinfo.xpath('//*[@class="date"]/text()').extract()[0]
            item['nprice'] = float(stockinfo.xpath('//li[starts-with(@class,"e1 ")]/text()').extract()[0])
            item['high'] = float(response.xpath('//*[@id="FT_priceA2"]/tbody/tr[1]/td[5]/span/text()').extract()[0])
            item['low'] = float(response.xpath('//*[@id="FT_priceA2"]/tbody/tr[2]/td[5]/span/text()').extract()[0])
            item['ed'] = float(response.xpath('//*[@id="FT_priceA2"]/tbody/tr[1]/td[7]/span/text()').extract()[0])
            item['op'] = float(response.xpath('//*[@id="FT_priceA2"]/tbody/tr[2]/td[7]/span/text()').extract()[0])
            item['volume'] = float(response.xpath('//*[@id="FT_priceA2"]/tbody/tr[2]/td[3]/span/text()').extract()[0].replace('亿',''))
            item['hangye'] = response.xpath('//*[@id="FT_sector"] / div / ul / li[1]/a/text()').extract()[0]
            suggests = response.xpath('//*[@id="contentA"]/div[2]/div/div[3]/div[2]/div[2]/div[1]/div[2]/table/tbody/tr[1]')
            item['suggest'] = suggests.xpath('//td[starts-with(@class,"td1 ")]/span/text()').extract()[0]


        except:
            pass

        yield item

这就是我们爬虫部分所有代码了,看起来是不是很简单。但是scrapy库要完成这个功能,还需要设置它本身包含的配置文件。
Settings.py设置:

ROBOTSTXT_OBEY = False #原本为True
DOWNLOADER_MIDDLEWARES = {
    
    
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810
}
#更改DOWNLOADER_MIDDLEWARES中的配置
ITEM_PIPELINES = {
    
    
   'getStock.pipelines.GetstockPipeline': 300,
}
#这里的ITEM要对应item.py中的item类的名字,否则会报错
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'
SPLASH_URL = "http://192.168.5.185:8050/"
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408]
#SPLASH_URL要改成自己电脑的docker默认地址

item.py设置:

扫描二维码关注公众号,回复: 11777567 查看本文章
import scrapy


class GetstockItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()
    code = scrapy.Field()
    nprice = scrapy.Field()
    op = scrapy.Field()
    ed = scrapy.Field()
    high = scrapy.Field()
    low = scrapy.Field()
    volume = scrapy.Field()
    date = scrapy.Field()
    hangye = scrapy.Field()
    suggest = scrapy.Field()

#你在网站中要取多少个信息,就要有相应的item,不然信息无法返回给爬虫

最后的配置是pipelines.py。要实现将我们得到的信息存入到数据库中,就要在这里进行配置。大家在自己实现的时候要记得将信息调整为自己的数据库信息。

先在我们的SQL中创建一个用来存放的表
在这里插入图片描述

import pyodbc


class GetstockPipeline(object):
    def __init__(self):
        self.conn = pyodbc.connect("DRIVER={SQL SERVER};SERVER=服务器名;UID=用户名;PWD=密码;DATABASE=数据库名")
        self.cursor = self.conn.cursor()

    def process_item(self,item,spider):
        try:
            sql = "INSERT INTO dbo.stock_data(股票代码,股票名称,现时价格,昨收价格,开盘价格,最高价格,最低价格,总交易额,所属行业,日期) VALUES('%s','%s','%.2f','%.2f','%.2f','%.2f','%.2f','%.2f','%s','%s')"
            data = (item['code'],item['name'],item['nprice'],item['ed'],item['op'],item['high'],item['low'],item['volume'],item['hangye'],item['date'])
            self.cursor.execute(sql % data)
            try:
                sql = "update dbo.stock_data set 初步建议='%s' where dbo.stock_data.股票代码=%s"
                data = (item['suggest'],item['code'])
                self.cursor.execute(sql % data)
                print('success')
            except:
                sql = "update dbo.stock_data set 初步建议='该股票暂无初步建议' where dbo.stock_data.股票代码=%s"
                data = item['code']
                self.cursor.execute(sql % data)
                print("该股票暂无初步建议")
            self.conn.commit()
            print('信息写入成功')
            
           
 #这里填入初步建议的时候使用了try和expect,因为有的股票没有这个初步建议,爬虫爬取不到会报错

        except Exception as ex:
            print(ex)
        return item

以上就是代码部分的所有内容了,接下来我们只需要运行我们的爬虫就可以了!

scrapy crawl stock

在这里插入图片描述
成功地爬取了所有的股票信息,来看看我们是否能在数据库中看到这些信息吧。
在这里插入图片描述
所有信息都已经成功的存放到数据库当中了!

以上就是这个案例的所有内容了。主要的难点其实在docker的安装实现当中,博主当时弄了很长一段时间才将docker成功跑起来。大家如果有疑问或者有更好的做法的话可以在评论区提出,博主看到的话会及时回复的。

谢谢你们的阅读!

猜你喜欢

转载自blog.csdn.net/kiligso/article/details/108716391