以前我们写爬虫,要导入和操作不同的模块,比如requests模块、gevent库、pymysql模块等。而在Scrapy里,你不需要这么做,因为很多爬虫需要涉及的功能,比如麻烦的异步,在Scrapy框架都自动实现

我们之前编写爬虫的方式,相当于在一个个地在拼零件,拼成一辆能跑的车。而Scrapy框架则是已经造好的、现成的车,我们只要踩下它的油门,它就能跑起来。这样便节省了我们开发项目的时间

Scrapy的结构

Scheduler(调度器)部门主要负责处理引擎发送过来的requests对象(即网页请求的相关信息集合,包括params,data,cookies,request headers…等),会把请求的url以有序的方式排列成队,并等待引擎来提取(功能上类似于gevent库的queue模块)。

Downloader(下载器)部门则是负责处理引擎发送过来的requests,进行网页爬取,并将返回的response(爬取到的内容)交给引擎。它对应的是爬虫流程【获取数据】这一步。

Spiders(爬虫)部门是公司的核心业务部门,主要任务是创建requests对象和接受引擎发送过来的response(Downloader部门爬取到的内容),从中解析并提取出有用的数据。它对应的是爬虫流程【解析数据】和【提取数据】这两步。

Item Pipeline(数据管道)部门则是公司的数据部门,只负责存储和处理Spiders部门提取到的有用数据。这个对应的是爬虫流程【存储数据】这一步。

Downloader Middlewares(下载中间件)的工作相当于下载器部门的秘书,比如会提前对引擎大boss发送的诸多requests做出处理。

Spider Middlewares(爬虫中间件)的工作则相当于爬虫部门的秘书,比如会提前接收并处理引擎大boss发送来的response,过滤掉一些重复无用的东西。

scrapy 工作原理

在Scrapy爬虫公司里,每个部门都各司其职,形成了很高效的运行流程

Scrapy中的程序全部都是异步模式,所有的请求或返回的响应都由引擎自动分配去处理

Scrapy的用法(豆瓣读书top250)

book.douban.com/top250

分析分页...

分析元素...

我们只要取出<tr class="item">元素下<a>元素的title属性的值、<p class="pl">元素、<span class="rating_nums">元素,就能得到书名、出版信息和评分的数据。

代码实现——创建项目

安装scrapy, pip install scrapy

解决方案1: 安装vc++运行库集合

pan.baidu.com/s/16jVqbrHA… u2v6

方案2: 直接下载whl库进行安装,简单, 最近需要翻墙, 不知道以后怎样...

方案3: 安装vc++2015, 对应14版本,试了,不管用, 你就别试了...

创建爬虫项目

跳转到你想创建爬虫项目的路径

创建爬虫项目

项目结构

Scrapy项目里每个文件都有特定的功能,settings.py 是scrapy里的各种设置。items.py是用来定义数据的,pipelines.py是用来处理数据的,它们对应的就是Scrapy的结构中的Item Pipeline(数据管道)middlewares.py是中间件

代码实现——编辑爬虫

如前所述,spiders是放置爬虫的目录。我们可以在spiders这个文件夹里创建爬虫文件。我们来把这个文件,命名为top250。后面的大部分代码都需要在这个top250.py文件里编写。

E:\helloSpider\douban\douban\spiders\top250.py

import scrapy
import bs4
# 定义一个爬虫类DoubanSpider。就像我刚刚讲过的那样,DoubanSpider类继承自scrapy.Spider类。
class DoubanSpider(scrapy.Spider):# name是定义爬虫的名字,这个名字是爬虫的唯一标识。name = 'douban'意思是定义爬虫的名字为douban。等会我们启动爬虫的时候,要用到这个名字。name = 'douban'# allowed_domains是定义允许爬虫爬取的网址域名(不需要加https://)。如果网址的域名不在这个列表里,就会被过滤掉。allowed_domains = ['book.douban.com']# start_urls是定义起始网址,就是爬虫从哪个网址开始抓取。在此,allowed_domains的设定对start_urls里的网址不会有影响。start_urls = ['https://book.douban.com/top250?start=0']# parse是Scrapy里默认处理response的一个方法def parse(self,response):print(response.text)
复制代码

