Python爬虫框架Scrapy的入门和实践

Github项目地址:https://github.com/xylon666/Scrapy

Scrapy框架,简单来说就是把爬虫各功能模块分割开来,分别负责相应的功能,让我们通过简单的学习和实践来使用他

框架示意图:

                   Scrapy架构图.png

架构分析

  • Scrapy Engine:Scrapy引擎。负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。
  • Scheduler:调度器。从Scrapy Engine接受请求(requests)并排序列入队列,并在引擎再次请求时返回。用它来决定下一个抓取的网址是什么,同时去除重复的网址。
  • Downloader:下载器。抓取网页并将网页内容返还给Spiders。建立在twisted异步模型。
  • Spiders:爬虫。用户自定义的类,主要用来解析网页,提取Items,发送url跟进等新请求等。
  • Item Pipelines:管道。主要用来处理Spider解析出来的Items,进行按规则过滤,验证,持久化存储(如数据库存储)等
  • Downloader Middlewares:下载中间件。位于Scrapy Engine和Downloader之间,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • Spider Middlewares:爬虫中间件。位于Scrapy Engine和Spiders之间,主要工作是处理Spiders的响应输入和请求输出。
  • Scheduler Middlewares:调度中间件。位于Scrapy Engine和Scheduler之间。主要工作是处理从Scrapy Engine发送到Scheduler的请求和响应。

所需环境:

编译器:Pycharm

第三方库:scrapy

Scrapy相关依赖库:

lxml
parsel
w3lib
twisted
cryptography
pyOpenSSL

均可通过pip install 安装

 

实践目标:

使用Scrapy框架爬取豆瓣电影排行版Top250

 

创建项目:

选择创建项目的文件路径,如在D盘创建一个文件夹"Douban_Scrapy"

然后运行cmd,cd到该目录

d:
cd D:\Douban_Scrapy

创建项目:

scrpay startproject douban

运行后我们会发现在该目录下多了几个文件,在Pycharm中打开:

对比文章开头的框架示意图,简单介绍下他们的功能

spiders目录:编写爬虫代码的主体

items:存放获取数据的相关元素

middlewares:定义爬虫过程中的操作

pipelines:定义存储信息时的操作,例如将数据传入ManggoDB或MySQL

setting:顾名思义,用来定义我们的各种配置,比如请求头信息等


初始化爬虫:

运行cmd,cd到爬虫project的spiders目录,执行:

scrapy genspider douban_spider movie.douban.com

这样一个爬虫模板就自动建好了

由于需要多次运行cmd来执行scrapy命令,我们可以通过Pycharm直接在编译器内来实现这一过程

在spiders目录新建main.py:

from scrapy import cmdline
cmdline.execute('scrapy genspider douban_spider movie.douban.com'.split())

运行后无需通过cmd就能执行命令了 

再修改一下setting配置:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
#伪装头
ROBOTSTXT_OBEY = False
#忽略网页的爬虫规则
DOWNLOAD_DELAY = 0.5
#下载延时

再来看一下要爬的内容:

我们通过该页面可以获取到的信息有:排名,电影名,星级,评价人数,描述

 根据爬取对象编辑items.py文件

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

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 排名
    movie_num = scrapy.Field()
    # 电影名称
    movie_name = scrapy.Field()
    # 星级
    star = scrapy.Field()
    # 评价人数
    value = scrapy.Field()
    # 描述
    describle = scrapy.Field()

 编辑爬虫代码douban_spider.py:

# -*- coding: utf-8 -*-
import scrapy


class DoubanSpiderSpider(scrapy.Spider):
    #爬虫名称
    name = 'douban_spider'
    #爬虫允许抓取的域名
    allowed_domains = ['movie.douban.com']
    #获取数据传给调度器的地址
    start_urls = ['http://movie.douban.com/top250']

    def parse(self, response):
        print(response.text)

执行命令:

在cmd中对应目录下

scrapy crawl douban_spider

 或在Pycharm中spiders目录下新建main.py

from scrapy import cmdline
cmdline.execute('scrapy crawl douban_spider'.split())

 执行结果,可以发现成功获取到了豆瓣网页源代码

 

分析页面:

网页源代码已获取,再来看要爬取的内容:

电影信息都在div class='"article"//ol class="grid_view"下的<li>标签内,通过xpath对其解析获取:

# -*- coding: utf-8 -*-
import scrapy


class DoubanSpiderSpider(scrapy.Spider):
    name = 'douban_spider'
    allowed_domains = ['movie.douban.com']
    start_urls = ['http://movie.douban.com/top250']

    def parse(self, response):
        movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
        for item in movie_list:
            print(item)

