【Python】Scrapy入门实例

Scrapy

Scrapy是一个使用Python编写的轻量级网络爬虫,使用起来非常的方便。Scrapy使用了Twisted异步网络库来处理网络通讯。整体架构大致如下:

创建一个Scrapy项目

S-57格式是国际海事组织(IMO)颁布的电子海图标准,本身是一种矢量海图。这些标准都公布在http://www.s-57.com/上。以该网页为抓取对象,进入存储代码的目录中,运行下列命令,创建项目 crawls57:

scrapy startproject crawls57

该命令将会创建包含下列内容的 crawls57 目录:

crawls57/
    scrapy.cfg
    crawls57/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

这些文件分别是:

  • scrapy.cfg: 项目的配置文件
  • crawls57/: 该项目的python模块。之后您将在此加入代码。
  • crawls57/items.py: 项目中的item文件.
  • crawls57/pipelines.py: 项目中的pipelines文件.
  • crawls57/settings.py: 项目的设置文件.
  • crawls57/spiders/: 放置spider代码的目录.

定义Item

Item 是保存爬取到的数据的容器。在www.s-57.com的网页上,数据分为左右两部分,左边是航标对象的信息,右边是航标属性的信息。右边的数据较多,所以我们主要抓取左边,即航标对象的一些数据:

import scrapy

class Crawls57Item(scrapy.Item):
    Object = scrapy.Field()
    Acronym = scrapy.Field()
    Code = scrapy.Field()
    Primitives = scrapy.Field()
    Attribute_A = scrapy.Field()
    Attribute_B = scrapy.Field()
    Attribute_C = scrapy.Field()
    Definition = scrapy.Field()
    References_INT = scrapy.Field()
    References_S4 = scrapy.Field()
    Remarks = scrapy.Field()
    Distinction = scrapy.Field()

编写爬虫

有了定义的Item,就可以编写爬虫Spider开始抓取数据。

可以直接通过命令行的方式,创建一个新的Spider:

scrapy genspider s-57 s-57.com

此时,在spiders文件夹里会生成一个 s-57.py 文件。下面我们则需要对该文件进行编辑。

根据网站s-57的结构,抓取的过程主要有两步:

  1. 抓取航标对象的名称、缩略号、ID等信息;
  2. 提取每一个航标对象的网页地址,抓取它的详细信息。

s-57.py 里默认有 parse() 方法,可以返回 Request 或者 items。每次运行爬虫, parse() 方法都会被调用。返回的 Request 对象接受一个参数 callback,指定 callback 为一个新的方法,就可以反复调用这个新的方法。所以,通过返回 Request 即可实现对网站的递归抓取。根据上述要求的抓取过程,可创建方法 parse_dir_contents() ,被 parse() 调用抓取航标对象的详细信息,编辑代码如下。

import scrapy
from crawls57.items import Crawls57Item
import re