之前分析过页面规律

十页变一页...

修改代码...

import scrapy
import bs4
# 定义一个爬虫类DoubanSpider。就像我刚刚讲过的那样,DoubanSpider类继承自scrapy.Spider类。
class DoubanSpider(scrapy.Spider):# name是定义爬虫的名字,这个名字是爬虫的唯一标识。name = 'douban'意思是定义爬虫的名字为douban。等会我们启动爬虫的时候,要用到这个名字。name = 'douban'# allowed_domains是定义允许爬虫爬取的网址域名(不需要加https://)。如果网址的域名不在这个列表里,就会被过滤掉。allowed_domains = ['book.douban.com']# start_urls是定义起始网址,就是爬虫从哪个网址开始抓取。在此,allowed_domains的设定对start_urls里的网址不会有影响。start_urls = []for x in range(3):url = 'https://book.douban.com/top250?start='+str(x*25)start_urls.append(url)# parse是Scrapy里默认处理response的一个方法def parse(self,response):print(response.text)
复制代码

提取元素....

书名是<tr class="item">元素下<a>元素的title属性的值;出版信息在<p class="pl">元素里;评分在<span class="rating_nums">元素里。

import scrapy
import bs4
from ..items import DoubanItem
# 定义一个爬虫类DoubanSpider。就像我刚刚讲过的那样,DoubanSpider类继承自scrapy.Spider类。
class DoubanSpider(scrapy.Spider):# name是定义爬虫的名字,这个名字是爬虫的唯一标识。name = 'douban'意思是定义爬虫的名字为douban。等会我们启动爬虫的时候,要用到这个名字。name = 'douban'# allowed_domains是定义允许爬虫爬取的网址域名(不需要加https://)。如果网址的域名不在这个列表里,就会被过滤掉。allowed_domains = ['book.douban.com']# start_urls是定义起始网址,就是爬虫从哪个网址开始抓取。在此,allowed_domains的设定对start_urls里的网址不会有影响。start_urls = []for x in range(3):url = 'https://book.douban.com/top250?start='+str(x*25)start_urls.append(url)# parse是Scrapy里默认处理response的一个方法def parse(self, response):bs = bs4.BeautifulSoup(response.text, 'html.parser')datas = bs.find_all('tr', class_='item')for data in datas:title = data.find_all('a')[1]['title']publish = data.find('p', class_="pl").textscore = data.find('span', class_="rating_nums").textprint([title, publish, score])
复制代码

代码实现——定义数据

在scrapy中,我们会专门定义一个用于记录数据的类。

我们会实例化一个对象,利用这个对象来记录数据。

每一次,当数据完成记录,它会离开spiders,来到Scrapy Engine(引擎),引擎将它送入Item Pipeline(数据管道)处理。

定义这个类的py文件,正是items.py

如何在items.py里定义这些数据。代码如下:

import scrapy
class DoubanItem(scrapy.Item):# 让数据能以类似字典的形式记录title = scrapy.Field()publish = scrapy.Field()score = scrapy.Field()
复制代码

修改douban250.py

