前言

Python提供了一个比较实用的爬虫框架 - Scrapy。在这个框架下只要定制好指定的几个模块,就能实现一个爬虫。

本文将讲解Scrapy框架的基本体系结构,以及使用这个框架定制爬虫的具体步骤。

Scrapy体系结构

其具体执行流程如下:

1. 任务管理器Scheduler将初始下载任务递交给下载器Downloader;
       2. 下载器Downloader将下载好了的页面传递给爬取分析器Spiders进行分析。

爬取分析器分析的结果分为两种:

a) 本次爬取所得数据 -> 它将传递给任务管理器Scheduler;
       b) 需要进行下一级爬取的URL地址 -> 它将传递给数据管道进行相关的保存工作。

基于Scrapy框架的豆瓣网电影信息爬取器

1. 执行以下命令创建一个新的工程:

 scrapy startproject doubanMovieSpider

doubanMovieSpider是工程名,工程包里将会有如下这些文件:

1) scrapy.cfg: 项目配置文件
2) items.py: 需要提取的数据结构定义文件
3) pipelines.py:管道定义,用来对items里面提取的数据做进一步处理,如保存等
4) settings.py: 爬虫配置文件
5) spiders: 放置spider的目录

该工程用于从豆瓣网爬取电影信息(如电影名,评分等等)。

2. 定义爬取结果数据结构Item --- 在items.py中编写如下代码:

 # -*- coding: utf-8 -*-
# ================================================
# 作者: 方萌
# 创建时间: 20**/**/**
# 版本号: 1.0
# 联系方式: 1505033833@qq.com
# ================================================
# scrapy框架模块
import scrapy
class DoubanmoviespiderItem(scrapy.Item):
# 主题
title = scrapy.Field()
# 评分
rate = scrapy.Field()
# ID
id = scrapy.Field()

Item其实从本质来说,就是Scrapy框架自己实现的字典,需要继承scrapy.Item类。上述代码定义的字典表示要爬取的电影信息有:电影主题,电影评分,以及电影ID。

3. 实现爬取分析器Spider --- 在spiders目录下增加一个python文件MovieSpider.py:

在这个文件中自定义一个爬取分析器,该分析器为一个继承自scrapy.spider.BaseSpider(或者Scrapy框架下其他抽象爬取器)的类,它起码要实现以下几个字段:

1) name:spider的标识
2) start_urls:起始爬取URL
3) parse():爬取对象解析函数

实现代码如下:

 # -*- coding: utf-8 -*-
# ================================================
# 作者: 方萌
# 创建时间: 20**/**/**
# 版本号: 1.0
# 联系方式: 1505033833@qq.com
# ================================================
# scrapy框架模块
import scrapy
# json解析模块
import json
# 系统模块
import sys
# items模块
import doubanMovieSpider.items
# 爬虫类
class MovieSpider(scrapy.spider.BaseSpider):
# 爬虫名
name = "douban"
# 域名限定
allowed_domains = ["www.douban.com"]
# 爬取URL队列
start_urls = [
"http://movie.douban.com/j/serch_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=200&page_start=0"
]
def parse(self, response):
"""
函数功能:
解析爬取到的数据
输入:
response -> 爬取返回数据对象
输出:

"""
# 将爬取到的电影信息存入json容器
json_container = json.loads(response.body)
# 构建items。该模块具体含义请查询相关文档。
items = []
for movie_elem in json_container['subjects']:
item = doubanMovieSpider.items.DoubanmoviespiderItem()
for key in movie_elem:
if key == 'title':
item['title'] = movie_elem[key]
print movie_elem[key]
if key == 'rate':
item['rate'] = movie_elem[key]
if key == 'id':
item['id'] = movie_elem[key]
items.append(item)
# 返回items
return items

4. 实现PipeLine --- 修改items.py文件:

 # -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
class DoubanmoviespiderPipeline(object):
def __init__(self):
pass
def process_item(self, item, spider):
pass

PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。

我们可以在其中的__init__方法内编写打开文件部分代码,在process_item方法内编写具体的写入函数(可直接将数据写入进远程数据库);也可以不实现这个模块,scrapy会有其默认的写入机制(本系统采用默认写入机制)

5. 在项目当前目录下执行如下命令即可启动此爬虫系统:

 scrapy crawl douban -o items.json -t json

该命令表示启动爬取分析器“douban”,并将爬取到的items以json格式保存到items.json文件中。“douban” 即是在爬取分析器中由name域指定的。

下图为爬取到的结果:

小结

本文仅仅给出Scrapy框架的基本使用。如果要实现生产级别的项目,还需对该框架内的一些具体设置,各种抽象爬取分析器进行深入研究。

最新文章

  1. lnmp搭建
  2. 用Qt开发第一个Hello World程序
  3. how to learn algorithms(ZAC)
  4. Linux下生产者与消费者的线程实现
  5. SignalR with ASP.NET MVC5 可用于倒计时同步
  6. Javascript J更深层次的理解avascript 基础知识
  7. Java数据结构和算法 - 堆
  8. mybatis进行一对多时发现的问题总结
  9. 第五节,TensorFlow编程基础案例-session使用(上)
  10. java实现数据缓存
  11. 第一份offer
  12. 【Devops】【docker】【CI/CD】docker启动的Jenkins容器 - 系统管理 - 全局工具配置 - 自动安装JDK、Maven、Git、Docker
  13. JavaScript 表单验证 案例
  14. spring获取webapplicationcontext,applicationcontext几种方法详解(转)
  15. vue 表单 验证 async-validator
  16. linux下c语言源码编译
  17. POJ 1222 EXTENDED LIGHTS OUT(反转)
  18. 微信公共平台注册 bug: 验证码不应该输入后,就立即检查其有效性
  19. 静态代码块,构造代码块,main()
  20. PHP------关于字符串的处理

热门文章

  1. qt中的事件机制
  2. mysql 军规 (转载)
  3. gitlab手动安装
  4. 02-Nginx+MySQL+PHP7
  5. ansible安装
  6. 前端开发利器webStorm
  7. asp.net core 使用 swagger 生成接口文档
  8. 自定义JpaUtil,快速完成Hql执行逻辑(一)
  9. 项目中常用的19条MySQL优化
  10. IS-IS 路由协议 总结