您当前的位置:网站首页>兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利

兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利

2019-04-07 00:44:00 投稿作者:admin 围观人数:169 评论人数:0次
每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程)

1. Scrapy简介


Scrapy是一个为了爬取网站数据,提取结构性数据而编写的运用结构。 能够运用在包括数据发掘,信息处理或存储历史数据等一系列的程序中。

其开始是为了页面抓取 (更切当来说, 网络抓取 )所规划的, 也能够运用在获取API所回来的数据(例如 Amazon Associates Web Services ) 或许通用的网络爬虫。Scrapy用处广泛,能够用于数据发掘、监测和自动化测验

Scrapy 运用了 Twisted异步网络库来处理网络通讯。全体架构大致如下

每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程)

Scrapy

Scrapy首要包括了以下组件:

  • 引擎(Scrapy): 用来处理整个体系的数据流处理, 触发业务(结构中心)
  • 调度器(Scheduler): 用来承受引擎发过来的恳求, 压入行列中, 并在引擎再次恳求的时分回来. 能够想像成一个URL(抓取网页的网址或许说是链接)的优先行列, 由它来决议下一个要抓取的网址是什么, 一起去除重复的网址
  • 下载器(Downloader): 用于下载网页内容, 并将网页内容回来给蜘蛛(Scrapy下载器是树立在twisted这个高效的异步模型上的)
  • 爬虫(Spiders): 爬虫是首要干活的, 用于从特定的网页中提取自己需求的信息, 即所谓的实体(Item)。用户也能够从中提取出链接,让Scrapy持续抓取下一个页面
  • 项目管道(Pipeline): 担任处理爬虫从网页中抽取的实体,首要的功用是耐久化实体、验证实体的有效性、铲除不需求的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次第处理数据。
  • 下载器中间件(Downloader Middlewares): 坐落Scrapy引擎和下载器之间的结构,首要是处理Scrapy引擎与下载器之间的恳求及呼应。
  • 爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的结构,首要作业是处理蜘蛛的呼应输入和恳求输出。
  • 调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的恳求和呼应。

Scrapy运转流程大约如下:

  1. 首要,引擎从调度器中取出一个链接(URL)用于接下来的抓取
  2. 引擎把URL封装成一个恳求(Request)传给下载器,下载器把资源下载下来,并封装成应对包(Respon黄油是什么油se)
  3. 然后,爬虫解析Response
  4. 若是解分出实体(Item),则交给实体管道进行进一步的处理。
  5. 若是解分出的是链接(URL),则把URL交给Scheduler等候抓取

2. 装置Scrapy


运用以下指令:

sudo pip install virtualenv #装置虚拟环境东西
virtualenv ENV #创立一个虚拟环境目录
source ./ENV/bin/active #琅岐红鲟节激活虚拟环境
pip install Scrapy
#验证是否装置成功
pip list
#输出如下
cffi (0.8.6)
cryptography (0.6.1)
cssselect (0.9.1)
lxml (3.4.1)
pip (1.5.6)
pycparser (2.10)
pyOpenSSL (0.14)
queuelib (1.2.2)
Scrapy (0.24.4)
setuptools (3.6)
six (1.8.0)
Twisted (14.0.2)
w3lib (1.10.0)
wsgiref (0.1.2)
zope.interface (4.1.1)

更多虚拟环境的操作能够查看我的博文

3. Scrapy Tutorial


在抓取之前, 你需求新建一个Scrapy工程. 进入一个你想用来保存代码的目录,然后履行:

$ scrapy startproject tutorial

这个指令会在当时目录下创立一个新目录 tutorial, 它的结构如下:

.
├── scra大吴哥文娱凶恶漫画py.cfg
└── tutorial
├── __init__.py
├── items.py
├── pipelines.py
├── settings.py
└── spiders
└── __init__.py

这些文件首要是:

  • scrapy.cfg: 项目配置文件
  • tutorial/: 项目python模块, 之后您将在此参加代码
  • tutorial/items.py: 项目items文件
  • tutorial/pipelines.py: 项目管道文件
  • tutorial/settings.py: 项目配置文件
  • tutorial/spiders: 放置spider的目录

3.1. 界说Item

Items是即将装载抓取的数据的容器,它作业办法像 python 里边的朱圣伟字典,但它供给更多的维护,比方对未界说的字段填充以避免拼写错误

经过创立scrapy.Item类, 而且界说类型为 scrapy.Field 的类特点来声明一个Item.

