程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(3)

Python旅途遇到游乐园——爬虫入门 ( 四 )

发布于2020-02-24 23:00     阅读(1038)     评论(0)     点赞(3)     收藏(3)


即使有了两次经验,还是遏制不住我的憨:安装Scrapy这边请

今天来看Scrapy Scrapy爬虫框架

Scrapy爬虫框架

Scrapy是一个功能强大且迅捷的网络爬虫框架
要注意喽,scrapy不是一个函数功能库,而是一个爬虫框架

  • 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合
  • 爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫

Scrapy爬虫框架的 " 5+2 " 结构

在这里插入图片描述
在Scrapy爬虫框架中,Engine EngineSchduler SchdulerDownloader Downloader已经完成,
用户需要自主编写Spider SpiderItem Pipelines Item\ Pipelines

Engine Engine
  • 控制所有模块之间的数据流,可以根据条件触发事件
  • 不需要用户修改
Downloader Downloader
  • 根据请求下载网页
  • 不需要用户修改

Scheduler Scheduler

  • 对所有爬取请求进行调度管理
  • 不需要用户修改
DownloaderMiddleware Downloader Middleware
  • 目的:实施Engine,Schedule和Downloader之间进行用户可配置的控制
  • 功能:修改,丢弃,新增请求或响应
  • 用户可以编写配置代码
Spider Spider
  • 解析Downloader返回的响应(Response)
  • 产生爬取项(scrapy item)
  • 产生额外的爬取请求(Request)
  • 需要用户编写配置代码
Item Pipelines Item\ Pipelines
  • 以流水线方式处理Spider产生的爬取项
  • 由一组操作顺序组成,类似一个流水线,每个操作是一个Item Pipeline类型
  • 可能操作包括:清理,检验和查看爬取项中的HTML数据,将数据存储到数据库中
  • 需要用户编写配置代码
Scrapy Middleware Scrapy\ Middleware
  • 目的:对请求和爬取项的再处理
  • 功能:修改,丢弃,新增请求或爬取项
  • 用户可以编写配置代码

Request库和Scrapy框架的比较

相同点:

  • 两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
  • 两者可用性都很好,文档丰富,入门简单
  • 两者都没有处理js,提交表单,应对验证码等功能(可扩展)

不同点:

Requests Scrapy
页面级爬虫 网站级爬虫
功能库 框架
并发性考虑不足,性能较差 并发性好,性能较高
重点在于页面下载 重点在于爬虫结构
定制灵活 一般定制灵活,深度定制困难
入门简单 入门稍难

技术路线选取准则:

  • 非常小的需求 —— Requests库
  • 较大的需求 —— Scrapy框架
  • 定制程度很高的需求(不考虑规模),自搭框架 —— Requests>Scrapy

Scrapy框架的常用命令

Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行

  • 命令行(不是图形界面)更容易自动化,适合脚本控制
  • 本质上,Scrapy是给程序员用的,功能(而不是界面)更重要

Scrapy命令行格式:
>scrapy<command>[options] [args] >scrapy<command>[options]\ [args]

命令 说明 格式
startproject 创建一个新工程 scrapy startproject < name > [dir]
genspider 创建一个爬虫 scrapy genspider [options] < name > < domain >
settings 获得爬虫配置信息 scrapy settings [options]
crawl 运行一个爬虫 scrapy crawl < spider >
list 列出工程中的所有爬虫 scrapy list
shell 启动URL调试命令行 scrapy shell [url]

Scrapy爬虫的一个实例

C_T丢给你一个链接,如果不太明白就请教前辈吧~
在这个实例中,我们还是访问这个网站:http://python123.io/

步骤一:建立一个Scrapy爬虫工程

在你觉得舒服的路径下新建一个文件夹,在该文件夹下输入cmd指令

scrapy startproject python123demo
  • 1

之后我们就可以在对应的路径下看到新项目文件了
在这里插入图片描述

python123demo/      ----> 外层目录
    scrapy.cfg          ----> 部署Scrapy爬虫的配置文件
    python123demo/      ----> Scrapy框架的用户自定义Python代码
        __init__.py         ----> 初始化脚本
        items.py            ----> Items代码模板(继承类)
        middlewares.py      ----> Middlewares代码模板(继承类)
        pipelines.py        ----> Pipielines代码模板(继承类)
        settings.py         ----> Scrapy爬虫的配置文件
        spiders/            ----> Spiders代码模板目录(继承类)
            __init__.py         ----> 初始文件,无需修改
            __pycache__/        ----> 缓存目录,无需修改
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

