简介目的:获取沪深两市所有股票的名称及成交信息。输出:保存到文件。技术路线:Scrapy爬虫框架语言:python3.5由于股票信息爬取的原理在之前的博客中已经介绍过,这里不再过多介绍。更多信息请参考博客:链接说明,本文主要讲解项目是如何在Scrapy框架中实现的。原理分析Scrapy框架如下图所示:我们主要进行两个步骤:(1)首先,我们需要在框架中编写一个爬虫程序spider,用于链接爬取和页面解析;(2)解析股票数据后编写流水线进行处理,并将数据存储在文件中。代码编写步骤:(1)创建项目生成Spider模板打开cmd命令行,定位到项目所在路径,输入:scrapystartprojectBaiduStocks,会在目录下新建一个名为BaiduStocks的项目.然后输入:cdBaiduStocks进入目录,然后输入:scrapygenspiderstocksbaidu.com生成爬虫。之后我们可以在spiders/目录下看到一个stocks.py文件,如下图所示:(2)写一个蜘蛛:配置stocks.py文件,修改返回页面的处理,修改新的URL抓取请求打开stock.py文件,代码如下:#-*-coding:utf-8-*-importscrapyclassStocksSpider(scrapy.Spider):name='stocks'allowed_domains=['baidu.com']start_urls=['http://baidu.com/']defparse(self,response):pass修改以上代码如下:#-*-coding:utf-8-*-importscrapyimportreclassStocksSpider(scrapy.Spider):name="stocks"start_urls=['http://quote.eastmoney.com/stocklist.html']defparse(self,response):forhrefinresponse.css('a::attr(href)').extract():尝试:stock=re.findall(r[s][hz]\d{6}",href)[0]url='https://gupiao.baidu.com/库存/'+库存+'。html'yieldscrapy.Request(url,callback=self.parse_stock)except:continuedefparse_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()foriinrange(len(keyList)):key=re.findall(r'>.*',keyList[i])[0][1:-5]try:val=re.findall(r'\d+\.?.*',valueList[i])[0][0:-5]except:val='--'infoDict[key]=valinfoDict.update({'股票名称':re.findall('\s.*\(',name)[0].split()[0]+\re.findall('\>.*\<',name)[0][1:-1]})yieldinfoDict(3)配置pipelines.py文件,定义抓取项(ScrapedItem)的处理类打开pipeline.py文件,如下图:#-*-coding:utf-8-*-#在此处定义您的项目管道##不要忘记将您的管道添加到ITEM_PIPELINES设置中#请参阅:http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlclassBaidostocksPipeline(object):defprocess_item(self,item,spider):returnitem修改上面代码如下:#-*-coding:utf-8-*-#在此处定义您的项目管道##不要忘记将您的管道添加到ITEM_PIPELINES设置#请参阅:http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlclassBaidostocksPipeline(object):defprocess_item(self,item,spider):returnitem#每个pipeline类中有3个方法classBaidistocksInfoPipeline(object):#当一个爬虫被调用时,对应的pipelinesstartmethoddefopen_spider(self,spider):self.f=open('BaiduStockInfo.txt','w')#爬虫关闭或结束时管道对应的方法defclose_spider(self,spider):self.f.close()#处理每个Item对应的方法也是管道中的主要功能defprocess_item(self,item,spider):try:line=str(dict(item))+'\n'self.f.write(line)except:passreturnitem(4)修改设置。py,框架找到我们在pipeline.py中写的类,添加到settings.py中:#配置itempipelines#见http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={'BaiduStocks.pipelines.BaidustocksInfoPipeline':300,}至此,程序完成(4)执行程序,在命令行输入:scrapycrawlstocks
