scrapy介绍

Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方

式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API

所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异

步)的代码来实现并发。整体架构大致如下

1.引擎(EGINE)

引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分。

2.调度器(SCHEDULER)

用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个

要抓取的网址是什么, 同时去除重复的网址

3.下载器(DOWLOADER)

用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的

4.爬虫(SPIDERS)

SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求

5.项目管道(ITEM PIPLINES)

在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作

6.下载器中间件(Downloader Middlewares)

位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的

响应response,你可用该中间件做以下几件事

  1. 1. process a request just before it is sent to the Downloader (i.e. right before Scrapy sends the request to the website);
  2. 2. change received response before passing it to a spider;
  3. 3. send a new Request instead of passing received response to a spider;
  4. 4. pass response to a spider without fetching a web page;
  5. 5. silently drop some requests.

7.爬虫中间件(Spider Middlewares)

位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

scrapy安装(win)

安装

  1. 1.pip insatll wheel #支持本地安装的模块
  2. pip install lxml
  3. pip install pyopenssl
  4. 2.下载合适的版本的twistedhttp://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
  5. 3.安装twisted,到同一个目录,然后pip install
  6. 4.pip install pywin32
  7. 5.pip intstall scrapy
  8. 如果:在终端输入scrapy没有问题就是安装成功了

命令行常用指令

  1. #创建工程
  2. scrapy startproject name
  3. #创建爬虫文件
  4. scrapy genspider spiderName www.xxx.com
  5. #执行爬虫任务
  6. scrapy crawl 工程名字

其他命令

  1. #查看帮助
  2. scrapy -h
  3. scrapy <command> -h
  4. #有两种命令:其中Project-only必须切到项目文件夹下才能执行,而Global的命令则不需要
  5. Global commands:
  6. startproject #创建项目
  7. genspider #创建爬虫程序
  8. settings #如果是在项目目录下,则得到的是该项目的配置
  9. runspider #运行一个独立的python文件,不必创建项目
  10. shell #scrapy shell url地址 在交互式调试,如选择器规则正确与否
  11. fetch #独立于程单纯地爬取一个页面,可以拿到请求头
  12. view #下载完毕后直接弹出浏览器,以此可以分辨出哪些数据是ajax请求
  13. version #scrapy version 查看scrapy的版本,scrapy version -v查看scrapy依赖库的版本
  14. Project-only commands:
  15. crawl #运行爬虫,必须创建项目才行,确保配置文件中ROBOTSTXT_OBEY = False
  16. check #检测项目中有无语法错误
  17. list #列出项目中所包含的爬虫名

爬虫文件信息

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. class ZxSpider(scrapy.Spider):
  4. #工程名称,唯一标志
  5. name = 'zx'
  6. #允许爬取的域名(一般不用)
  7. # allowed_domains = ['www.baidu.com']
  8. #起始爬取的url,可以是多个
  9. start_urls = ['http://www.baidu.com/',"https://docs.python.org/zh-cn/3/library/index.html#library-index"]
  10. #回调函数,返回请求回来的信息
  11. def parse(self, response):
  12. print(response)

配置文件修改(setting.py)

修改UA和是否遵守爬虫协议 添加日志打印等级

  1. # Crawl responsibly by identifying yourself (and your website) on the user-agent
  2. #USER_AGENT = 'zx_spider (+http://www.yourdomain.com)'
  3. # Obey robots.txt rules,君子协议不遵守
  4. ROBOTSTXT_OBEY = True
  5. LOG_LEVEL='ERROR'

最后测试下配置成功没有

简单案例(爬段子)

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. class DuanziSpider(scrapy.Spider):
  4. name = 'duanzi'
  5. # allowed_domains = ['www.xxx.com']
  6. start_urls = ['http://duanziwang.com/']
  7. def parse(self, response):
  8. div_list=response.xpath('//main/article')
  9. for i in div_list:
  10. title=i.xpath('.//h1/a/text()').extract_first()
  11. #xpath返回的是存放selector对象的列表,想要拿到数据需要调用extract()函数取出内容,如果列表长度为1可以使用extract_first()
  12. content=i.xpath('./div[@class="post-content"]/p/text()').extract_first()
  13. print(title)
  14. print(content)

执行流程

五大核心组件

引擎(Scrapy)

(创建对象,根据数据调度方法等)

用来处理整个系统的数据流处理, 触发事务(框架核心)

调度器(Scheduler)

用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

下载器(Downloader)

用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

爬虫(Spiders)

爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面

项目管道(Pipeline)

负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

执行流程

1.爬虫程序将url封装后发送给引擎

2.引擎拿到url后,把它给调度器

3.调度器首先过滤重复的url

4.将过滤好的url压入队列

5.将队列发给引擎