咱们经过将需求的item模型化,来操控从 dmoz.org 取得的站点数据,比方咱们要取得站点的姓名,url 和网站描绘,咱们界说这三种特点的域。在 tutorial 目录下的 items.py 文件修正

from scrapy.item import Item, Field
class DmozItem(Item):
# define the fields for your item here like:
name = Field()
description = Field()
url = Field()

3.2. 编写Spider

Spider 是用户编写的类, 用于从一个域(或域组)中抓取信息, 界说了用于下载的URL的开始列表, 怎么盯梢链接,以及怎么来解析这些网页的内容用于提取items。

要树立一个 Spider,承继 scrapy.Spider 基类,并确认三个首要的、强制的特点:

  • name:爬虫的识别号,它有必要是仅有的,在不同的爬虫中你有必要界说不同的姓名.
  • start_urls:包括了Spider在启动时进行爬取的url列表。因而,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。咱们能够运用正则表达式界说和过滤需求进行跟进的链接。
  • parse():是spider的一个办法。被调用时,每个初始URL完结下载后生成的 Response 目标将会作为仅有的参数传递给该函数。该办法担任解析回来的数据(response data),提取数据(生成item)以及生成需求进一步处理的URL的 Request 目标。
  • 这个办法担任解析回来的数据、匹配抓取的数据(解析为 item )并盯梢更多的 URL。

在 /tutorial/tutorial/spiders 目录下创立 dmoz_spider.py

import scrapy
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)

3.3. 爬取

当时项目结构

├── scrapy.cfg
└── tutorial兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利
├── __init__.py
├── items.py
├── pipelines.py动感单车
├── settings.py
└── spiders
├── __init__.py
└── dmoz_spider.py

到项目根目录, 然后运转指令:

$ scrapy crawl dmoz草帽姐

运转结泱泱果:

2014-12-15 09:30:59+0800 [scrapy] INFO: Scrapy 0.24.4 started (bot: tutorial)
2014-12-15 09:30:59+0800 [scrapy] INFO: Optional features available: ssl, http11
2014-12-15 09:30:59+0800 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'tutorial.spiders', 'SPIDER_MODULES': ['和表姐同居的日子tutorial.spiders'], 'BOT_NAME': 'tutorial'}
2014-12-15 09:30:59+0800 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2014-12-15 09:30:59+0800 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionM水稀弥梨iddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2014-12-15 09:30:59+0800 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2014-12-15 09:30:59+0800 [scrapy] INFO: Enabled item pipelines:
2014-12-15 09:30:59+0800 [dmoz] INFO: Spider opened
2014-12-15 09:30:59+0800 [dmoz] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2014-12-15 09:30:59+0800 [scrapy] DEBUG: Telnet console listen斯克提斯之眼ing on 127.0.0.1:6023
2014-12-15 09:30:59+0800 [scrapy] DEBUG: Web service listening on 127.0.0.1:6080
2014-12-15 09:31:00+0800 [dmoz] DEBUG: Crawled (200) (referer: None)
2兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利014-12-15 09:31:00+0800 [dmoz] DEBUG: Crawled (200) (referer: None)
2014-12-15 09:31:00+0800 [dmoz] INFO: Closing spider (finished)
2014-12-15 09:31:00+0800 [dmoz] INFO: 兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利Dumping Scrapy stats:
{'downloader/request_bytes': 516,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
'downloader/response_bytes': 16338,
'downloader/response_count': 2,
'downloader/response_status_count/200': 2,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2014, 12, 15, 1, 31, 0, 666214),
'log_count/DEBUG': 4,
'log_count/INFO': 7,
'response_received_count': 2,
'scheduler/deq旧房改造ueued': 2,
'scheduler/dequeued/memory': 2,
'scheduler/enqueued': 2,
'scheduler/enqueued/memory': 2,
'start_time': date走出你的国际我更孤寂time.datetime(2014, 12, 15, 1, 30, 59, 533207)}
2014-12-15 09:31:00+0800 [dmoz] INFO: Spider closed (finished)

3.4. 提取Items

3.4.1. 介绍Selector

从网页中提取数据有许多办法。Scrapy运用了一种根据 XPath 或许 CSS 表达式机制: Scrapy Selectors

出XPath表达式的比如及对应的意义:

  • /html/head/title: 挑选HTML文档中 标签内的
  • /html/head/title/text(): 挑选
  • //td: 挑选一切的 元素
  • //div[@class="mine"]: 挑选一切具有class="mine" 特点的 div 元素