步骤二:在工程中产生一个Scrapy爬虫

python123demo> scrapy genspider demo python123.io
  • 1

这条命令的作用是生成一个名叫demo的Spider
打开spider文件夹中的demo.py查看一下:

# demo.py
# -*- coding: utf-8 -*-
import scrapy

class DemoSpider(scrapy.Spider):
    name = 'demo'
    allowed_domains = ['python123.io']
    start_urls = ['http://python123.io/']

    def parse(self, response):
        pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

parse()用于处理响应,解析内容形成字典,发现新的URL爬取请求,需要我们自己编写

步骤三:配置产生的Spider爬虫

修改demo.py:

# demo.py
# -*- coding: utf-8 -*-
import scrapy

class DemoSpider(scrapy.Spider):
    name = 'demo'
    start_urls = ['http://python123.io/ws/demo.html']

    def parse(self, response):
        fname = response.url.split('/')[-1]
        with open(fname , 'wb') as f:
              f.write(response.body)
        self.log('Saved file %s.' % fname)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

步骤四:运行爬虫,获取网页

python123demo> scrapy crawl demo
  • 1

yield关键字

yield yield⬅➡生成器

  • 生成器是一个不断产生值的函数
  • 包含yield语句的函数是一个生成器
  • 生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值

生成器写法:

def square(n):
	for i in range(n):
		yield i**2
  • 1
  • 2
  • 3

在调用square函数时,当程序运行到yield语句,程序会被冻结,yield语句这一行得到的值会被返回出来

生成器和循环是最好搭档:

def square(n):
	for i in range(n):
		yield i**2
for i in square(5):
	print(i," ",end="")
	
### Output
0  1  4  9  16 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上面是生成器写法,而普通写法是这样的:

def square(n):
	ls = [i**2 for i in range(n)]
	return ls
for i in square(5):
	print(i," ",end="")

### Output	
0  1  4  9  16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
Q. 为何要有生成器?
A. 生成器相比一次列出所有内容有很大优势:
  • 更节省存储空间
  • 响应更迅速
  • 使用更灵活

Scrapy爬虫的基本使用

Scrapy爬虫的使用步骤

步骤一:创建一个工程和Spider模板
步骤二:编写Spider
步骤三:编写Item Pipelines
步骤四:优化配置

Scrapy爬虫的数据类型

Request类:向网络提交请求的内容
Response类:从网络上爬取内容的封装类
Item类:由Spider产生的信息的封装类


Request Request类
class scrapy.http.Request() class\ scrapy.http.Request()

  • Request对象表示一个HTTP请求
  • 由Spider生成,由Downloader执行
属性或方法 说明
.url Request对应的请求URL地址
.method 对应的请求方法,’ GET ’ ’ POST ’ 等
.headers 字典类型风格的请求头
.body 请求内容主体,字符串类型
.meta 用户添加的扩展信息,在Scrapy内部模块见传递信息使用
.copy() 复制该请求

Response Response类
class scrapy.http.Response() class\ scrapy.http.Response()

  • Response对象表示一个HTTP响应
  • 由Downloader生成,由Spider处理
属性或方法 说明
.url Response对应的请求URL地址
.status HTTP状态码,默认是200
.headers Response对应的头部信息
.body Response对应的内容信息,字符串类型
.flags 一组标记
.request 产生Response类型对应的Request对象
.copy() 复制该响应

Item Item类
class scrapy.item.Item() class\ scrapy.item.Item()

  • Item对象表示一个从HTML页面中提取的信息内容
  • 由Spider生成,由Item Pipelines处理
  • Item类似字典类型,可以支持字典类型操作

Scrapy爬虫提取信息的方法

Scrapy爬虫支持多种HTML信息提取方法

  • Beautiful Soup
  • lxml(lxml lxml
  • re
  • Xpath Selector
  • CSS Selector
发布了958 篇原创文章 · 获赞 212 · 访问量 33万+


所属网站分类: 技术文章 > 博客

作者:mimi

链接:https://www.pythonheidong.com/blog/article/232717/4d77d28d4e3d549e9f26/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)