6.引擎将队列发给下载器

7.下载器向互联网请求数据

8.获取数据

9.将数据response发给引擎

10.引擎将数据发给爬虫程序的回调

11.数据处理好,在此发给引擎

12.引擎将数据发给管道,由管道进行数据的持久化存储

配置run文件启动项目

  1. 1.新建run.py
  2. 2.
  3. from scrapy.cmdline import execute
  4. execute(['scrapy','crawl','jd'])

高级设置

修改初始请求

  1. #默认初始请求是这个
  2. start_urls = ['https://www.jd.com']
  3. #重写__init__()函数(qs)
  4. def __init__(self,qs=None,*args,**kwargs):
  5. super(JdSpider,self).__init__(*args,**kwargs)
  6. self.api = "http://list.tmall.com/search_product.htm?"
  7. self.qs = eval(qs)
  8. #重写的start_requests函数
  9. #初始化请求
  10. def start_requests(self):
  11. for q in self.qs:
  12. self.param = {
  13. "q": q,
  14. "totalPage": 1,
  15. 'jumpto': 1,
  16. }
  17. url = self.api + urlencode(self.param)
  18. yield scrapy.Request(url=url,callback=self.gettotalpage,dont_filter=True)
  19. #后续请求
  20. def gettotalpage(self, response):
  21. totalpage = response.css('[name="totalPage"]::attr(value)').extract_first()
  22. self.param['totalPage'] = int(totalpage)
  23. for i in range(1,self.param['totalPage']+1):
  24. # for i in range(1,3):
  25. self.param['jumpto'] = i
  26. url = self.api + urlencode(self.param)
  27. yield scrapy.Request(url=url,callback=self.get_info,dont_filter=True)

自定义解析函数

  1. #即对应请求函数的callback函数
  2. def get_info(self,response):
  3. product_list = response.css('.product')
  4. for product in product_list:
  5. title = product.css('.productTitle a::attr(title)').extract_first()
  6. price = product.css('.productPrice em::attr(title)').extract_first()
  7. status = product.css('.productStatus em::text').extract_first()
  8. # print(title,price,status)
  9. item = items.MyxiaopapaItem()
  10. item['title'] = title
  11. item['price'] = price
  12. item['status'] = status
  13. yield item

item使用

  1. 1.items.py里面规定可以接收的参数
  2. import scrapy
  3. class MyxiaopapaItem(scrapy.Item):
  4. # define the fields for your item here like:
  5. # name = scrapy.Field()
  6. title = scrapy.Field()
  7. price = scrapy.Field()
  8. status = scrapy.Field()
  9. 2.生成items对象,并返回
  10. from myxiaopapa import items
  11. #解析函数返回item对象
  12. item = items.MyxiaopapaItem()
  13. item['title'] = title
  14. item['price'] = price
  15. item['status'] = status
  16. yield item

pipelines

存储

  1. #yield item之后就会执行pipelines里面的方法
  2. #前提条件是settings里面有配置
  3. #数字为优先级,越小越优先,可以配置多个,一般用于多个存储
  4. #ITEM_PIPELINES = {
  5. # 'zx.pipelines.ZxPipeline': 300,
  6. #}

配置数据库

  1. import pymongo
  2. import json
  3. class MyxiaopapaPipeline(object):
  4. def __init__(self,host,port,db,table):
  5. self.host = host
  6. self.port = port
  7. self.db = db
  8. self.table = table
  9. #优先于__init__()执行
  10. @classmethod
  11. def from_crawler(cls,crawl):
  12. port = crawl.settings.get('PORT')
  13. host = crawl.settings.get('HOST')
  14. db = crawl.settings.get('DB')
  15. table = crawl.settings.get('TABLE')
  16. return cls(host,port,db,table)
  17. #爬虫启动执行,可以用来开启数据库连接
  18. def open_spider(self,crawl):
  19. self.client = pymongo.MongoClient(port=self.port,host=self.host)
  20. db_obj = self.client[self.db]
  21. self.table_obj = db_obj[self.table]
  22. #爬虫结束执行,可以用来关闭数据库连接
  23. def close_spider(self,crawl):
  24. self.client.close()
  25. def process_item(self, item, spider):
  26. self.table_obj.insert(dict(item))
  27. print(item['title'],'存储成功')
  28. return item

配置请求头

  1. #settings里面默认有
  2. #DEFAULT_REQUEST_HEADERS = {
  3. # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  4. # 'Accept-Language': 'en',
  5. #}
  6. #如果想要自定义,优先走自定义
  7. # custom_settings = {
  8. # 'NAME':"MAC",
  9. # 'DEFAULT_REQUEST_HEADERS':{
  10. # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  11. # 'Accept-Language': 'en',
  12. # "User-Agent": "XXXX"
  13. # }
  14. #
  15. #
  16. # }

