Scrapy框架(一)

国内镜像源:

阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣(douban) http://pypi.doubanio.com/simple/ 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

简介:

requests 虽然优雅强大,但它不是并发的,requests.get()处于阻塞状态,等待响应数据接受完成;如果要实现多线程,需要我们手动写多线程。

scrapy框架自带并发(默认16个线程) 去重 调度;Scrapy使用了Twisted 异步网络库来处理网络通讯。

scrapy框架 是用Twisted编写的,Twisted是一个流行的事件驱动的Python网络框架。它使用非阻塞(也成为异步)代码实现并发。

安装

windows安装
 # cmd命令
 pip install scrapy -i https://pypi.doubanio.com/simple
 ​
 python -m pip install scrapy # 如果报错用这个

如果失败(是因为scrapy是依赖Twisted的,而twisted需要c++的环境):

https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载跟你python版本对应的版本,然后

 cd D:\QMDownload # cd到你刚才下载的文件的路径,再用下面命令安装 Twisted的文件
 ​
 pip install Twisted-19.7.0-cp36-cp36m-win_amd64.whl

Ubantu安装:
 # 首先安装依赖库
 sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
 ​
 # 如果你想在python3上安装scrapy,你还需要Python3的开发头文件:
 sudo apt-get install python3-dev
 ​
 # 最后在virtualenv中,你可以使用pip安装Scrapy
 pip install scrapy[==1.6.0] -i https://pypi.tuna.tsinghua.edu.cn/simple # 清华源

基本使用

单个文件方式运行

 # !/usr/bin/env python
 # -*- coding: utf-8 -*-
 # @File   : demo.py
 import os
 import scrapy
 ​
 class MySpider(scrapy.Spider):
     name = 'spider1' # 爬虫名
     
     # 初始化地址, 不会考虑域名范围的
     start_urls = ['https://httpbin.org/get'] # 启动时Request会自动第一个访问该url
     
     def parse(self, response):
         """处理response对象的方法"""
         print(response.text, '======demo演示=====')
         
 # 运行:
 cd 到该文件所在路径
 scrapy runspider demo.py # 其实命令运行还是调用了框架的依赖(调度器)

项目方式

创建项目

 $ scrapy startproject project_name
 $ tree
 > dir # 同linux的 ls 查看当前路径下文件

创建爬虫文件

 $ cd project_name
 $ scrapy genspider spider_name website_domain

运行爬虫

 $ scrapy crawl spider_name      # 运行爬虫项目;在项目根目录下运行(即配置文件所在路径)
 ​
 $ scrapy runspider spider_file # 运行爬虫文件; 要在爬虫文件所在的路径下运行该命令

查看其他:

 $ scrapy list
 ​
 # 查看可以使用的template
 scrapy genspider -l
 # 查看template 的内容
 scrapy genspider -d basic
 ​
 # 检查spider
 scrapy check -l
 scrapy check
 ​
 # 查看页面返回结果
 scrapy fetch --nolog --headers https://www.danke.com/room/bj
 ​
 # 用浏览器打开页面
 scrapy view https://www.danke.com/room/bj
 ​
 # 命令行执行scrapy
 scrapy shell https://www.danke.com/room/bj
 ​
 # 对url进行分析
 scrapy parse <url> [options]

目录介绍

  • scrapy.cfg : 项目的配置文件

  • myscrapy:项目

  • myscrapy/items.py:项目使用的item文件

  • myscrapy/pipelines.py: 项目中的pipelines文件.

  • myscrapy/settings.py: 项目的设置文件.

  • myscrapy/spiders/: 放置spider代码的目录.

scrapy 组件

组件 解释 功能/作用
Spiders 爬虫程序 处理response对象,解析响应、提取需要的数据;并将需要跟进的URL提交给引擎
Engine 引擎 负责不同组件之间的通信、数据传递
Scheduler 调度器 接收Request请求,整理排队,加入队列
Downloader 下载器 负责引擎发送过来的Request请求 获取web页面的数据,进行下载
Item pipelines 管道 负责spiders返回的数据,对其处理;进行持久化存储(写入本地or数据库)
SpiderMiddleware 爬虫中间件 爬虫中间件是位于引擎和爬虫之间的特定的钩子,能够处理传入的响应和传递出去的item和请求。
DownloaderMiddleware 下载中间件 下载中间件是位于引擎和下载器之间的特定的钩子,它们处理从引擎传递到下载器的请求,以及下载器传递到引擎的响应。

运行流程

数据流

上图显示了Scrapy框架的体系结构及其组件,以及系统内部发生的数据流(由红色的箭头显示。)

Scrapy中的数据流由执行引擎控制,流程如下:

1.首先从爬虫获取初始的请求交给引擎

2.将请求放入调度模块,然后获取下一个需要爬取的请求

3.调度模块返回下一个需要爬取的请求给引擎

4.引擎将请求发送给下载器,依次穿过所有的下载中间件

5.一旦页面下载完成,下载器会返回一个响应包含了页面数据,然后再依次穿过所有的下载中间件。

6.引擎从下载器接收到响应,然后发送给爬虫进行解析,依次穿过所有的爬虫中间件

7.爬虫处理接收到的响应,然后解析出item和生成新的请求,并发送给引擎

8.引擎将已经处理好的item发送给管道组件,将生成好的新的请求发送给调度模块,并请求下一个请求

9.该过程重复,直到调度程序不再有请求为止。

Telent

使用telent终端访问scrapy

