爬蟲學習——Scrapy框架學習(五)(股票數據Scrapy爬蟲實例及其爬取速度優化)

“股票數據Scrapy爬蟲”實例介紹

功能描述:

技術路線:scrapy

目標:獲取上交所和深交所所有股票的名稱和交易信息

輸出:保存到文件中

數據網站的確定:

獲取股票列表:

    東方財富網:http://quote.eastmoney.com/stock_list.html

獲取個股信息:

    百度股票:https://gupiao.baidu.com/stock/

    單個股票:例如https://gupiao.baidu.com/stock/sz000538.html

編寫:

步驟:

1、建立工程和Spider模板;

2、編寫Spider;

3、編寫Item Pipelines

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

>scrapy startproject BaiduStocks

>cd BaiduStocks

>scrapy genspider stocks baidu.com

進一步修改spiders/stocks.py文件

步驟2:編寫Spider

①配置stocks.py文件

②修改對返回頁面的處理

③修改對新增URL爬取請求的處理

# -*- coding: utf-8 -*-
import scrapy
import re

class StocksSpider(scrapy.Spider):
    name = 'stocks'
    #allowed_domains = ['baidu.com']
    #首先從東方財富網中獲得所有股票的代碼
    start_urls = ['http://quote.eastmoney.com/stock_list.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="https://gupiao.baidu.com/stock/"+stock+'.html'
                #作爲一個新的請求重新提交給Scrapy爬蟲,可以用yield關鍵字
                yield scrapy.Request(url,callback=self.parse_stock)
            except:
                continue

    def parse_stock(self,response):
        #因爲需要提交給Item Pipeline,所以我們定義一個空字典
        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][0:-5]
            except:
                val='--'
            infoDict[key]=val

        infoDict.update(
            {'股票名稱':re.findall('\s.*\(',name)[0].split()[0]+ \
                re.findall('\>.*\<',name)[0][1:-1]}
        )

        #將infoDict給到Item Pipeline
        yield infoDict

步驟3:編寫Pipelines

①配置pipelines.py文件

②定義對爬取項(Scraped Item)的處理類

編寫pipelines.py文件:

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


class BaidustocksPipeline(object):
    def process_item(self, item, spider):
        return item
#生成了一個新類
class BaidustocksInfoPipeline(object):
    #當一個爬蟲被調用時對應的pipeline啓動的方法
    def open_spider(self,spider):
        self.f=open('BaiduStockInfo.txt','w')

    def close_spider(self,spider):
        self.f.close()

    #對每一個item項進行處理時調用的方法
    def process_item(self,item,spider):
        try:
            line=str(dict(item))+'\n'
            self.f.write(line)
        except:
            pass
        #若我們希望其他函數也可以處理這個item,則返回它
        return item

在這個文件中,我們放棄了原有的類,嘗試定義新類的方法並通過修改配置文件,讓框架找到我們新定義的這個類

③配置ITEM_PIPELINES選項,讓框架找到我們這個新類(settings.py)

修改此部分(注意去掉註釋):

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'BaiduStocks.pipelines.BaidustocksInfoPipeline': 300,
}

到此程序結束

執行程序:

scrapy crawl stocks

實例優化:

提取爬取速度

依靠scrapy庫提供的相應的參數

配置併發連接選項

settings.py

_________________________________________________________________________

選項                                                               |||                          說明

CONCURRENT_REQUESTS                           Downloader最大併發請求下載數量,默認32

CONCURRENT_ITEMS                                     Item Pipeline最大併發ITEM處理數量,默認100

CONCURRENT_REQUESTS_PER_DOMAIN     每個目標域名最大的併發請求數量,默認8

CONCURRENT_REQUESTS_PER_IP              每個目標IP最大的併發請求數量,默認0,非0有效

—————————————————————————————————————————

更多的方法可以參考scrapy的文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章