DownloaderMiddleware

request

  1. #None
  2. 执行下一个中间件的process_request
  3. #Response
  4. 执行最后中间件的process_response在往前执行
  5. #Request
  6. 请求放到队列重新开始
  7. #异常
  8. 执行最后中间件process_exception,在往前执行

Response

  1. #默认response
  2. 正常执行
  3. #Response(url)
  4. 执行最后中间件的process_response在往前执行
  5. #Request
  6. 请求放到队列重新开始
  7. #异常
  8. 执行spider的错误执行

代理

  1. def process_request(self, request, spider):
  2. request.meta['Download_timeout'] = 10
  3. request.meta['proxy'] = "http://" + get_proxy()
  4. return None

参考链接

https://www.cnblogs.com/xiaoyuanqujing/protected/articles/11805810.html

scrapy框架安装配置的更多相关文章

  1. Python爬虫进阶三之Scrapy框架安装配置

    初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 ...

  2. Python爬虫进阶之Scrapy框架安装配置

    Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此 ...

  3. python爬虫框架(3)--Scrapy框架安装配置

    1.安装python并将scripts配置进环境变量中 2.安装pywin32 在windows下,必须安装pywin32,安装地址:http://sourceforge.net/projects/p ...

  4. 芝麻HTTP:Python爬虫进阶之Scrapy框架安装配置

    初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 ...

  5. Scrapy框架安装配置小结

    Windows 平台: 系统是 Win7 Python  2.7.7版本 官网文档:http://doc.scrapy.org/en/latest/intro/install.html 1.安装Pyt ...

  6. Python3 爬虫之 Scrapy 框架安装配置(一)

    博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的爬虫实现过程请参照本人的另一篇博客:Python3 爬虫之 Scr ...

  7. scrapy框架中间件配置代理

    scrapy框架中间件配置代理import random#代理池PROXY_http = [ '106.240.254.138:80', '211.24.102.168:80',]PROXY_http ...

  8. drf框架安装配置及其功能概述

    0902自我总结 drf框架安装配置及其功能概述 一.安装 pip3 install djangorestframework 二.配置 # 注册drf app NSTALLED_APPS = [ # ...

  9. Scrapy 框架 安装 五大核心组件 settings 配置 管道存储

    scrapy 框架的使用 博客: https://www.cnblogs.com/bobo-zhang/p/10561617.html 安装: pip install wheel 下载 Twisted ...

随机推荐

  1. 消息队列 ActiveMQ 、RocketMQ 、RabbitMQ 和 Kafka 如何选择?

    「 预计阅读 6 分钟 」 旁白:这是一篇拖更了N久的文章...0.0(看不见我~) 往期回顾 前端框架 jQuery 和 Vue 如何选择? 安全框架 Shiro 和 Spring Security ...

  2. Java HashSet对txt文本内容去重(统计小说用过的字或字数)

    Java HashSet对txt文本内容去重(统计小说用过的字或字数) 基本思路: 1.字节流读需要去重的txt文本.(展示demo为当前workspace下名为utf-8.txt的文本) 2.对读取 ...

  3. Java创建线程的四种方式

    Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...

  4. 学习笔记43_T4模板

    新建-文本模板(后缀为.tt) <#@ template debug="false" hostspecific="false"  language=&qu ...

  5. CSPS_106

    这场 死的太惨了! 我也不把我的错误像倒垃圾一样放在blog里了qwq 通过这场考试 我深深地认识到了情绪对人类的影响qwq 只要这种东西,不要出现在我的csp中就好了 T1 区间DP.. T2 枚举 ...

  6. 口胡题fr

    T1五种贡献恶心的要死.$1.grand$$2.father$$3.brother$$4.son$$5.grandson$我们选择维护三个量.1.儿子和,$sx$2.孙子和,$gsx$3.自己的值,$ ...

  7. python接口测试-数据驱动-DDT

    DDT是python的第三方库,全名称为:Data-Driven/Decorated Tests. ddt安装 通过pip安装ddt模块,安装Python后,Python自带pip功能包 切换到Pyt ...

  8. 『题解』Codeforces121A Lucky Sum

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Petya loves lucky numbers. Everybody k ...

  9. 在ubuntu中编译内核是用make menuconfig报错:package 'ncurses' has n

    执行过程如下: root@zyx-VirtualBox:~# cd /opt/EmbedSky/ root@zyx-VirtualBox:/opt/EmbedSky# cd linux-2.6.30. ...

  10. php charles 使用方法

    php charles 使用方法 打开charles 点击help菜单点击local ip address 可以获取本地ip 手机上选择代理这个ip 端口8888 然后手机访问网页 charles会弹 ...