当前位置: 首页 >> 我们的头条 >> 春节旅游,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光洁 >> 正文

春节旅游,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光洁

2019年04月06日 04:20:47     作者:admin     分类:我们的头条     阅读次数:192    
每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程)

1. Scrapy简介


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

其开始是为了页面抓取 (更切当来说, 网络抓取 )所规划的, 也能够运用在获取API所回来的数据(例如 Amazon Associates Web Services ) 新年旅行,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光亮或许通用的网络爬虫。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)传给下载器,下载器把资源下载下来,并封装成应对包(Response)
  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新年旅行,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光亮.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, 它的结构如下:

.
├── scrapy.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 Dmoz酥胸Item(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 DmozSpide美津植秀泡泡氧气面膜r(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://ww盛清让w.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
├── __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 [sc水坑虐猫rapy] 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, HttpCompressionMiddleware, 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 listening 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: 新年旅行,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光亮Crawled (200) (referer: None)
2014-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: Dumping Scrapy stats:
{'downloader/request_bytes': 516,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
'downloader/response_bytes': 16338,
'down叶少御宠娇妻loader/respo新年旅行,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光亮nse_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/dequeued': 2,
'scheduler/dequeued/memory': 2,
'scheduler/enqueued': 2,
's黄晓彤cheduler/enqueued/memory': 2,
'star大宋小厨娘t_time': datetime.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
  • 在已有的爬虫新年旅行,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光亮文件中修正索星金服代码

    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):
    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 im口爆店port 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.org/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 pipeline很简新年旅行,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光亮单,每个item pipeline组件是一个独立的Python类,一起有必要完成以下办法:

    pro车美士cess_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爬虫--Scrapy结构学习(附最全python自学教程),李光亮爬虫进行重构:

    • 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 = Field() #抓取的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: Sublime 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 = 'parse_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[@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: Crawled (403) (referer: http://movie.douban.com/subject/1849031/)
    ...

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

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

除非特别注明,本文『春节旅游,每天五分钟Python爬虫--Scrapy结构学习(附最全python自学教程),李光洁』来源于互联网、微信平台、QQ空间以及其它朋友推荐等,非本站作者原创。 本站作者admin不对本文拥有版权,如有侵犯,请投诉。我们会在72小时内删除。 但烦请转载时请标明出处:“本文转载于『Linux脚本学习,Linux学习之家,最新服务器开发知识』,原文地址:http://www.litish.com/articles/1510.html