import scrapy
import bs4
from ..items import DoubanItem
# 定义一个爬虫类DoubanSpider。就像我刚刚讲过的那样,DoubanSpider类继承自scrapy.Spider类。
class DoubanSpider(scrapy.Spider):# name是定义爬虫的名字,这个名字是爬虫的唯一标识。name = 'douban'意思是定义爬虫的名字为douban。等会我们启动爬虫的时候,要用到这个名字。name = 'douban'# allowed_domains是定义允许爬虫爬取的网址域名(不需要加https://)。如果网址的域名不在这个列表里,就会被过滤掉。allowed_domains = ['book.douban.com']# start_urls是定义起始网址,就是爬虫从哪个网址开始抓取。在此,allowed_domains的设定对start_urls里的网址不会有影响。start_urls = []for x in range(3):url = 'https://book.douban.com/top250?start='+str(x*25)start_urls.append(url)# parse是Scrapy里默认处理response的一个方法def parse(self, response):bs = bs4.BeautifulSoup(response.text, 'html.parser')datas = bs.find_all('tr', class_='item')for data in datas:item = DoubanItem()item['title'] = data.find_all('a')[1]['title']item['publish'] = data.find('p', class_="pl").textitem['score'] = data.find('span', class_="rating_nums").textprint(item)yield item  # 类似于return, 但是不会结束函数
复制代码

代码实操——设置

我们需要修改请求头...

ROBOTSTXT_OBEY=True改成ROBOTSTXT_OBEY=False,就是把遵守robots协议换成无需遵从robots协议,这样Scrapy就能不受限制地运行。

代码实操——运行

方法一: scrapy crawl douban(douban是我们爬虫的名字)

E:\helloSpider\douban> scrapy crawl douban

如果遇到...No module named win32api...

pip install pywin32

方法二: main.py

在最外层的大文件夹里新建一个main.py文件(与scrapy.cfg同级)

# 导入cmdline模块,可以实现控制终端命令行
from scrapy import cmdline
# 执行命令 "scrapy crawl douban"
cmdline.execute(['scrapy', 'crawl', 'douban'])
复制代码

了教学方便理解,先写了爬虫,再定义数据。但是,在实际项目实战中,常常顺序却是相反的——先定义数据,再写爬虫。所以,流程图应如下:

细心的你可能会发现,这一关的内容没有涉及到存储数据的步骤。

复习

存储到mysql

存储数据需要修改pipelines.py文件, 不过我们需要先建立一个数据库

drop database if exists douban;
create database douban character set utf8;
use douban;
create table book(id int primary key auto_increment,title varchar(255) not null,publish varchar(255) not null,score decimal(2,1) not null
);
复制代码
mysql> desc book;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| title   | varchar(255) | NO   |     | NULL    |                |
| publish | varchar(255) | NO   |     | NULL    |                |
| score   | decimal(2,1) | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
复制代码

有了数据库, 我们开始写E:\helloSpider\douban\douban\pipelines.py

# -*- coding: utf-8 -*-
import pymysql
class DoubanPipeline(object):def __init__(self):# 创建数据库连接self.connection = pymysql.connect(host='localhost',port=3306,user='root',password='root',db='douban',charset='utf8')self.cursor = self.connection.cursor()def process_item(self, item, third):# 拼接sql语句sql = "insert into book(title,publish,score) values({},{},{})".format(repr(item['title']), repr(item['publish']), item['score'])# 执行sql语句self.cursor.execute(sql)self.connection.commit()
复制代码

还有设置文件E:\helloSpider\douban\douban\settings.py

看一下最终效果...

快速跳转:

