scrapy框架

简介:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。

  • 环境安装:

    • mac、linux:

      • pip install scrapy
    • windows:
      • pip3 install wheel
      • 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
      • 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
        • Twisted:就是一个异步的架构,被作用在了scrapy中
        • 安装报错:需要更换另一个版本的twisted文件进行安装即可
      • pip3 install pywin32
      • pip3 install scrapy
      • 安装完成后在cmd中输入scrapy回车,如果没有报错就说明安装成功

scrapy的基本使用

创建一个爬虫工程:scrapy startproject proName
进入工程目录创建爬虫源文件:scrapy genspider spiderName www.xxx.com
执行工程:scrapy crawl spiderName

创建一个工程

  • scrapy startproject proName

    - 目录结构

    • scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
    • items.py 设置数据存储模板,用于结构化数据,如:Django的Model
    • pipelines 数据持久化处理
    • settings.py 配置文件,如:递归的层数、并发数,延迟下载等
    • spiders 爬虫目录,如:创建文件,编写爬虫解析规则

进入工程目录创建爬虫源文件

  • scrapy genspider spiderName www.xxx.com

对爬虫源文件编写相应的代码

执行工程

  • scrapy crawl spiderName
  • 执行工程后,默认会输出工程所有的日志信息

修改工程的配置文件settings.py

  • 我们可以指定类型日志的输出

    • 在settings.py中加入 LOG_LEVEL = ‘ERROR’
    • 禁止robots
    • UA 伪装

爬虫文件spiderName内容阐述:

import scrapyclass GpcSpider(scrapy.Spider):# 爬虫文件的名称,当前源文件的唯一标识name = 'gpc'# allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
#    allowed_domains = ['www.xxx.com'] #我们一般给注释掉# start_urls起始url列表只可以存储url#作用:列表中存储的url都会被进行get请求的发送start_urls = ['https://www.baidu.com/','https://www.sogou.com']# 数据解析#parse方法调用的次数取决于start_urls请求的次数#参数response:表示的就是服务器返回的响应对象def parse(self, response):pass

scrapy数据解析

  • 使用:response.xpath(“xpath表达式解析数据”)
  • scrapy封装的xpath和etree中的区别
    • scrapy中的xpath直接将定位到的标签中存储的值或者属性值取出,返回的是Selector对象,且相关的数据值是存储在Selector对象的data中,需要调用extract(),extract_first()取出字符串数据

爬虫源文件代码如下

import scrapyclass GpcSpider(scrapy.Spider):# 爬虫文件的名称,当前源文件的唯一标识name = 'gpc'# allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
#    allowed_domains = ['www.xxx.com'] #我们一般给注释掉# start_urls起始url列表只可以存储url#作用:列表中存储的url都会被进行get请求的发送start_urls = ['https://duanziwang.com/category/经典段子/']# 数据解析#parse方法调用的次数取决于start_urls请求的次数#参数response:表示的就是服务器返回的响应对象def parse(self, response):# 数据解析名称和内容article_list = response.xpath('//*[@id="35087"]')for article in article_list:# scrapy的xpath和etree中xpath使用方式不同# xpath返回的列表中存储是Selector对象,说明我们想要的字符串数据被存储在了该对象的data属性中#extract()就是将data属性值取出#   调用extract_first() 将列表中第一个列表元素表示的Selector对象中的data值取出#title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract_first()#content = article.xpath("//div[@class='post-content']/p/text()").extract_first()#   直接调用extract(),可以将列表中的每一个列表元素取出title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract()content = article.xpath("//div[@class='post-content']/p/text()").extract()# 将Selector对象data属性值取出print(title,content)

持久化存储

基于终端指令持久化存储

  • 该种方式只可以将parse方法的返回值存储到本地指定后缀的文本文件中

  • 执行指令:scrapy crawl spiderName -o filePath

    • 代码如下:
