一:前言
经过前面的scrapy入门基础后现在我们需要更进一步,怎么样把我们采集到的数据进行处理然后存储到数据库里呢?带着这个问题,Let`s Go
- 首先我们需要确定我们要实现的目标任务:
1.采集数据
2.分析筛选数据
3.存储到数据库
.二:开发项目
1.创建项目
scrapy startproject myspider
创建完成后得到项目目录结构如下:
image.png
2.开始爬虫程序的开发
1.分析要爬取的url地址
'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&p=1'
2.分析当前页面自己想要采集的数据,并自定义字段名称,将自定义的字段封装在items.py模块中,创建item类
职位:job
公司:company
薪水:salary
import scrapy
#定义一个类
class ZhaopinItem(scrapy.Item)
#定义属性字段
job = scrapy.Field()
company = scrapy.Field()
salary = scrapy.Field()
3.在spiders文件下创建爬虫程序
import scrapy
from .. import items
class ZhiLian(scrapy.Spider):
#定义爬虫的名称,用于在命令中调用
name = 'zl'
#定义域名限制,只能爬取xxx域名下的数据
allowed_domains = ['zhaopin.com']
#定义起始url地址
start_urls =[
'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%88%AC%E8%99%AB&sm=0&p=1',
]
def parse(self, response):
'''
采集到数据后,自动执行的函数,主要进行如下功能
数据筛选——》封装Item对象——》传递数据给Pipelines
采集到的数据封装在response
数据的采集,之前我们都是根据起始的url地址来采集当前页面的数据,那么怎么样进行深度爬取,在当前页面中筛选出下一页面的链接url地址呢
'''
#提取所有的数据
job_list = response.xpath("//div[@id='newlist_list_content_table']/table[position()>1]/tr[1]")
for jobs in job_list:
job = select.xpath("td[@class='zwmc']/div/a").xpath('string(.)').extract()[0]
company = select.xpath("td[@class='gsmc']/a/text()").extract()[0]
salary = select.xpath("td[@class='zwyx']/text()").extract()[0]
#封装成item对象
item = items.ZhilianItem()
item['job'] = job
item['company'] = company
item['salary'] = salary
#将本次生成的item对象交给pipeline进行处理
yield item
#这里已经完成爬取当前起始URL地址所在页面数据了,下面就是根据这个地址进行链接跟踪,循环爬取
#获取当前页面里其他页面url地址链接
page_list = response.xpath('//div[@class="pagesDown"]/ul/li/a/@href').extract()
for next_page in page_list:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)#调用scrapy的底层操作,就是这么easy的进行了多个页面爬取
4.数据处理:开发管道模块
在pipelines.py模块中定义处理Item数据的pipelines,将数据存储到数据库中
#导入数据库引擎对象
from sqlalchemy import create_engine
#导入会话构建对象
from sqlalchemy.orm import sessionmaker
#替换MySQldb模块
import pymysql
pymysql.install_as_MySQLdb()
class ZhilianPipeline(object):
#处理智联招聘数据的pipeline,负责最终的数据验证和数据存储
def __init__(self):
'''
初始化对象数据:可以用于初始化资源
如:打开文件,打开数据库连接等操作
'''
#创建连接数据库引擎
self.engine = create_engine('mysql://root:123456@localhost/spider_zhilian?charset=utf8')
Session = sessionmaker(bind=self.engine)
self.session = Session()
def open_spider(self, spider):
'''
爬虫开启时需要调用函数,经常用于数据的初始化
:param spider:
:return:
'''
pass
def close_spider(self,spider):
'''
爬虫程序自动关闭时调用函数
经常用于做一些资源回收工作,如关闭和数据库的连接
:return:
'''
self.session.close()
def process_item(self, item, spider):
'''
该函数会在爬虫采集并封装好的Item对象时自动调用
函数针对item数据进行验证和存储
:param item:
:param spider:
:return:
'''
#定义sql语句
sql = 'insert into job(job, company, salary) values( "%s", "%s", "%s")'\
% (item['job'], item['company'], item['salary'])
#执行sql语句
self.session.execute(sql)
#提交数据
self.session.commit()
5.在setting.py设置模块中注册pipeline
ITEM_PIPELINES = {
# 'myspider.pipelines.MyspiderPipeline': 300,
'myspider.pipelines.ZhilianPipeline': 300,
}
3.运行项目程序
在命令行里切换到项目根目录文件路径下,然后在命令行里运行:
scrapy crawl + name 定义爬虫的名称
如:scrapy crawl zl 这样项目就启动了
三:小结
- 实现完整的爬虫项目需要以下步骤:
1.创建项目
scrapy startproject +项目名称
2.开发爬虫程序
a.字段封装在items.py模块中,创建item类
b.在spiders文件下创建爬虫程序
#在项目根目录下,命令行里运行以下命令可以快速创建爬虫程序
scrapy genspider +爬虫名称(name) + 域名限制(allowed_domains)
c.数据处理:开发管道模块pipelines.py
d.在setting.py设置模块中注册pipeline
3.运行项目
scrapy crawl + 爬虫名称(name)
看到这里说明你已经进阶了,下面就可以进行scrapy的深度操作了
网友评论