“股票數據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的文檔