Scrapy定向爬虫教程(一)——创建运行项目和基本介绍

由于阿里云腾讯云加强域名及服务器的备案监管,同时由于相关法规规定个人不可运营论坛类网站。本系列博客中所使用的本人搭建的论坛已无法继续运营,但本博客中提供的代码仍适用于其它基于Discuz框架的论坛,小伙伴们可以边修改代码边学习。

前言

目前网上的Scrapy中文教程比较少,而且大多教程使用的Scrapy版本较老,比如说这个Scrapy 0.25 文档,如其名,上古时期的翻译文档;再比如极客学院的视频教程使用的是1.0.x版本,跟新版相比还是有出入。这种情况使得新手入门Scrapy较为困难,而且各种掉坑。本人也是只刚入门的菜鸟,我希望能用菜鸟的语言给其他想要踏进Scrapy大门的小菜鸟指引一条道路。至少比我踩得坑少点吧^-^。

开发环境

  • Ubuntu 16.04
  • Python 2.7.12
  • Scrapy 1.1.2
  • PyCharm 2016.1.4

介绍

本教程将带领大家写一个爬取Discuz模板论坛网站的定向爬虫,网上的Discuz论坛数不胜数,当然我也不敢公开在这教唆大家去侵犯某一个,只好祭出自己搭的论坛来供大家练习——心韵论坛。当然,既然是Discuz模板,用哪个网站做教程都是大同小异的。有了思路后,其他网站也会触类旁通。本教程分为以下八个部分,将分为八篇博文向大家介绍:

  • Scrapy安装与项目创建
  • 通过Selector选择器解析页面获取内容
  • 爬取多个页面
  • 数据存入MongoDB
  • 保持登陆状态
  • 分析表单并回帖
  • 使用代理(参考http://www.kohn.com.cn/wordpress/?p=208)

好,废话不多说,我们进入第一部分。

Scrapy安装

既然选择了Scrapy,那么使用Linux对你来说也是家常便饭了吧,安装教程请戳链接Ubuntu16.04安装Scrapy命令

新建项目

首先进入你想创建项目的目录,我为了方便,就直接在home目录下建项目了,因为我们要爬取的网站域名是heartsong.top,为了方便识别,我们把项目的名字起做heartsong,在命令行中输入以下命令:

scrapy startproject heartsong 

输出信息如图,表示项目创建成功
Scrapy定向爬虫教程(一)——创建运行项目和基本介绍_第1张图片

项目结构

我们通过PyCharm打开项目
Scrapy定向爬虫教程(一)——创建运行项目和基本介绍_第2张图片
发现默认生成的项目有如下结构
Scrapy定向爬虫教程(一)——创建运行项目和基本介绍_第3张图片
我们发现,默认生成的项目有下列几个文件
* __init__.py × 2
* items.py
* pipelines.py
* settings.py
* scrapy.cfg

在这几个文件中,两个__init__.pyscrapy.cfg是用不到的,不多说。下面,我们来介绍一下我们在今后用的到的文件的基本用途

items.py

双击打开这个文件,看一下都初始化了什么东西

# -*- coding: urf-8 -*-
# Define here the models for your scrapyed items
#
# See documentation in
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class HeartsongItem(scrapy.Item):
    # define the fields for your item here like:
    # 
    # name = scrapy.Filed()
    pass

通过里面的注释可见,这个文件的作用是定义我们要爬取信息的标准格式,打个比方说,如果我们要爬取一批人的个人信息,包括姓名,性别,生日,那么我们可以这样来书写这个文件

import scrapy

class HeartsongItem(scrapy.Item):
   name = scrapy.Filed()
   sex = scrapy.Filed()
   birthday = scrapy.Filed()

易见本文件只是定义了一个类,至于什么时候实例化它,怎么保存它,请继续了解下面的内容。

settings.py

如其名,这是本项目的配置文件,里面注释着很多常用的配置项,我们通过在其他文件中引入本文件的方式来使用这些配置项。
当然,我们可以把这些注释都删掉,等需要开启哪个功能的时候再另行编辑。
我们此处先看看默认打开的配置项吧

BOT_NAME = 'heartsong'
SPIDER_MODULES = ['heartsong.spiders']
NEWSPIDER_MODULE = 'heartsong.spider'
# Obey robots.txt rules
ROBORSTXT_OBEY = True

因为我们写的是定向爬虫,前面三个按默认即可,我们不去管他。看第四项,注释里说这个配置项的意思是是否遵守robots.txt,那么robots.txt是个什么东西呢?
通俗来说,robots.txt是遵循Robot协议的一个文件,它保存在网站的服务器中,它的作用是,告诉搜索引擎爬虫,本网站哪些目录下的网页不希望你进行爬取收录。在Scrapy启动后,会在第一时间访问网站的robots.txt文件,然后决定该网站的爬取范围。
当然,我们并不是在做搜索引擎,而且在某些情况下我们想要获取的内容恰恰是被robots.txt所禁止访问的。所以,我们就将此配置项设置为False,拒绝遵守Robot协议!

pipelines.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 HeartsongPipeline(object):
    def process_item(self, item, spider):
        return item

从注释中所能得到的信息微乎其微,只告诉我们要启用此文件的话必须要在settings.py里配置一下ITEM_PIPELINES,好,那我们就老老实实的去settings.py里配置一下吧,不过注意,此处有坑,在1.0.x版本(极客学院教程中使用),配置项用list格式来书写,而在最新的1.1.2版本中,需要用dict格式,否则会报错,无法爬取,配置好后,我们的setting.py如下:

# -*- coding: utf-8 -*-

BOT_NAME = 'heartsong'
SPIDER_MODULES = ['heartsong.spiders']
NEWSPIDER_MODULE = 'heartsong.spider'

ROBORSTXT_OBEY = True

ITEM_PIPELINES = {
    'heartsong.pipelines.HeartsongPipeline': 300,
}

此处的300表示优先级,因为本项目只用到这一个pipeline,所以随意取0-1000中的一个数值即可。
好,镜头切回pipelines.py,这个文件到底有什么用呢?当然用处很多啦,本教程中介绍的作用只有两个:
* 对爬取到的数据(Item)进行处理,比如存入数据库
* 爬虫结束时产生事件,比如发送一封邮件

此处只是介绍一下,具体的操作要看后续教程。

爬虫呢?

默认生成的项目结构至此我们已经介绍完了,可是我们是来做爬虫的吧,爬虫呢?莫急莫急,互联网上的网站数不胜数,变化多端,我们的爬虫当然不可能一成不变,所以爬虫文件我们需要自己定义。

爬虫

在默认生成的spiders目录下新建heartsong_spider.py,我们的爬虫就写在这里面,因为是介绍,那么此处就写个简单的下载网站的主页,让大家能运行一下,感受一下scrapy。

import scrapy

class HeartsongSpider(scrapy.spiders.Spider):
    name = "heartsong"  # 爬虫的名字,执行时使用
    allowed_domains = ["heartsong.top"]  # 允许爬取的域名,非此域名的网页不会爬取
    start_urls = [
        "http://www.heartsong.top"  # 起始url,此例只爬这一个页面   
    ]

    def parse(self, response):  # 真正的爬虫方法
        html = response.body  # response是获取到的来自网站的返回
        # 以下四行将html存入文件
        filename = "index.html"
        file = open(filename, "w")
        file.write(html)
        file.close()

要说明的是,这个类不是随心所欲来写的,name,allowed_domains,start_urls,都是类似于”重载”的值。也就是说,scrapy内部会检测这些变量的值,变量名不可以起成其它的名字,类似的变量之后还会有介绍。至于parse方法,就是重载的父类的方法,我们爬虫的主体一般就写在这里面。
好,现在让我们来运行它
在命令行中进入heartsong目录下,执行命令

scrapy crawl heartsong

此处的名字heartsong是与爬虫类中的name保持一致。
Scrapy定向爬虫教程(一)——创建运行项目和基本介绍_第4张图片
输出的信息还是比较多的,我就不截完了。
来到heartsong目录下看看有没有下载成功
Scrapy定向爬虫教程(一)——创建运行项目和基本介绍_第5张图片
双击点开看看
Scrapy定向爬虫教程(一)——创建运行项目和基本介绍_第6张图片
发现很OK。

小结

本部分介绍了Scrapy的下载,创建项目,基本文件,运行程序这一部分入门知识,在下一个部分中,我们将学习如何使用Selector选择器在网页中提取我们想要的内容。

你可能感兴趣的:(Python,Scrapy)