如果你不知道xpath,推荐阅读:xpath语法

获取该页面所有电影信息后,从中提取出我们需要的部分

导入模型文件:

from ..items import DoubanItem

 从我们刚刚获得的电影信息中,根据节点信息获取电影排名:

        for item in movie_list:
            douban_item = DoubanItem()    
            #模型初始化
            douban_item['movie_num'] = item.xpath(".//div[@class='item']//em/text()").get()
            #从当前标签起始,访问目标标签获取文本信息,将其写入movie_num

以此类推,获取后面的内容

        for item in movie_list:
            douban_item = DoubanItem()
            douban_item['movie_num'] = item.xpath(".//div[@class='item']//em/text()").get()
            douban_item['movie_name'] = item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").get()
            douban_item['star'] = item.xpath(".//div[@class='bd']/div[@class='star']/span[2]/text()").get()
            douban_item['value'] = item.xpath(".//div[@class='bd']/div[@class='star']/span[4]/text()").get()
            douban_item['describle'] = item.xpath(".//div[@class='bd']/p[@class='quote']/span/text()").get()
            print(douban_item)
            yield douban_item
            #将返回结果压入item Pipline进行处理

运行结果(红色信息是正常情况):

循环获取当前页面所有电影信息后,我们需要访问下一页继续获取数据,右键检查“后页”

根据标签信息,拼接前缀获取完整链接并访问下一页

next_link = response.xpath("//span[@class='next']/link/@href").get()
if next_link:
    yield scrapy.Request('http://movie.douban.com/top250' + next_link, callback=self.parse)

通过输出结果可以看到成功访问到了最后一页

完整代码:

# -*- coding: utf-8 -*-
import scrapy
from ..items import DoubanItem

class DoubanSpiderSpider(scrapy.Spider):
    #爬虫名称
    name = 'douban_spider'
    #爬虫允许抓取的域名
    allowed_domains = ['movie.douban.com']
    #获取数据传给调度器的地址
    start_urls = ['http://movie.douban.com/top250']

    def parse(self, response):
        movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
        for item in movie_list:
            douban_item = DoubanItem()
            douban_item['movie_num'] = item.xpath(".//div[@class='item']//em/text()").get()
            douban_item['movie_name'] = item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").get()
            douban_item['star'] = item.xpath(".//div[@class='bd']/div[@class='star']/span[2]/text()").get()
            douban_item['value'] = item.xpath(".//div[@class='bd']/div[@class='star']/span[4]/text()").get()
            douban_item['describle'] = item.xpath(".//div[@class='bd']/p[@class='quote']/span/text()").get()
            print(douban_item)
            yield douban_item
            #将返回结果压入item Pipline进行处理
        next_link = response.xpath("//span[@class='next']/link/@href").get()
        if next_link:
            yield scrapy.Request('http://movie.douban.com/top250' + next_link, callback=self.parse)

保存文件:

保存为csv文件:

scrapy crawl douban_spider -o movielist.csv

保存为json文件:

scrapy crawl douban_spider -o movielist.json

注意:使用excel打开csv文件时,常常会发生乱码,这是由于csv数据用逗号分隔,而excel通过ANSI解码导致的

解决方法:

在爬虫文件中添加以下代码,预先设置csv文件的编码格式为UTF8-BOM

import codecs
with codecs.open('movielist.csv','wb+') as f:
    f.write(codecs.BOM_UTF8)

结果展示: 

