scrapy 框架的使用

博客: https://www.cnblogs.com/bobo-zhang/p/10561617.html

安装:

  1. pip install wheel

  2. 下载 Twisted-18.9.0-cp36-cp36m-win_amd64.whl

    下载地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/

  3. 安装 twisted

    pip install Twisted-18.9.0-cp36-cp36m-win_amd64.whl

  4. pip install pywin32

  5. pip install scrapy

基础使用:

  1. 创建项目:

    • scrapy startproject 项目名称
    • cd 到项目目录中
  2. 创建爬虫文件
    • scrapy genspider 文件名称 www.xxx.com
    • 课创建多个爬虫文件

Settings参数:

  1. ROBOTSTXT_OBEY = True #----------- 是否遵守robots.txt
  2. CONCURRENT_REQUESTS = 16 ## ----------- 开启线程数量,默认16
  3. AUTOTHROTTLE_START_DELAY = 3 # ----------- 开始下载时限速并延迟时间
  4. AUTOTHROTTLE_MAX_DELAY = 60 # ----------- 高并发请求时最大延迟时间
  5. # 最底下的几个:是否启用在本地缓存,如果开启会优先读取本地缓存,从而加快爬取速度,视情况而定
  6. HTTPCACHE_ENABLED = True
  7. HTTPCACHE_EXPIRATION_SECS = 0
  8. HTTPCACHE_DIR = 'httpcache'
  9. HTTPCACHE_IGNORE_HTTP_CODES = []
  10. HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
  11. # 以上几个可以视项目需要开启,但是有两个参数最好每次都开启,而每次都是项目文件手动开启不免有些麻烦,最好是项目创建后就自动开启
  12. # DEFAULT_REQUEST_HEADERS = {
  13. # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  14. # 'Accept-Language': 'en',
  15. # 这个是浏览器请求头,很多网站都会检查客户端的headers,比如豆瓣就是每一个请求都检查headers的user_agent,否则只会返回403,可以开启
  16. #USER_AGENT = 'Chirco (+http://www.yourdomain.com)'
  17. # 这个是至关重要的,大部分服务器在请求快了会首先检查User_Agent,而scrapy默认的浏览器头是scrapy1.1 我们需要开启并且修改成浏览器头,如:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1
  18. # 解开注释
  19. ITEM_PIPELINES = {
  20. # 300 表示权重 越小优先级越高
  21. 'DemoPro.pipelines.DemoproPipeline': 300,
  22. }
  23. # 只打印 错误信息
  24. LOG_LEVEL = 'ERROR'
  25. LOG_FILE = 'log.txt'

五大核心组件:

  1. 引擎 ** (Scrapy)

    用来处理整个系统的数据流处理(分发),
    *触发事务
    (框架核心*)*
  2. 调度器 (Scheduler)

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

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

    爬虫是主要干活的,
    用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)用户也可以从中提取出链接,让* *Scrapy继续抓取下一个页面**, 产生url 解析数据
  5. 管道 ** (Pipeline)

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

请求流程:

spider -> 引擎 -> 调度器(去重,调度器) -> 引擎 -> 下载器 -> 网络 -> 下载器 -> 引擎 -> spider ->管道

爬虫文件:

  1. class DemoSpider(scrapy.Spider):
  2. name = 'demo' # 爬蟲文件的名称
  3. # 允许的域名
  4. # allowed_domains = ['www.xxx.com']
  5. # 起始的 url 列表
  6. start_urls = ['https://www.qiushibaike.com/text/']
  7. # 请求成功的 回调函数 实现数据解析
  8. def parse(self, response):
  9. response.body # 获取二进制数据 同 requests 中的 content
  10. response.text # 获取响应的 数据
  11. response.xpath() # 直接使用 xpath 函数
  12. # 只能取出一个 元素
  13. author = div.xpath('./div/a[2]/h2/text()').extract_first()
  14. # 返回的列表元素时一个 selector 对象
  15. content = div.xpath('./a[1]//text()').extract()
  1. 基于终端指令的的 存储 scrapy crawl demo -o qiubai.csv

基于管道的永久存储

  1. 进行数据解析(author content)
  2. 在item类中定义相关的属性
  3. 在parse方法中实例化一个item类型的对象
  4. 将解析到的数据存储到item类型的对象中
  5. 使用yiled item将item对象提交给管道
  6. 在管道文件的process_item方法中接收item且对item中存储数据进行持久化存储
  7. 在settings配置文件中开启管道
  • settings 配置

    1. USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    2. # Obey robots.txt rules
    3. ROBOTSTXT_OBEY = False
    4. # 解开注释
    5. ITEM_PIPELINES = {
    6. # 300 表示权重 越小优先级越高
    7. 'DemoPro.pipelines.DemoproPipeline': 300,
    8. }
    9. # 只打印 错误信息
    10. LOG_LEVEL = 'ERROR'
  • 在items.py 文件中

    1. class DemoproItem(scrapy.Item):
    2. # define the fields for your item here like:
    3. # name = scrapy.Field()
    4. # 对应要存储的 元素
    5. author = scrapy.Field()
    6. content = scrapy.Field()
    7. pass
  • 实现 爬虫文件中

    1. import scrapy
    2. from DemoPro.items import DemoproItem
    3. class DemoSpider(scrapy.Spider):
    4. def parse(self, response):
    5. div_list = response.xpath('//div[@id="content-left"]/div')
    6. for div in div_list:
    7. author = div.xpath('./div/a[2]/h2/text()').extract_first()
    8. content = div.xpath('./a[1]/div/span[1]//text()').extract()
    9. content = ' '.join([i.strip() for i in content])
    10. print(author, content)
    11. item = DemoproItem()
    12. # 并且将解析到的数据封装存储到了item类型的对象当中了
    13. item['author'] = author
    14. item['content'] = content
    15. # 向管道提交item类型的对象
    16. yield item

    在管道文件中进行 存储

    • pipeline.py
    1. class DemoproPipeline(object):
    2. fp = None
    3. # 这个方法只执行一次
    4. def open_spider(self, spider):
    5. """ 父类的方法 开启文件句柄 """
    6. self.fp = open('qiubai.txt', 'w', encoding='utf-8')
    7. def process_item(self, item, spider):
    8. author = item['author']
    9. content = item['content']
    10. self.fp.write(author + '\n' + content + '\n')
    11. return item # 返回给了下一个即将被执行的管道类
    12. def close_spider(self, spider):
    13. self.fp.close()

