Scrapy是用纯Python实现的一个为了爬取网站数据、提取结构性数据的应用框架,用途非常广泛。通过定制开发几个模块我们就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。本文我们利用Scrapy获取某基金网站数据,为自己进行数据分析、挖掘甚至自己理财获得第一手矿。
本文省略Scrapy的安装,可参照Scrapy的中文社区网站
win7安装scrapy_Scrapy1.5中文文档_Scrapy 中文网www.scrapyd.cn一、项目创建
- 首先我们需要创建一个项目,在这个项目向下我们可以创建自己的爬虫,一个项目中可以创建多个爬虫。这里建立一个名为gold_mine的项目,“金矿”后面我们要用到这些数据进行分析和挖掘,我们姑且就叫“金矿”吧。
scrapy startproject gold_mine
这里我们就创建了一个项目,项目内容如下
Scrapy框架的整体以及运行逻辑图如下图所示
Scrapy (引擎): 为整个框架的枢纽站,负责Spider(我们写的爬虫)、ItemPipeline、Downloader、Scheduler之间的的通讯,信号、数据传递等。
Scheduler(调度器): 负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件):可用于扩展下载功能。
Spider Middlewares(Spider中间件):可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)。
在初级阶段我们基本只需要接触Spider、Item Pipeline,对应我们新建项目,也就是spider、items、pipelines以及setting
二. 创建完项目后我们就开始创建我们的爬虫,
scrapy genspider ddfund fund.eastmoney.com
2.1. 编写Item:
class DdfundItem(scrapy.Item):
# define the fields for your item here like:
funding_date = scrapy.Field() # 成立日期
manager = scrapy.Field() # 基金经理
type = scrapy.Field() # 基金类型
company = scrapy.Field() # 基金管理公司
assets = scrapy.Field() # 资产规模
code = scrapy.Field() # 基金代码
2.2. 编写我们的爬虫
这里为了获得加载完全的基金数据,使用了Selenium自动化测试工具Webdriver(详细如何用暂不细说,已有有机会再写吧)。可以获得如下加载后的页面。这里主要是为了获得基金的代码,以进一步获得基金的收益信息。
class DdfundspiderSpider(scrapy.Spider):
name = 'ddfundspider'
allowed_domains = ['fund.eastmoney.com']
start_urls = ['http://fund.eastmoney.com/fund.html#os_0;isall_1;ft_|;pt_1']
base_url = 'http://fundf10.eastmoney.com/jndzf_{0}.html'
browser = webdriver.Chrome()
def parse(self, response):
item = DdfundItem()
all_fundcode = response.xpath('//*[@id="bodydiv"]/div[8]/div[3]/div[1]/div[2]/p/*')
item['code'] = response.xpath('//*[ @ id = "bodydiv"]/div[8]/div[3]/div[1]/div[1]/div[1]/h4/a/text()').extract()[0]
item['funding_date'] = all_fundcode[0].xpath('./span/text()').extract()[0]
item['manager'] = all_fundcode[1].xpath('./a/text()').extract()[0]
item['type'] = all_fundcode[2].xpath('./span/text()').extract()[0]
item['company'] = all_fundcode[3].xpath('./a/text()').extract()[0]
item['assets'] = all_fundcode[4].xpath('./span/text()').extract()[0]
yield item
'''
初始页面,获取所有基金的基本信息。重写框架的的start_requests,以获得我们需要的基金代码,生产新的请求地址。
'''
def start_requests(self):
print('n**********************************n'
'n爬虫进入初始页面,获取所有基金代码n'
'n**********************************n')
browser = webdriver.Chrome()
browser.get(self.start_urls[0])
fund_codes = browser.find_elements_by_xpath('//*[@id="oTable"]/tbody/*')
for code in fund_codes:
print('n进入基金:{0}访问页面'.format(code.find_element_by_xpath('./td[4]').text))
yield Request(self.base_url.format(code.find_element_by_xpath('./td[4]').text), dont_filter=True)
browser.close()
通过parse函数我们可以获得基金的名称、基金代码等基本信息:
三、爬取信息的处理(item)
3.1 通过爬虫爬取的数据我们需要进行持久化保存,也就是说存到本地数据库或者CSV等文档中。而此任务我们可以交给pipeline了也就是我们工程中的pipelines.py。这里我们将数据直接存储到CSV文件中。
# -*- 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
import csv
import os
class DdfundPipeline(object):
def __init__(self):
if os.path.exists('./funding_main_info.csv'):
os.remove('./funding_main_info.csv')
self.f = open('./funding_main_info.csv', 'w')
self.csv_write = csv.writer(self.f, 'excel', lineterminator='n')
self.csv_write.writerow([ 'funding_date', 'manager', 'type', 'assets', 'code', 'company'])
def process_item(self, item, spider):
self.csv_write.writerow((item['funding_date'],
item['manager'],
item['type'],
item['assets'],
item['code'],
item['company']))
return item
def close_spider(self, spider):
self.f.close()
3.2 设置setting文件,利用DdfundPipeline处理item数据
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'ddfund.pipelines.DdfundPipeline': 300,
}
最后可以得到如下数据