已标记关键词 清除标记
相关推荐
前言 第一篇 理论基础篇 第1章 什么是网络爬虫 3 1.1 初识网络爬虫 3 1.2 为什么要学网络爬虫 4 1.3 网络爬虫的组成 5 1.4 网络爬虫的类型 6 1.5 爬虫扩展——聚焦爬虫 7 1.6 小结 8 第2章 网络爬虫技能总览 9 2.1 网络爬虫技能总览图 9 2.2 搜索引擎核心 10 2.3 用户爬虫的那些事儿 11 2.4 小结 12 第二篇 核心技术篇 第3章 网络爬 虫实现原理与实现技术 15 3.1 网络爬虫实现原理详解 15 3.2 爬行策略 17 3.3 网页更新策略 18 3.4 网页分析算法 20 3.5 身份识别 21 3.6 网络爬虫实现技术 21 3.7 实例——metaseeker 22 3.8 小结 27 第4章 Urllib库与URLError异常处理 29 4.1 什么是Urllib库 29 4.2 快速使用Urllib爬取网页 30 4.3 浏览器的模拟——Headers属性 34 4.4 超时设置 37 4.5 HTTP协议请求实战 39 4.6 代理服务器的设置 44 4.7 DebugLog实战 45 4.8 异常处理神器——URLError实战 46 4.9 小结 51 第5章 正则表达式与Cookie的使用 52 5.1 什么是正则表达式 52 5.2 正则表达式基础知识 52 5.3 正则表达式常见函数 61 5.4 常见实例解析 64 5.5 什么是Cookie 66 5.6 Cookiejar实战精析 66 5.7 小结 71 第6章 手写Python爬虫 73 6.1 图片爬虫实战 73 6.2 链接爬虫实战 78 6.3 糗事百科爬虫实战 80 6.4 微信爬虫实战 82 6.5 什么是多线程爬虫 89 6.6 多线程爬虫实战 90 6.7 小结 98 第7章 学会使用Fiddler 99 7.1 什么是Fiddler 99 7.2 爬虫与Fiddler的关系 100 7.3 Fiddler的基本原理与基本界面 100 7.4 Fiddler捕获会话功能 102 7.5 使用QuickExec命令行 104 7.6 Fiddler断点功能 106 7.7 Fiddler会话查找功能 111 7.8 Fiddler的其他功能 111 7.9 小结 113 第8章 爬虫的浏览器伪装技术 114 8.1 什么是浏览器伪装技术 114 8.2 浏览器伪装技术准备工作 115 8.3 爬虫的浏览器伪装技术实战 117 8.4 小结 121 第9章 爬虫的定向爬取技术 122 9.1 什么是爬虫的定向爬取技术 122 9.2 定向爬取的相关步骤与策略 123 9.3 定向爬取实战 124 9.4 小结 130 第三篇 框架实现篇 第10章 了解Python爬虫框架 133 10.1 什么是Python爬虫框架 133 10.2 常见的Python爬虫框架 133 10.3 认识Scrapy框架 134 10.4 认识Crawley框架 135 10.5 认识Portia框架 136 10.6 认识newspaper框架 138 10.7 认识Python-goose框架 139 10.8 小结 140 第11章 爬虫利器——Scrapy安装与配置 141 11.1 在Windows7下安装及配置Scrapy实战详解 141 11.2 在Linux(Centos)下安装及配置Scrapy实战详解 147 11.3 在MAC下安装及配置Scrapy实战详解 158 11.4 小结 161 第12章 开启Scrapy爬虫项目之旅 162 12.1 认识Scrapy项目的目录结构 162 12.2 用Scrapy进行爬虫项目管理 163 12.3 常用工具命令 166 12.4 实战:Items的编写 181 12.5 实战:Spider的编写 183 12.6 XPath基础 187 12.7 Spider类参数传递 188 12.8 用XMLFeedSpider来分析XML源 191 12.9 学会使用CSVFeedSpider 197 12.10 Scrapy爬虫多开技能 200 12.11 避免被禁止 206 12.12 小结 212 第13章 Scrapy核心架构 214 13.1 初识Scrapy架构 214 13.2 常用的Scrapy组件详解 215 13.3 Scrapy工作流 217 13.4 小结 219 第14章 Scrapy中文输出与存储 220 14.1 Scrapy的中文输出 220 14.2 Scrapy的中文存储 223 14.3 输出中文到JSON文件 225 14.4 小结 230 第15章 编写自动爬取网页的爬虫 231 15.1 实战:items的编写 231 15.2 实战:pipelines的编写 233 15.3 实战:settings的编写 234 15.4 自动爬虫编写实战 234 15.5 调试与运行 239 15.6 小结 242 第16章 CrawlSpider 243 16.1 初识CrawlSpider 243 16.2 链接提取器 244 16.3 实战:CrawlSpider实例 245 16.4 小结 249 第17章 Scrapy高级应用 250 17.1 如何在Python3中操作数据库 250 17.2 爬取内容写进MySQL 254 17.3 小结 259 第四篇 项目实战篇 第18章 博客类爬虫项目 263 18.1 博客类爬虫项目功能分析 263 18.2 博客类爬虫项目实现思路 264 18.3 博客类爬虫项目编写实战 264 18.4 调试与运行 274 18.5 小结 275 第19章 图片类爬虫项目 276 19.1 图片类爬虫项目功能分析 276 19.2 图片类爬虫项目实现思路 277 19.3 图片类爬虫项目编写实战 277 19.4 调试与运行 281 19.5 小结 282 第20章 模拟登录爬虫项目 283 20.1 模拟登录爬虫项目功能分析 283 20.2 模拟登录爬虫项目实现思路 283 20.3 模拟登录爬虫项目编写实战 284 20.4 调试与运行 292 20.5 小结 294
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页