1.scrapy概述
使用Python开发的主要进行数据采集的一个应用程序框架,核心使用它来进行爬虫程序的快速开发,底层使用了twisted异步模块,所以在进行数据采集下载时效率非常高!
2.安装
pip install scrapy
或者
easy_install scrapy
PS:在windows上运行项目会出现问题,
#如果出现类似于WinError这样的的问题,请安装下面的模块
# 安装pypiwin32模块,用于scrapy模块可能调用win底层C库进行函数操作
pip install pypiwin32
3.创建项目
scrapy startproject <spider_name>
创建好的项目文件结构如下:
|-- myspider/ 项目根目录
|-- scrapy.cfg 项目配置文件 [cfg: config]
|-- myspider/ 爬虫模块->爬虫程序开发都在这个模块中
|-- spiders/ 爬虫程序所在的目录
|-- items.py 采集的数据->定义封装模型类的模块
|-- pipelines.py 采集的数据->采集完成之后进行数据验证、存储的模块
|-- middlewares.py 中间件定义的模块
|-- settings.py 项目设置模块
4.爬虫开发
-
- 明确自己爬取网页获取的信息定义item类型,封装字段。
items.py文件
import scrapy class ZhilianItem(scrapy.Item): # 定义属性字段 job = scrapy.Field() company = scrapy.Field() salary = scrapy.Field()
- 明确自己爬取网页获取的信息定义item类型,封装字段。
-
- 开发具体爬虫代码
执行命令自动创建爬虫文件
scrapy genspider zhilain "zhilian.cn"
将创建一个名为zhilian的爬虫,并指定爬取域的范围:"zhilian.cn"在spiders文件夹里手动新建爬虫文件 zhilain.py
代码:
import scrapy class ZhilianSpider(scrapy.Spider): #修改设置,设置符合自己需求 name = "zhilain" allowed_domains = ["zhilian.cn"] start_urls = ( 'http://www.itcast.cn/', ) def parse(self, response): pass
在spiders/zhilianspider.py模块中定义ZhilianSpider类型
继承自scrapy.Spider
类型中的属性:name属性~爬虫名称,用于在命令行启动爬虫时调用
类型中的属性:start_urls属性~采集数据的初始url地址[列表、元组]
类型中的属性:allowed_domains属性~采集数据的网站域名限制
类型中的方法:parse(self, response)采集完数据之后自动执行的函数 -
- 数据处理
parse(self, response)函数自动获取爬取的数据,通过自己编写筛选获取具体需要的数据部分。
代码:
#先引入之前写好的item模块的封装类型函数 from .. import items #在parse(self, response)函数里处理得到response, #通过xpath、css等技术筛选得到具体数据 job_items = [] # 将得到的数据封装成item对象 item = items.ZhilianItem() item['job'] = job item['company'] = company item['salary'] = salary #将数据添加保存在列表里 job_items.append(item) #这样直接保存在列表,不经过pipeline return job_items #不推荐这样,一般用管道存储在数据库里
- 数据处理
用命令直接将数据保存成文件
- json格式,默认为Unicode编码
scrapy crawl zhilian -o zhilian.json- json lines格式,默认为Unicode编码
scrapy crawl zhilian -o zhilian.jsonl- csv 逗号表达式,可用Excel打开
scrapy crawl zhilian -o zhilian.csv- xml格式
scrapy crawl zhilian -o zhilian.xml
注意:
Python2.x默认编码环境是ASCII,当和取回的数据编码格式不一致时,可能会造成乱码;
# 可以指定保存内容的编码格式,一般情况下,添加:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
# 这三行代码是Python2.x里解决中文编码的万能钥匙,
# Python3学乖了,默认编码是Unicode了...
- 数据库存储
不在使用 job_items = [] 存储数据
直接将获取封装的数据item交给pipelines#将原来的添加到列表替换 job_items.append(item) #删除这个换为yield yield item
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。
pipelines.py文件
# 导入数据库引擎对象
from sqlalchemy import create_engine
# 导入会话构建对象
from sqlalchemy.orm import sessionmaker
# 替换mysqldb模块
import pymysql
pymysql.install_as_MySQLdb()
class MyspiderPipeline(object):
def process_item(self, item, spider):
return item
#自定义的Pipeline处理模块
class ZhilianPipeline(object):
'''
处理智联招聘数据的pipeline,负责最终的数据验证和数据存储
'''
def __init__(self):
#初始化对象数据:可以用于初始化资源
#如:打开文件、打开数据库连接等等操作
self.engine = create_engine("mysql://数据库连接?charset=utf8")
Session = sessionmaker(bind=self.engine)
self.session = Session()
def open_spider(self, spider):
#爬虫开启时需要调用的函数,经常用于数据初始化
pass
def close_spider(self, spider):
'''
爬虫程序关闭时自动调用的函数
经常用于做一些资源回收的工作,如:关闭和数据库的会话连接
'''
# 提交数据,断开连接
self.session.commit()
self.session.close()
def process_item(self, item, spider):
'''
该函数会在爬虫采集并封装好Item对象时自动调用
函数中针对item数据进行验证和存储
'''
print ">>>>>>>>>zhilian pipelines invoking......."
# 定义sql语句
sql = "insert into job(job, company, salary) values('%s', '%s', '%s')"\
% (item['job'], item['company'], item['salary'])
# 执行sql语句
self.session.execute(sql)
settings.py文件
#更改初始设置,将我们自己定义的添加到设置里
ITEM_PIPELINES = {
#'mySpider.pipelines.SomePipeline': 300,
"mySpider.pipelines.ZhilianPipeline":300,
}
只需启动爬虫 scrapy crawl zhilain 即可在数据库查看获取数据。