等多强壮的功用运用能够查看XPath tutorial

为了方便运用 XPaths,Scrapy 供给 Selector 类, 有四种办法 :

  • xpath():回来selectors列表, 每一个selector表明一个xpath参数表达式挑选的节点.
  • css() : 回来selectors列表, 每一个selector表明CSS参数表达式挑选的节点
  • extract():回来一个unicode字符串,该字符串为XPath挑选器回来的数据
  • re(): 回来unicode字符串列表,字符串作为参数由正则表达式提取出来

3.4.2. 取出数据

首要运用谷歌浏览器开发者东西, 查看网站源码, 来看自己需求取出的数据办法(这种办法比较费事), 更简略的办法是直接对感兴趣的东西右键查看元素, 能够直接查看网站源码

在查看网站源码后, 网站信息在第二个



    • Core Python Programming
      - By Wesley J. Chun; Prentice Hall PTR, 2001, ISBN 0130260363. For experienced developers to improve extant skills; professional level examples. Starts by introducing syntax, objects, error handling, functions, classes, built-ins. [Prentice Hall]


    • ...省掉部分...

    那么就能够经过一下办法进行提取数据

    #经过如下指令挑选每个在网站中的 
  • 元素:
    sel.xpath('//ul/li')
    #网站描绘:
    sel.xpath('/催眠凶恶漫画/ul/li/text()').extract()
    #网站标题:
    sel.xpath('//ul/li/a/text()').extract()
    #网站链接:
    sel.xpath('//ul/li/a/@href').extract()
    #如前所述,每个 xpath() 调用回来一个 selectors 列表,所以咱们能够结合 xpath() 去发掘更深的节点。咱们将会用到这些特性,所以:
    for sel in response.xpath('//ul/li')
    title = sel.xpath('a/text()').extract()
    link = sel.xpath('a/@href').extract()
    desc = sel.xpath('text()').extract()
    print title, link, desc
  • 在已有的爬虫文件中修正代码

    import scrapy
    class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
    "ht兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利tp://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
    "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]
    def parse(self, response):
    for sel in response.xpath('//ul/li'):
    title = sel.xpath('a/text()').extract()
    link = sel.xpath('a/@href').extract()
    desc = sel.xpath('text()').extract()
    print title, link, desc

    3.4.3. 运用item

    Item目标是自界说的python字典,能够运用规范的字典语法来获取到其每个字段的值(字段便是咱们之前用Field赋值的特点)

    >>> item = DmozItem()
    >>> item['title'] = 'Example title'
    >>> item['title']
    'Example title'

    一般来说,Spider将会将爬取到的数据以 Item 目标回来, 最终修正爬虫类,运用 Item 来保存数据,代码如下

    from scrapy.spider import Spider
    from scrapy.selector import Selector
    from tutorial.items import DmozItem

    class DmozSpider(Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
    "http://www.dmoz山东志广世纪集团.org/Computers/Programming/Languages/Python/Books/",
    "http://www.dmoz.osumperrg/Computers/Programming/Languages/Python/Resources/",
    ]
    def parse(self, response):
    sel = Selector(response)
    sites = sel.xpath('//ul[@class="directory-url"]/li')
    items = []
    for site in sites:
    item = DmozItem()
    item['name'] = site.xpath('a/text()').extract()
    item['url'] = site.xpath('a/@href').extract()
    item['description'] = site.xpath('text()').re('-\s[^\n]*\\r')
    items.append(item)
    return items

    3.5. 运用Item Pipeline

    当Item在Spider中被搜集之后,它将会被传递到Item Pipeline,一些组件会依照必定的次序履行对Item的处理。

    每个item pipeline组件(有时称之为ItemPipeline)是完成了简略办法的Python类。他们接收到Item并经过它履行一些行为,一起也决议此Item是否持续经过pipeline,或是被丢掉而不再进行处理。

    以下是item pipeline的一些典型运用:

    • 整理HTML数据
    • 验证爬取的数据(查看item包括某些字段)
    • 查重(并丢掉)
    • 将爬取成果保存,如保存到数据库、XML、JSON等文件中

    编写你自己的item pipeli兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利ne很简略,每个item pipeline组件是一个独立的Python类,一起有必要完成以下办法:

    process_item(item, spider) #每个item pipeline组件都需求调用该办法,这个办法有必要回来一个 Item (或任何承继类)目标,或是抛出 DropItem反常,被丢掉的item将不会被之后的pipeline组件所处理。
    #参数:
    item: 由 parse 办法回来的 Item 目标(Item目标)
    spider: 抓取到这个 Item 目标对应的爬虫目标(Spider目标)
    open_spider(spider) #当spider被敞开时,这个办法被调用。
    #参数:
    spider : (Spider object) – 被敞开的spider
      
    close_spider(spider) #当spider被封闭时,这个办法被调用,能够再爬虫封闭后进行相应的数据处理。
    #参数:
    spider : (Spider object) – 被封闭的spider

    为JSON文件编写一个items

    from scrapy.exceptions import DropItem
    class TutorialPipeline(object):
    # put all words in lowercase
    words_to_filter = ['politics', 'religion']
    def process_item(self, item, spider):
    for word in self.words_to_filter:
    if word in unicode(item['description']).lower():
    raise DropItem("Contains forbidden word: %s" % word)
    else:
    return item

    在 settings.py 中设置ITEM_PIPELINES激活item pipeline,其默以为[]

    ITEM_PIPELINES = {'tutorial.pipelines.FilterWordsPipeline': 1}

    3.6. 存储数据

    运用下面的指令存储为json文件格局

    scrapy crawl dmoz -o items.json

    4. Scarpy优化豆瓣爬虫的抓取


    首要针对之间写过的豆瓣爬虫进行重构:

    • Python网络爬虫(二)--豆瓣抓站小计
    • 豆瓣抓站重构第二版

    豆瓣有反爬虫机制, 只成功了一次后, 就被baned后显现403了, 下面说一下爬虫结构

    完好的豆瓣爬虫代码链接

    4.1. Item

    from scrapy.item import Item, Field
    class DoubanItem(Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = Field() #电影称号
    description = Field() #电影描绘
    url = Fi视频修正器eld() #抓取的url

    4.2. Spider主程序

    #!/usr/bin/env python
    # -鸡蛋仔*- coding:utf-8 -*-
    """
    一个简略的Python 爬虫, 用于抓取豆瓣电影Top前250的电影的称号描绘等
    Anthor: Andrew Liu
    Version: 0.0.3
    Date: 2014-12-17
    Language: Python2.7.8
    Editor: Sub兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利lime Text2
    Operate: 具体操作请看README.md介绍
    """
    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.selector import Selector
    from douban.items import DoubanItem
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    class DoubanSpider(CrawlSpider) :
    name = "douban"
    allowed_domains = ["movie.douban.com"]
    start_urls = ["http://movie.douban.com/top250"]
    rules = (
    #将一切契合正则表达式的url参加到抓取列表中
    Rule(SgmlLinkExtractor(allow = (r'http://movie\.douban\.com/top250\?start=\d+&filter=&type=',))),
    #将一切契合正则表达式的url恳求后下载网页代码, 构成response后调用自界说回调函数
    Rule(SgmlLinkExtractor(allow = (r'http://movie\.douban\.com/subject/\d+', )), callback = 'pa女子校园rse_page', follow = True),
    )
    def parse_page(self, response) :
    sel = Selector(response)
    item = DoubanItem()
    item['name'] = sel.xpath('//h1/span[@property="v:itemreviewed"]/text()').extract()
    item['description'] = sel.xpath('//div/span兰德酷路泽,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),王太利[@property="v:summary"]/text()').extract()
    item['url'] = response.url
    return item

    4.3. 未来要处理的问题

    • 头部假装
    • 表单提交
    • 编码转化

    豆瓣抓了一瞬间, 还没等我振奋就被禁掉了

    ban

    ...
    2014-12-17 22:02:17+0800 [douban] DEBUG: Crawled (403) (referer: http://movie.douban.com/subject/1849031/)
    2014-12-17 22:02:17+0800 [douban] DEBUG: Ignoring response <403 http://www.douban.com/misc/sorry?original-url=http%3A%2F%2Fmovie.douban.com%2Fsubject%2F2209573%2F%3Ffrom%3Dsubject-page>: HTTP status code is not handled or not allowed
    2014-12-17 22:02:17+0800 [douban] DEBUG: Cra上海公交wled (403) (referer: http://movie.douban.com/subject/1849031/)
    ...

    柠檬为我们预备了一些python学习教程,期望能够协助到我们。

    获取办法:请我们重视并私信小编关键词:“材料”即可获取最新最全的python自学教程一套。

the end
刺痛无数人的真相:婚姻里千万别碰这个雷区