MOOC_北理_Python爬虫学习_7(Scrapy库)

框架介绍:

Scrapy不是一个函数功能库,而是一个爬虫框架。

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

5+2模块。构成scrapy框架。
3条主要数据流路径:

  1. SPIDERS --(获得爬取请求,request,一个url)–> ENGINE --> SCHEDULER(负责对爬取请求进行调度)

  2. SCHEDULE --(获得下一个爬取的网络请求)–> ENGINE --(通过中间键发送给下一个模块)–> DOWNLOADER(链接互联网,爬取相关网页,爬取的内容形成response对象)–(中间键)–>ENGINE --(中间键)–>SPIDERS

  3. SPIDER (处理从DOWNLOADER获得的相应,产生两个数据类型,一个是ITEM,一个是REQUEST(新的爬取请求,下次爬取))–> ENGINE --(将ITEM发给前者,REQUEST给后者)–> ITEM PIPELINES & SCHEDULER

ENGINE SCHEDULER DOWNLOADER 都是无需人工操作,是已有的功能的模块。用户只需编写SPIDERS(url链接和解析网页内容)ITEM PIPELINES(提取的信息处理)

框架解析:

ENGINE 所有模块的核心,控制所有模块之间的数据流。根据条件触发事件。
DOWNLOADER 根据请求下载网页。
SCHEDULER 对所有爬取请求进行调度管理。
中间键(Downloader Middleware ):实施Engine、Scheduler、Downloader之间进行用户可配置的控制。可以修改、丢弃、新增请求或相应
SPIDER: 解析Downloader返回的相应(response),提供最初始的url。对每次爬取的内容进行解析,产生新的爬取请求,并从内容中提取相关数据。
ITEM PIPELINES:流水线方式处理,产生对网页爬取后的信息。
中间键(Spider Middleware):对请求和爬取项的再处理。修改、丢弃、新增请求或爬取项。

常用命令:

命令行:scrapy [options] [args]主要在里实现。

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

爬虫步骤:
1. 建立爬虫框架

scrapy startproject python123demo

会产生一个python123demo/的外层目录。

  • 一个scrapy.cfg (部署Scrapy爬虫的配置文件)相当于把爬虫放到相应的服务器,并配置好服务器的相关接口(有点复杂,不是很懂)
  • python123demo/ Scrapy框架对应文件所包含的目录。
    • __init__.py : 初始化脚本
    • items.py: Item代码模板(继承类)
    • middlewares.py:Middleware代码模板(继承类)
    • pipelines.py:pipelines代码模板(继承类)
    • settings.py:scrapy爬虫的配置文件
    • spiders/:Spiders代码模板目录(继承类)存放pyhon123demo工程所建立的爬虫。
      • __init__.py:初始文件,无需修改。
      • __pycache__/:缓存目录,无需修改。

2. 生成scrapy爬虫:
执行命令–>给出爬虫名字,爬取网站。
利用genspider生成爬虫:

cd python123demo
scrapy genspider demo python123.io

在spiders目录下增加了一个demo.py(也可以不用命令生成,手动也可以。)
demo.py文件中的内容如下:(注释部分自己加的)

# -*- coding: utf-8 -*-
import scrapy


class DemoSpider(scrapy.Spider):    #面向对象编写的一个类,叫DemoSpider。这个类必须是继承scrapy.Spider的子类。
    name = 'demo'   #当前爬虫名字叫demo
    allowed_domains = ['python123.io']      #刚开始提交的域名。只能爬取这个域名以下的相关链接。
    start_urls = ['http://python123.io/']       #以列表包含的一个或多个url是爬虫要爬取的初始页面。

    def parse(self, response):      #解析页面的空的方法。
        pass                        #parse()用于处理相应,解析内容形成字典,发现新的url爬取请求。

3. 配置产生的spider爬虫。
并没有听懂这段的内容,,代码不知道啥意思。python下面的东西还没学通,先把代码copy下来以后慢慢理解。

import scrapy


class DemoSpider(scrapy.Spider):    #面向对象编写的一个类,叫DemoSpider。这个类必须是继承scrapy.Spider的子类。
    name = 'demo'   #当前爬虫名字叫demo
    #allowed_domains = ['python123.io']      #刚开始提交的域名。只能爬取这个域名以下的相关链接。
    start_urls = ['http://python123.io/ws/demo.html']       #以列表包含的一个或多个url是爬虫要爬取的初始页面。

    def parse(self, response):      #解析页面的空的方法。
        fname = response.url.split('/')[-1]                        #parse()用于处理相应,解析内容形成字典,发现新的url爬取请求。
        with open(fname,'wb') as f:
        	f.write(response.body)
        self.log('Saved file %s.'% name)

4. 运行爬虫。
在命令行中输入scrapy crawl demo即可运行。
文件被存储在demo/文件中。


上面配置产生爬虫的代码为简化代码。完整代码中用到了yield关键字
yield – 生成器:不断产生值的函数。生成器每次产生一个值,然后函数被冻结,直到被唤醒后再产生一个值。
生成器的使用一般与循环搭配一起。

def gen(n)for i in range(n)yield i**2

for i in gen(5):	#每次for都会把gen唤醒一次。
	print(i,' ', end = '')

0  1  4  9  16  

生成器写法的好处:

  1. 节省存储空间。
  2. 更快的响应速度。
  3. 使用更加灵活。

点击这里又更详细描述。(别人的博客。)

完整写法:

import scrapy


class DemoSpider(scrapy.Spider):   
    name = 'demo'   
    
    def start_requests(self):
        urls = ['http://python123.io/ws/demo.html']
        for url in urls:
            yield scrapy.Request(url = url, callback = self.parse)    

    def parse(self, response):      
        fname = response.url.split('/')[-1]                        
        with open(fname,'wb') as f:
            f.write(response.body)
        self.log('Saved file %s.'% name)

基本使用:

  1. 创建一个工程和spider模板。
  2. 编写Spider
  3. 编写 Item Pipeline
  4. 优化配置策略。

涉及 Request类,Response类,Item类。
Request类: Request对象表示一个HTTP请求。由spider生成,由downloader执行。具体属性或方法:

属性或方法 说明
.url Request对应的请求URL地址
.method 对应的请求方法,‘GET’ ‘POST’ 等
.headers 字典类型风格的请求头
.body 请求内容主题,字符串类型
.meta 用户添加的扩展信息,在Scrapy内部模块间传递信息使用
.copy() 复制该请求

Response类: Response对象表示一个HTTP相应。由Downloader生成由Spider处理。具体属性或方法:

属性或方法 说明
.url Response对应的url地址
.status HTTP状态码,默认是200
.headers Response对应的头部信息
.body Response对应的内容信息,字符串类型
.flags 一组标记
.request 产生Response类型对应的Request对象
.copy() 复制该相应

Item类: Item对象表示一个从HTML页面中提取的信息内容。由Spider生成,Item Pipline处理。Item类似字典类型,可以按照字典类型操作。


CSS Selector 的基本使用:

<HTML>.css('a::attr(href)').extract()
a 是标签名称。    href是标签属性。

感觉学了这么多这节没学进去啥。。基础太弱。还要继续。。自学完pythoncrash后再回头看看。。。

你可能感兴趣的:(MOOC_北理_Python爬虫学习_7(Scrapy库))