使用mysql 存储

settings 配置

  1. ITEM_PIPELINES = {
  2. 'DemoPro.pipelines.DemoproPipeline': 300,
  3. 'DemoPro.pipelines.MySqlPipeline': 301,
  4. 'DemoPro.pipelines.RedisPipeline': 302,
  5. # ... 注册其他的管道 类 300 为权重 权重小的 先执行
  6. # 可注册使用 mysql redis mongodb .. 数据库
  7. }
  1. class MySqlPipeline(object):
  2. conn = None
  3. cursor = None
  4. def open_spider(self, spider):
  5. self.conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', passwd='', db='spider')
  6. def process_item(self, item, spider):
  7. self.cursor = self.conn.cursor()
  8. try:
  9. self.cursor.execute('insert into data(author, content) values(%s,%s)' % (item["author"], item["content"]))
  10. self.conn.commit()
  11. print(item['author'])
  12. except Exception as e:
  13. print(e, 11111111)
  14. self.conn.rollback()
  15. return item
  16. def close_spider(self, spider):
  17. self.cursor.close()
  18. self.conn.close()

使用redis 存储

  1. class RedisPipeline(object):
  2. conn = None
  3. def open(self, spider):
  4. self.conn = redis.Redis(host='127.0.0.1', port=6379)
  5. def process_item(self, item, spider):
  6. data = {
  7. 'author': item['author'],
  8. 'content': item['content']
  9. }
  10. self.conn.lpush('qiubaiData', data)

Scrapy 框架 安装 五大核心组件 settings 配置 管道存储的更多相关文章

  1. python 全栈开发,Day138(scrapy框架的下载中间件,settings配置)

    昨日内容拾遗 打开昨天写的DianShang项目,查看items.py class AmazonItem(scrapy.Item): name = scrapy.Field() # 商品名 price ...

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

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

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

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

  4. scrapy框架安装配置

    scrapy框架 scrapy安装(win) 1.pip insatll wheel 2.下载合适的版本的twisted:http://www.lfd.uci.edu/~gohlke/pythonli ...

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

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

  6. Scrapy框架安装配置小结

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

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

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

  8. Scrapy 框架 安装

    Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...

  9. scrapy框架安装及使用

    一.Windows安装 Twisted下载及安装 在https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应的Twisted的版本文件 在命令行进入到Twist ...

随机推荐

  1. HbuilderX 常用快捷键

    最新2019.3.30版本已经添加idea的快捷键,就不需要再额外记住HbuilderX的快捷键啦~ 链接 输入a,按下tab 加粗 ctrl+B 换行 需要换行的那一行后面加2个空格(或者按下tab ...

  2. js 数据类型具体分析

            复习 点运算符 xxx.sss xxx是对象  sss是属性和方法.任何数据类型都是拥有属性和方法的.字符串 String var st=“hello world”.字符串的定义    ...

  3. linux中make的用法

    一.linux中make的用法 目的:       基本掌握了make 的用法,能在Linux系统上编程.环境:       Linux系统准备:       准备三个文件:file1.c, file ...

  4. 兼容发布&小流量概述

    背景 re消息limit上线之前有这样的问题: 1.存量用户,会感知到新功能: 2.后端.前端上线间隔期间,如果没做兼容,涉及到接口数据格式变更,会导致C端拉取数据报错: 3.改模板配置,会导致老信息 ...

  5. Java中单例实现

    1:.经典懒汉: 代码如下: package org.pine.test; public class Person { private String name; private int age; pu ...

  6. crontab 配置文件

    1.系统配置文件 etc/crontab 2.vim打开crontab 以上配置解释 1. 代表用bash去执行shell command line2.代表crontab 默认的环境变量3.cront ...

  7. es6 语法 (set 和 map)

    { let list = new Set(); list.add(5); list.add(7); console.log('size', list, list.size); //{5, 7} 2 } ...

  8. Vue2+VueRouter2+webpack 构建项目实战(五):配置子路由

    前言 通过前面几章的实战,我们已经顺利的构建项目,并且从API接口获取到数据并且渲染出来了.制作更多的页面,更复杂的应用,就是各位自己根据自己的项目去调整的事情了. 本章讲一下如何配置子路由,因为我们 ...

  9. IntelliJ IDEA 编译Java程序出现 'Error:java: 无效的源发行版: 9' 的解决方案

    最新安装的IntelliJ IDEA 2018.1编译器,创建Java Project,并选择之前安装好的Eclipse配置的JDK,如图所示: 在工程中添加 Main.class, main函数中写 ...

  10. Openlayer3之C++接口在javaScript的封装使用

    0.写在前面: 1)涉及的关键词定义: 传入:JavaScript向CAPI传值 传出:CAPI向JavaScript传值 2)关于类和结构体的封装,需要严格执行内存对齐,以防止读取越界,但是避免不了 ...