class S57Spider(scrapy.Spider):
    name = "s-57"
    allowed_domains = ["s-57.com"]
    start_urls = [
        "http://www.s-57.com/titleO.htm",
    ]
    data_code={}
    data_obj={}

    def parse(self, response):
        for obj in response.xpath(‘//select[@name="Title"]/option‘):
            obj_name = obj.xpath(‘text()‘).extract()[0]
            obj_value = obj.xpath(‘@value‘).extract()[0]
            self.data_obj[obj_value] = obj_name

        for acr in response.xpath(‘//select[@name="Acronym"]/option‘):
            acr_name = acr.xpath(‘text()‘).extract()[0]
            acr_value = acr.xpath(‘@value‘).extract()[0]
            self.data_code[acr_name] = acr_value
            url = u‘http://www.s-57.com/Object.asp?nameAcr=‘+acr_name
            yield scrapy.Request(url, callback=self.parse_dir_contents)

    def parse_dir_contents(self, response):

        acr_name = response.url.split(‘=‘)[-1]
        acr_value = str(self.data_code[acr_name])
        obj_name = self.data_obj[acr_value]

        for sel in response.xpath(‘//html/body/dl‘):
            item = Crawls57Item()
            item[‘Object‘] = obj_name
            item[‘Acronym‘] = acr_name
            item[‘Code‘] = acr_value
            item[‘Primitives‘] = sel.xpath(‘b/text()‘).extract()

            #Atrribute ABC
            atainfo = u‘‘
            apath = sel.xpath(‘.//tr[1]/td[2]/b‘)
            for ata in apath.xpath(‘.//span‘):
                atainfo += ata.re(‘>(\w+)<‘)[0]+"; "
            item[‘Attribute_A‘] = atainfo
            atbinfo = u‘‘
            bpath = sel.xpath(‘.//tr[2]/td[2]/b‘)
            for atb in bpath.xpath(‘.//span‘):
                atbinfo += atb.re(‘>(\w+)<‘)[0]+"; "
            item[‘Attribute_B‘] = atbinfo
            atcinfo = u‘‘
            cpath = sel.xpath(‘.//tr[3]/td[2]/b‘)
            for atc in cpath.xpath(‘.//span‘):
                atcinfo += atc.re(‘>(\w+)<‘)[0]+"; "
            item[‘Attribute_C‘] = atcinfo

            #Description
            i = 0
            for dec in sel.xpath(‘.//dl/dd‘):
                i += 1
                dt = ‘.//dl/dt[‘ + str(i) + ‘]/b/text()‘
                dd = ‘.//dl/dd[‘ + str(i) + ‘]/font/text()‘
                if (sel.xpath(dt).extract()[0] == ‘References‘):
                    item[‘References_INT‘] = sel.xpath(‘.//tr[1]/td[2]/font/text()‘).extract()[0]
                    item[‘References_S4‘] = sel.xpath(‘.//tr[2]/td[2]/font/text()‘).extract()[0]
                if (len(sel.xpath(dd).extract()) == 0):
                    continue
                if (sel.xpath(dt).extract()[0] == ‘Definition‘):
                    ss = ‘‘
                    for defi in sel.xpath(dd).extract():
                        ss += defi
                    item[‘Definition‘] = ss
                if (sel.xpath(dt).extract()[0] == ‘Remarks:‘):
                    item[‘Remarks‘] = sel.xpath(dd).extract()[0]
                if (sel.xpath(dt).extract()[0] == ‘Distinction:‘):
                    item[‘Distinction‘] = sel.xpath(dd).extract()[0]

            yield item

相比正则表达式,用xpath抓取数据要方便许多。但是,用的时候还是免不了反复调试。Scrapy提供了一个shell环境用于调试response的命令,基本语法:

scrapy shell [url]
之后,就可以直接输入response.xpath(‘...‘)调试抓取的数据。

爬取

进入项目的根目录,执行下列命令启动Spider:

scrapy crawl crawls57 -o data.json

最终,抓取的数据被存储在 data.json 中。

时间: 2024-10-02 06:48:00

【Python】Scrapy入门实例的相关文章

Python 爬虫入门实例(爬取小米应用商店的top应用apk)

一,爬虫是什么? 爬虫就是获取网络上各种资源,数据的一种工具.具体的可以自行百度. 二,如何写简单爬虫 1,获取网页内容 可以通过 Python(3.x) 自带的 urllib,来实现网页内容的下载.实现起来很简单 import urllib.request url="http://www.baidu.com" response=urllib.request.urlopen(url) html_content=response.read() 还可以使用三方库 requests ,实现起

python快速入门实例

实例001:数字组合题目 有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析 遍历全部可能,把有重复的剃掉. total=0for i in range(1,5): for j in range(1,5): for k in range(1,5): if ((i!=j)and(j!=k)and(k!=i)): print(i,j,k) total+=1print(total) 简便方法 用itertools中的permutations即可. import

小白学 Python 爬虫(37):爬虫框架 Scrapy 入门基础(五) Spider Middleware

人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(7):HTTP 基础 小白学 Python 爬虫(8):网页基

小白学 Python 爬虫(40):爬虫框架 Scrapy 入门基础(七)对接 Selenium 实战

人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(7):HTTP 基础 小白学 Python 爬虫(8):网页基

Python爬虫入门七之正则表达式

在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我

转 Python爬虫入门七之正则表达式

静觅 » Python爬虫入门七之正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容就易如反掌了. 正则表达式的大致匹配过程是:1.依次拿出表达式和文本中的字符比较,2.如果每一个

Python爬虫入门六之Cookie的使用

大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了. 在此之前呢,我们必须先介绍一个opener的概念. 1.Opener 当你获取一个

转 Python爬虫入门一之综述

转自: http://cuiqingcai.com/927.html 静觅 » Python爬虫入门一之综述 首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 要学习Python爬虫,我们要学习的共有以下几点: Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy Python爬虫更高级的功能 1.Pyth

Python.Scrapy.14-scrapy-source-code-analysis-part-4

Scrapy 源代码分析系列-4 scrapy.commands 子包 子包scrapy.commands定义了在命令scrapy中使用的子命令(subcommand): bench, check, crawl, deploy, edit, fetch, genspider, list, parse, runspider, settings, shell, startproject, version, view. 所有的子命令模块都定义了一个继承自 类ScrapyCommand的子类Comman