猫哥教你写爬虫 000--开篇.md
猫哥教你写爬虫 001--print()函数和变量.md
猫哥教你写爬虫 002--作业-打印皮卡丘.md
猫哥教你写爬虫 003--数据类型转换.md
猫哥教你写爬虫 004--数据类型转换-小练习.md
猫哥教你写爬虫 005--数据类型转换-小作业.md
猫哥教你写爬虫 006--条件判断和条件嵌套.md
猫哥教你写爬虫 007--条件判断和条件嵌套-小作业.md
猫哥教你写爬虫 008--input()函数.md
猫哥教你写爬虫 009--input()函数-人工智能小爱同学.md
猫哥教你写爬虫 010--列表,字典,循环.md
猫哥教你写爬虫 011--列表,字典,循环-小作业.md
猫哥教你写爬虫 012--布尔值和四种语句.md
猫哥教你写爬虫 013--布尔值和四种语句-小作业.md
猫哥教你写爬虫 014--pk小游戏.md
猫哥教你写爬虫 015--pk小游戏(全新改版).md
猫哥教你写爬虫 016--函数.md
猫哥教你写爬虫 017--函数-小作业.md
猫哥教你写爬虫 018--debug.md
猫哥教你写爬虫 019--debug-作业.md
猫哥教你写爬虫 020--类与对象(上).md
猫哥教你写爬虫 021--类与对象(上)-作业.md
猫哥教你写爬虫 022--类与对象(下).md
猫哥教你写爬虫 023--类与对象(下)-作业.md
猫哥教你写爬虫 024--编码&&解码.md
猫哥教你写爬虫 025--编码&&解码-小作业.md
猫哥教你写爬虫 026--模块.md
猫哥教你写爬虫 027--模块介绍.md
猫哥教你写爬虫 028--模块介绍-小作业-广告牌.md
猫哥教你写爬虫 029--爬虫初探-requests.md
猫哥教你写爬虫 030--爬虫初探-requests-作业.md
猫哥教你写爬虫 031--爬虫基础-html.md
猫哥教你写爬虫 032--爬虫初体验-BeautifulSoup.md
猫哥教你写爬虫 033--爬虫初体验-BeautifulSoup-作业.md
猫哥教你写爬虫 034--爬虫-BeautifulSoup实践.md
猫哥教你写爬虫 035--爬虫-BeautifulSoup实践-作业-电影top250.md
猫哥教你写爬虫 036--爬虫-BeautifulSoup实践-作业-电影top250-作业解析.md
猫哥教你写爬虫 037--爬虫-宝宝要听歌.md
猫哥教你写爬虫 038--带参数请求.md
猫哥教你写爬虫 039--存储数据.md
猫哥教你写爬虫 040--存储数据-作业.md
猫哥教你写爬虫 041--模拟登录-cookie.md
猫哥教你写爬虫 042--session的用法.md
猫哥教你写爬虫 043--模拟浏览器.md
猫哥教你写爬虫 044--模拟浏览器-作业.md
猫哥教你写爬虫 045--协程.md
猫哥教你写爬虫 046--协程-实践-吃什么不会胖.md
猫哥教你写爬虫 047--scrapy框架.md
猫哥教你写爬虫 048--爬虫和反爬虫.md
猫哥教你写爬虫 049--完结撒花.md

转载于:https://juejin.im/post/5cfc4ade51882541b24c3f23