# 默认监听本地的6023端口
telnet localhost 6023
快捷名称 描述
crawler() Scrapy Crawler (scrapy.crawler.Crawler 对象)
engine() Crawler.engine属性
spider() 当前激活的爬虫(spider)
slot() the engine slot
extensions() 扩展管理器(manager) (Crawler.extensions属性)
stats() 状态收集器 (Crawler.stats属性)
settings() Scrapy设置(setting)对象 (Crawler.settings属性)
est() 打印引擎状态的报告
prefs() 针对内存调试 (参考 调试内存溢出)
p() pprint.pprint 函数的简写
hpy() 针对内存调试
 # 暂停爬虫
 telnet localhost 6023
 >>> engine.pause()
 # 恢复爬虫
 >>> engine.unpause()
 # 停止爬虫
 >>> engine.stop()

Setting 配置

 # 设置 telnet 的端口
 TELNETCONSOLE_PORT = [6023, 6073]
 # 监听的地址
 TELNETCONSOLE_HOST = '127.0.0.1'

Scrapy框架(一)的更多相关文章

  1. Python爬虫Scrapy框架入门(2)

    本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西 附上原创链接: http://www.cnblogs.com/qiyeboy/p/5428240.html 基本思路是,查看网页元素,填写 ...

  2. Python爬虫Scrapy框架入门(1)

    也许是很少接触python的原因,我觉得是Scrapy框架和以往Java框架很不一样:它真的是个框架. 从表层来看,与Java框架引入jar包.配置xml或.property文件不同,Scrapy的模 ...

  3. Scrapy框架使用—quotesbot 项目(学习记录一)

    一.Scrapy框架的安装及相关理论知识的学习可以参考:http://www.yiibai.com/scrapy/scrapy_environment.html 二.重点记录我学习使用scrapy框架 ...

  4. Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解

    这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...

  5. Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理

    这一篇文章主要是为了对scrapy框架的工作流程以及各个组件功能的介绍 Scrapy目前已经可以很好的在python3上运行Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是 ...

  6. python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

    操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...

  7. 一个scrapy框架的爬虫(爬取京东图书)

    我们的这个爬虫设计来爬取京东图书(jd.com). scrapy框架相信大家比较了解了.里面有很多复杂的机制,超出本文的范围. 1.爬虫spider tips: 1.xpath的语法比较坑,但是你可以 ...

  8. 安装scrapy框架的常见问题及其解决方法

    下面小编讲一下自己在windows10安装及配置Scrapy中遇到的一些坑及其解决的方法,现在总结如下,希望对大家有所帮助. 常见问题一:pip版本需要升级 如果你的pip版本比较老,可能在安装的过程 ...

  9. 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

    Python爬虫总结 总的来说,Python爬虫所做的事情分为两个部分,1:将网页的内容全部抓取下来,2:对抓取到的内容和进行解析,得到我们需要的信息. 目前公认比较好用的爬虫框架为Scrapy,而且 ...

  10. 利用scrapy框架进行爬虫

    今天一个网友问爬虫知识,自己把许多小细节都忘了,很惭愧,所以这里写一下大概的步骤,主要是自己巩固一下知识,顺便复习一下.(scrapy框架有一个好处,就是可以爬取https的内容) [爬取的是杨子晚报 ...

随机推荐

  1. The place where I want to go

    The place where I want to go It’s hard to say where I want to go most. Because there are too many pl ...

  2. 混淆矩阵-MATLAB代码详解

    一.混淆矩阵 (一).简介 在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵.在图像精度评价中,主要用于比较分类结果和实际测得值, ...

  3. JS 输出指定范围内的随机数

    /* 自定义函数 */ function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random(); return( ...

  4. Educational Codeforces Round 34 (Rated for Div. 2) A B C D

    Educational Codeforces Round 34 (Rated for Div. 2) A Hungry Student Problem 题目链接: http://codeforces. ...

  5. 【网络流相关】最大流的Dinic算法实现

    Luogu P3376 于\(EK\)算法求最大流时每一次只求一条增广路,时间复杂度会比较高.尽管实际应用中表现比较优秀,但是有一些题目还是无法通过. 那么我们就会使用\(Dinic\)算法实现多路增 ...

  6. 网站出现bug,我深夜被叫醒处理,用一个触发器解决了问题

    凌晨两点,我正在睡梦之中,此时电话忽然想起,在漆黑的深夜中显得格外刺耳. 这个时间点电话响了肯定没好事,因为我的手机在夜间模式下,除非被同一个电话号码打三次,否则是静音,因此电话那边的人肯定有急事找我 ...

  7. Sql like模糊查询 区分大小写

    Sql模糊查询,Like默认是不区分大小写的 使用Like时,怎么支持大小写呢? upper.lower,只能模糊所有的内容,不能区分内容中的大小写. sqlite数据库对text字段默认是大小写敏感 ...

  8. 个人搭建后台管理模板 Bootstrap4 ,ASP.NET Core,EF Core,JWT

    拥有一个美观好用的网站后台,是很多开发者的梦想,笔者在闲暇时间里搭建了一个不错的后台框架,这里分享诸位开发同仁. 项目地址:https://github.com/kongdf123/KentNoteB ...

  9. css3学习——一列固定宽度且居中

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. 深入理解跳跃链表在Redis中的应用

    0.前言 前面写了一篇关于跳表基本原理和特性的文章,本次继续介绍跳表的概率平衡和工程实现,跳表在Redis.LevelDB.ES中都有应用,本文以Redis为工程蓝本,分析跳表在Redis中的工程实现 ...