谈到爬虫,必出利器Scrapy。如果说之前的爬虫借助于个人知识的野蛮生长,那么Scrapy的诞生无疑降低了万众爬虫的门槛。
什么是Scrapy?一言以蔽之:它是一个基于Python语言开发的网络数据抓取的框架,任何人都可以根据需求方便的修改。Scrapy由下面几个部分组成
(上图来源于网络,侵删)
spiders:爬虫的主模块,主要内容包括网页的解析和内容的结构化
items:定义我们需要的结构化数据,使用方法类似于字典dict
pipelines:管道模块,处理spider模块分析好的结构化数据,如存入数据库或者jason文件
setting:设置,对整个爬虫过程中的相关参数进行设置,如头文件head,cookie等。
middlewares:中间件(暂时不用修改)
下面,以网上比较常见的58同城网上的租房信息为例,介绍Scrapy爬取数据的基本过程。
1、新建Scrapy项目
Windows系统下,先利用Win+R进入cmd界面,而后进入想要创建项目的目录。而后输入下面的命令:
scrapy startproject zufang58
2、Scrapy项目文件
生成的项目结构如图所示:Scrapy项目文件
(1)spiders:爬虫的主模块
(2)items:需要的结构化数据
import scrapy
class Zufang58Item(scrapy.Item):
# 标题
title = scrapy.Field()
# 房间
room = scrapy.Field()
# 区域
zone = scrapy.Field()
# 地址
address = scrapy.Field()
# 价格
money = scrapy.Field()
#类型(几室几厅)
type = scrapy.Field()
(3)pipelines:管道模块(暂时不需要修改)
class Zufang58Pipeline(object):
def process_item(self, item, spider):
return item
(4)setting:设置(主要设置ROBOTSTXT_OBEY = False)
#在某些情况下我们想要获取的内容恰恰是被robots.txt所禁止访问的。所以,我们就将此配置项设置为False,拒绝遵守Robot协议!
ROBOTSTXT_OBEY = False #不遵守开始运行
3、开始运行
运行方式有两种:
(1)在cmd窗口下输入
scrapy crawl zufang58
(2)在scrapy.cfg建立一个主文件main.py
from scrapy.cmdline import execute
if __name__ == "__main__":
execute("scrapy crawl zufang58".split())
4、修改piplines存储到json文件
历经千辛万苦,把数据爬下来了,总感觉只通过Console窗口看看不过瘾,为此,我们决定将其存入json文件。
那问题来了,什么是json文件呢?
json文件格式实质是一种dict字典类型,存储的数据描述了一个实物的相关信息。例如可以存入一个人的年龄,职务,身高,体重等等,同时可以很方便地通过文本文件查看。
为此需要修改piplines文件,将结构化的items传出到json文件中。
import json
import logging
class Zufang58Pipeline(object):
def __init__(self):
self.file = open('zufang58.json', mode='w', encoding='utf-8')
def process_item(self, item, spider):
jsondata = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(jsondata)
except Exception as error:
# 出现错误时打印错误日志
logging.error(error)
return item
def close_spider(self, spider):
self.file.close()小结
5、小结
最终生成的json文件如图所示:
总的来说,借助Scrapy框架,大大提高了爬虫的效率,激发了看见什么爬什么的决心。
国庆感言:
闲着就是无聊,动起来就有活力!
——后记