【爬虫】-010-Scrapy-简单上手
2019-02-18 本文已影响0人
9756a8680596
说到爬虫尤其是python
爬虫,不得不说到Scrapy
这个开源框架,关于它的介绍可查看这里。今天先来一个简单的示例,来建立一个初步的印象。
首先,你需要在系统中安装Scrapy
库,然后才可以使用它。
1.交互式命令行上手Scrapy
scarpy shell URL
view(response)
response.xpath().extract()
2.用Scrapy
爬虫进行数据抓取
- 首先,通过命令行创建
Scrapy
项目:scrapy startproject ganjizufang
- 然后,使用
Pycharm
导入项目目录 - 接着,在开始用
Scrapy
写代码前,先来熟悉下项目中文件
Scrapy项目目录结构
init.py
--> 保持默认不需要修改
items.py
--> 项目类文件,即爬虫获取数据后传入管道文件(pipelines.py
)的载体
pipelines.py
--> 项目管道文件,对传入项目类文件中的数据进行清理,并进行数据库操作
settings.py
--> 项目配置文件,例如下载延迟\项目管道文件中类对启用和自定义中间件对启用和顺序等
spiders目录
--> 刚开始里面只有一个init.py
文件,在该目录下定义爬虫类,并继承scapy.Spider
middlewares.py
--> 配置项目中间件文件
- 接下来,在
spiders目录
中创建爬虫文件ganji.py
,一般来说,爬虫文件需要继承scrapy.Spider
类,然后进行创建爬虫名称、开始爬取的链接以及页面解析函数等工作,具体代码如下:
import scrapy
class GanjiSpider(scrapy.Spider):
# 创建爬虫名称,爬虫名不是项目名
name = 'ganjizufang'
# 爬虫启动后自动爬取的URL,列表内可放多个链接
start_urls = ['http://hz.ganji.com/zufang/pn1/', 'http://hz.ganji.com/zufang/pn2/']
# 爬虫启动后,爬取链接成功后自动回调的函数
# 默认参数:self 和 response必传
def parse(self, response):
# 查看response内容
print(response)
# 获取页面数据元素
titles = response.xpath('//dl[@class="f-list-item-wrap min-line-height f-clear"]/dd[@class="dd-item title"]/a/@title').extract()
prices = response.xpath('//div[@class="price"]/span[1]/text()').extract()
# # 格式化输出元素
# for title, price in zip(titles, prices):
# print(title, ': ', price)
- 爬虫文件编写完成后,通过
Pycharm
命令行终端查看爬虫列表:scrapy list
- 执行爬虫程序:
scrapy crawl ganjizufang
,这里是爬虫的名称而不是项目名称
3.将Scrapy爬取的数据入库
获取数据后,需要考虑如何将数据入库,接下来需要用到Scrapy
项目中items.py
和pipelines.py
文件。
在开始之前,先来熟悉下sqlite
相关操作,Pycharm终端中使用
sqlite库`。
3-1在Pycharm
命令终端中输入ipython
命令然后进入python
命令行界面
import sqlite3
# 使用sqlite链接数据库名称,如果不存在则新建数据库
# 这个操作会在项目文件中同步创建数据库文件
gjzf = sqlite3.connect('gjzf.sqlite')
# 继续在pycharm中的terminal使用sql语言创建数据表结构
# 定义变量存储sql语句字符串
create_table = 'create table gjzf (title varchar(512), money varchar(128))'
# 执行sql语句
ganjizufang.execute(create_table)
- 此时,数据库文件以及数据表字段已经创建完成,需要获取并填充数据。
3-2爬虫文件获取数据,清理数据和导入数据由pipelines.py
文件来操作
- 首先,进入
settings.py
文件,配置pipelines
参数:ITEM_PIPELINES
- 然后,进入
items.py
文件,配置容器参数
import scrapy
class GanjizufangItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
price = scrapy.Field()
pass
3-3修改Scrapy
爬虫文件,将获取的数据变量放到items.py
定义的容器中
import scrapy
from ..items import GanjizufangItem
class GanjiSpider(scrapy.Spider):
# 创建爬虫名称不等于项目名称
name = 'ganjizufang'
# 爬虫启动后自动爬取的URL,列表内可放多个链接
start_urls = ['http://hz.ganji.com/zufang/pn1/', 'http://hz.ganji.com/zufang/pn2/']
# 爬虫启动后,爬取链接成功后自动回调的函数
# 默认参数:self 和 response必传
def parse(self, response):
# 查看response内容
print(response)
# 获取页面数据元素
titles = response.xpath('//dl[@class="f-list-item-wrap min-line-height f-clear"]/dd[@class="dd-item title"]/a/@title').extract()
prices = response.xpath('//div[@class="price"]/span[1]/text()').extract()
# # 格式化输出元素
# for title, price in zip(titles, prices):
# print(title, ': ', price)
# 将租房数据赋值给item示例
gjzf = GanjizufangItem()
for title, price in zip(titles, prices):
gjzf['title'] = title
gjzf['price'] = price
yield gjzf
3-4接下来通过pipelines.py
管道文件,定义函数来完成数据清理和入库操作:
- 首先,定义爬虫启动时,链接数据库的函数,主要用途是引入sqlite3库,创建数据库链接并设置游标初始位置
- 然后,定义爬虫运行时,将数据写入数据库的函数,主要用途是将插入数据的SQL代码赋值给变量,然后执行SQL语句
- 最后,定义爬虫结束时,关闭数据库函数,创建的链接关闭数据库
- 补充,数据库的操作如果是更新数据需要提交,否则直接执行sql代码即可
import sqlite3
class GanjizufangPipeline(object):
def open_spider(self, spider):
# 定义变量,链接数据库
self.con = sqlite3.connect('gjzf.sqlite')
# 定义变量,设置数据库游标
self.cu = self.con.cursor()
def process_item(self, item, spider):
# print(spider)
insert_sql = 'insert into gjzf (title, money) VALUES ( "{}", "{}")'.format(item['title'], item['price'])
# 游标执行sql语句
self.cu.execute(insert_sql)
# con需要执行提交(插入/更新/删除)操作
self.con.commit()
return item
def spider_close(self, spider):
self.con.close()