猫哥教你写爬虫 047--scrapy框架相关推荐

  1. 猫哥教你写爬虫 046--协程-实践-吃什么不会胖

    吃什么不会胖? 低热量食物 食物的数量有千千万,如果我们要爬取食物热量的话,这个数据量必然很大. 使用多协程来爬取大量的数据是非常合理且明智的选择 如果我们要爬取的话,那就得选定一个有存储食物热量信息 ...

  2. 猫哥教你写爬虫 006--条件判断和条件嵌套

    流程控制 复仇者联盟3-无限战争(搜集宝石) python里面, 不需要使用;来结尾, 因为python是使用换行来结束一行代码的 if判断, 没有{}, python使用缩进来表示层级关系 if.. ...

  3. 猫哥教你写爬虫 002--作业-打印皮卡丘

    作业 请你使用print()函数将下面的皮卡丘打印出来, 使用三种方式 へ /|/\7 ∠_// │ / /│ Z _,< / /`ヽ│ ヽ / 〉Y ` / /イ● 、 ● ⊂⊃〈 /() へ ...

  4. 猫哥教你写爬虫 005--数据类型转换-小作业

    小作业 程序员的一人饮酒醉 请运用所给变量,使用**str()**函数打印两句话. 第一句话:1人我编程累, 碎掉的节操满地堆 第二句话:2眼是bug相随, 我只求今日能早归 number1 = 1 ...

  5. 猫哥教你写爬虫 004--数据类型转换-小练习

    小练习, 改一下代码 word = '3.8' number = 1 sentence = '人工智障说:3.8+1等于' print(sentence+str(int(float(word)+num ...

  6. 猫哥教你写爬虫 037--爬虫-宝宝要听歌

    戴上耳机, 这个世界与我无关... 让我们用音乐洗涤心灵吧... 我们从哪个网站爬取资源呢? 专治各种不服... 打开酷狗官网, 可以看到搜索框,我们要爬取的数据就是搜索歌曲后, 酷狗后台返回的歌曲列 ...

  7. 猫哥教你写爬虫 027--模块介绍

    time模块 import time # 时间对象转美式时间字符串 print(time.asctime()) # Wed May 29 09:25:07 2019 print(time.asctim ...

  8. 猫哥教你写爬虫 000--开篇

    写在前面 快速跳转: 猫哥教你写爬虫 000--开篇.md 猫哥教你写爬虫 001--print()函数和变量.md 猫哥教你写爬虫 002--作业-打印皮卡丘.md 猫哥教你写爬虫 003--数据类 ...

  9. OpenGL.Shader:志哥教你写一个滤镜直播客户端:仿3个抖音滤镜效果(4镜像/电击/灵魂出窍)

    OpenGL.Shader:志哥教你写一个滤镜直播客户端(可能是结束篇) OpenGL.Shader基本的图像处理知识已经学习的7788了,所以这篇应该是滤镜直播客户端的最后一篇了,之后会出基于FFm ...

  10. OpenGL.Shader:志哥教你写一个滤镜直播客户端(5)视觉滤镜:对比度、曝光、马赛克

    OpenGL.Shader:志哥教你写一个滤镜直播客户端(5) 上一章介绍了如何在渲染nv21流的时候进行滤镜的无缝切换,这章内容紧接上一章,介绍三种滤镜特效:对比度.曝光.马赛克,并介绍如何动态调节 ...

最新文章

  1. 五年级上册计算机课如何拉表格,川教版小学信息技术五年级上册第八课 调整表格...
  2. tomcat 启动项目 页面文字乱码_eclipse启动tomcat项目乱码而终端启动tomcat正常的解决办法...
  3. 关于Response.redirect和Response.End出现线程中止异常的处理
  4. 关于CAN总线的位时间/同步段/传播时间段/相位缓冲段/采样点
  5. plsql 记录型变量
  6. udf iso9660 java_ISO和UDF光盘格式、扩展ISO9660----Joliet和Romeo文件系统
  7. 机器学习中训练集和测试集归一化(matlab版)
  8. FIFO算法与LRU算法软考试题
  9. html国庆节代码,QQ空间国庆节留言代码_祝大家国庆节快乐
  10. nmds与mds的区别_常见分析方法 | PCA、PCoA和NMDS有什么区别?
  11. 中山c 语言培训中心,中山英语口语培训中心
  12. 等保三全面安全检查表_全面的安全方法
  13. PAT乙级 1052 卖个萌 (0/20 分) Java 未实现
  14. MYSQL中,CAST函数的使用规则
  15. wiki服务器网页地址,搭建个人wiki站点
  16. Spring集成JMS入门
  17. bugkuCTF——猫片(安恒)
  18. 网络舆情监测是干嘛的?
  19. 计算机英语词汇带英标,小学英语词汇带英标(13页)-原创力文档
  20. PLC的具体应用领域主要有哪些

热门文章

  1. 乔家大院的5A牌子被摘了,但且别急着叫好
  2. 【PX4 飞控剖析】05 PIX4 连接QGC 可以烧录固件但是连接不上
  3. vue用mand-mobile ui做交易所移动版实战示例
  4. 国内哪家CDN加速服务好用?
  5. linux服务器设置定时任务,Linux服务器定时任务
  6. 视频怎么去水印教程 视频怎么去水印无痕迹
  7. pandas缺失数据处理
  8. PINN解偏微分方程--程函方程
  9. 深入理解Android相机体系结构之八
  10. Java并发编程--线程池ThreadPollExecutor原理探究