import scrapyclass GpcSpider(scrapy.Spider):# 爬虫文件的名称,当前源文件的唯一标识name = 'gpc'# allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
#    allowed_domains = ['www.xxx.com'] #我们一般给注释掉# start_urls起始url列表只可以存储url#作用:列表中存储的url都会被进行get请求的发送start_urls = ['https://duanziwang.com/category/经典段子/']# 数据解析#parse方法调用的次数取决于start_urls请求的次数#参数response:表示的就是服务器返回的响应对象# 基于终端指令的持久化存储def parse(self, response):all_data = []# 数据解析名称和内容article_list = response.xpath('//*[@id="35087"]')for article in article_list:# 我们可以看见解析出来的内容不是字符串数据,说明和etree中xpath使用方式不同# xpath返回的列表中存储是Selector对象,说明我们想要的字符串数据被存储在了该对象的data属性中#extract()就是将data属性值取出#   调用extract_first() 将列表中第一个列表元素表示的Selector对象中的data值取出#title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract_first()#content = article.xpath("//div[@class='post-content']/p/text()").extract_first()#   直接调用extract(),可以将列表中的每一个列表元素取出title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract()content = article.xpath("//div[@class='post-content']/p/text()").extract()# 将Selector对象data属性值取出print(title,content)dic = {"title":title,"content":content}all_data.append(dic)return all_data

基于管道的持久化存储(重点)

1,在爬虫文件中进行数据解析

2,在items.py中定义相关属性

3,在爬虫文件中将解析到的数据存储封装到 item类型的对象中

4,将item类型的对象提交给管道

5,在管道文件(pipelines.py)中,接受爬虫文件提交过来的item类型对象,且对其进行任意形式的持久化存储

6,在配置文件中开启管道机制

7,展示一(extract_first())

import scrapy
from gemoumou.items import GemoumouItemclass GpcSpider(scrapy.Spider):# 爬虫文件的名称,当前源文件的唯一标识name = 'gpc'# allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
#    allowed_domains = ['www.xxx.com'] #我们一般给注释掉# start_urls起始url列表只可以存储url#作用:列表中存储的url都会被进行get请求的发送start_urls = ['https://duanziwang.com/category/经典段子/']# 数据解析#parse方法调用的次数取决于start_urls请求的次数#参数response:表示的就是服务器返回的响应对象# 基于管道的持久化存储def parse(self, response):# 数据解析名称和内容article_list = response.xpath('//*[@id="35087"]')for article in article_list:# 我们可以看见解析出来的内容不是字符串数据,说明和etree中xpath使用方式不同# xpath返回的列表中存储是Selector对象,说明我们想要的字符串数据被存储在了该对象的data属性中# extract()就是将data属性值取出#   直接调用extract(),可以将列表中的每一个列表元素取出title = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()").extract_first()content = article.xpath("//div[@class='post-content']/p/text()").extract_first()# 实例化一个item类型的对象,将解析到的数据存储到该对象中item = GemoumouItem()# 不能使用item. 来调用数据item['title'] = titleitem['content'] = content# 将item对象提交给管道yield item

8,展示二(extract())


import scrapy
from gemoumou.items import GemoumouItemclass GpcSpider(scrapy.Spider):# 爬虫文件的名称,当前源文件的唯一标识name = 'gpc'# allowed_domains表示允许的域名,用来限定start_urls那些url可以发请求那些不能
#    allowed_domains = ['www.xxx.com'] #我们一般给注释掉# start_urls起始url列表只可以存储url#作用:列表中存储的url都会被进行get请求的发送start_urls = ['https://duanziwang.com/category/经典段子/']# 数据解析#parse方法调用的次数取决于start_urls请求的次数#参数response:表示的就是服务器返回的响应对象# 基于管道的持久化存储def parse(self, response):# 数据解析名称和内容article_list = response.xpath('//*[@id="35087"]')for article in article_list:# 我们可以看见解析出来的内容不是字符串数据,说明和etree中xpath使用方式不同# xpath返回的列表中存储是Selector对象,说明我们想要的字符串数据被存储在了该对象的data属性中# extract()就是将data属性值取出#   直接调用extract(),可以将列表中的每一个列表元素取出title_content_list = article.xpath("//div[@class='post-head']/h1[@class='post-title']/a/text()  | //div[@class='post-content']/p/text()").extract()# 实例化一个item类型的对象,将解析到的数据存储到该对象中item = GemoumouItem()for title_content in title_content_list:# 不能使用item. 来调用数据item['title_content'] = title_content# 将item对象提交给管道yield item

