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. Java字节码深度剖析

    Java字节码文件查看 我们有一个类Test01,具体内容如下: package bytecode; public class Test01 { private int i = 0; public i ...

  2. redis与memcached区别

    不同点: (1) redis中并不是所有数据在有效期内只能常驻内存的(如果需要,可定期同步持久化到磁盘),这是和memcached相比一个最大的区别(memcached中的数据在有效期内是以键值对的形 ...

  3. #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库

    在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...

  4. 关于Python中的错误与异常,你是否了解的够仔细?

    每次版本结束都描述这着同样的错误,相似的问题,但始终没见解决.所以今天,我就来总结下Python的错误与异常! 异常与错误 错误 语法错误 可以通过IDE或者解释器给出提示的错误 opentxt('a ...

  5. luogu P1082 同余方程 |扩展欧几里得

    题目描述 求关于 x的同余方程 ax≡1(modb) 的最小正整数解. 输入格式 一行,包含两个正整数 a,ba,b,用一个空格隔开. 输出格式 一个正整数 x,即最小正整数解.输入数据保证一定有解. ...

  6. luogu P2701 [USACO5.3]巨大的牛棚Big Barn |动态规划

    题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的 ...

  7. 【Springboot】Springboot整合Jasypt,让配置信息安全最优雅方便的方式

    1 简介 在上一篇文章中,介绍了Jasypt及其用法,具体细节可以查看[Java库]如何使用优秀的加密库Jasypt来保护你的敏感信息?.如此利器,用之得当,那将事半功倍.本文将介绍Springboo ...

  8. Zookeeper Watcher接口

    在ZooKeeper中,接口类Watcher用于表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了 ...

  9. 微信小程序 buton清除默认样式

    相信很多小伙伴在开发小程序的时候都会碰到小程序Button默认样式的困扰,在重设样式的时候需要一次次的设置 分享一个自己在开发中的小方法: CSS all 简写属性 将除 unicode-bidi 与 ...

  10. Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)

    _ 前言 本文文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Bo_wen   最近两天学习了一下python,并自己写了一个 ...