14-爬虫之scrapy框架的基本使用01相关推荐

  1. 14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容

    python爬虫--基于scrapy框架爬取糗事百科上的段子内容 1.需求 2.分析及实现 3.实现效果 4.进行持久化存储 (1)基于终端指令 (2)基于管道 [前置知识]python爬虫--scr ...

  2. python爬虫之Scrapy框架的post请求和核心组件的工作 流程

    python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...

  3. scrapy获取a标签的连接_python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求[前期准备] 2.分析及代码实现(1)获取五大板块详情页url(2)解析每个板块(3)解析每个模块里的标题中详情页信息 点击此处,获取 ...

  4. Python爬虫之scrapy框架360全网图片爬取

    Python爬虫之scrapy框架360全网图片爬取 在这里先祝贺大家程序员节快乐,在此我也有一个好消息送给大家,本人已开通了微信公众号,我会把资源放在公众号上,还请大家小手动一动,关注过微信公众号, ...

  5. Python爬虫之Scrapy框架爬虫实战

    Python爬虫中Scrapy框架应用非常广泛,经常被人用于属于挖掘.检测以及自动化测试类项目,为啥说Scrapy框架作为半成品我们又该如何利用好呢 ?下面的实战案例值得大家看看. 目录: 1.Scr ...

  6. 19. python爬虫——基于scrapy框架爬取网易新闻内容

    python爬虫--基于scrapy框架爬取网易新闻内容 1.需求 [前期准备] 2.分析及代码实现 (1)获取五大板块详情页url (2)解析每个板块 (3)解析每个模块里的标题中详情页信息 1.需 ...

  7. Python3爬虫之Scrapy框架的下载器中间件

    Python爬虫之Scrapy框架的下载器中间件 基本介绍 下载器中间键可以为我们设置多个代理ip与请求头,达到反反爬虫的目的 下面是scrapy为我们创建好的中间件的类 下面是中间件中的下载器函数, ...

  8. python爬虫——用Scrapy框架爬取阳光电影的所有电影

    python爬虫--用Scrapy框架爬取阳光电影的所有电影 1.附上效果图 2.阳光电影网址http://www.ygdy8.net/index.html 3.先写好开始的网址 name = 'yg ...

  9. 爬虫之Scrapy框架爬取彼岸壁纸案例分享

    爬虫之Scrapy框架爬取彼岸壁纸案例分享 前段时间在网上看到有人爬取了彼岸壁纸的案例,由于爬取的图片较多,爬取速度感觉不快,所以就自己写了个Scrapy框架,个人觉得爬取速度快多了. 代码如下. 文 ...

  10. 爬虫之scrapy框架的数据持久化存储/保存为scv,json文件

    文章目录 前情回顾 selenium+phantomjs/chrome/firefox execjs模块使用 今日笔记 scrapy框架 小试牛刀 猫眼电影案例 知识点汇总 数据持久化存储(MySQL ...

最新文章

  1. 用ASP实现在线压缩与解压缩
  2. 青岛西海岸新区将建大数据交易中心
  3. poj 1830 开关问题
  4. 罗马书1:18-32
  5. mysql导入报编码错误问题解决
  6. rabbitmq配置文件_RabbitMQ学习
  7. PHP fuser,打印机提示 50.1 fuser error 这样的错误,无法正常打印?
  8. 冠军方案解读 | nnUNet改进提升笔记
  9. 冯诺依曼结构和现代计算机结构模型
  10. 在Java中构建响应式微服务系统——第三章 构建响应式微服务
  11. [渝粤教育] 天津科技大学 化工开发与创新实验 参考 资料
  12. 基于2D-3D直线对应关系的单目摄像机定位
  13. 要在textarea文本框中粘贴图片怎么办?
  14. zynq7035单板创建PYNQ镜像V2.6
  15. python opencv 读取USB摄像头的像素问题
  16. 图片添加水印的方法,这个真的很实用!
  17. 人工智能对话系统在VUI和GUI结合下对于控件调用的调研报告
  18. k8s挂载nfs创建pv
  19. java实现高清不失真图片压缩
  20. QT学习笔记--QMainWindow菜单栏、工具栏

热门文章

  1. python和对象复习_面向对象阶段复习
  2. 对于PHP框架的简单认识
  3. sts在文件夹中显示_工作中很多问题,巧用Windows 10任务栏,几分钟快速解决
  4. java多线程遇到的问题_关于Java多线程遇到的问题.
  5. java存储过程与sql语句_存储过程与SQL语句怎么选择
  6. 点到直线的投影公式_2021高考复习资料:高中数学必备公式与知识点汇总
  7. python利用递归函数实现斐波那契数列_Python递归及斐波那契数列
  8. selenium:使用已打开的chrome浏览器
  9. 【maven插件】asciidoctor-maven-plugin:编译Asciidoc
  10. c语言程序设计 在线课程设计,c语言程序设计 本科课程设计