Scrapy 入门教程 --爬去ITunes app列表

  1. Scrapy 是什么?

    Scrapy 是一个开源的基于Twisted的python爬虫框架,我们只要定制几个简单的模块就能实现网络数据的爬取。

  2. Scrapy 的整体架构

    技术分享

简单的解释一下上面的图: 
爬虫处理的原材料是一个或多个url,爬取时Sheduler会把一个url分配给Downloader来进行一次网络的request请求,请求完成后Downloader再把所得到的response传到Spiders,如果返回的数据是我们需要的,数据就会被处理成相应的Item交给ItemPipeline来进行存储等处理。如果返回的仍然是要处理的url,那么就要交由Scheduler就行再一次的处理过程。

3.Scrapy的安装

sudo pip_install scrapy   或 sudo easy_intall scrapy

输入密码安装完成。输用 scrapy 如果没有 command not found 就表示已经安装成功。

4.创建项目

scrapy startproject project_name

技术分享

如果看到上面的提示,那么我们的项目就创建成功了。切换到项目录下,我们会看到如下的目录结构

appScrapy/ 
scrapy.cfg 整个项目的配制信息 
appScrapy/ 存放所有python定制模块的文件夹 
init.py 
items.py 保存爬取到的的数据的数据结构 
pipelines.py 数据流处理文件,对爬取的数据流进行处理 
settings.py 设置文件,在这里设置数据库等 
spiders/ 存放我们定制的爬虫 
init.py 
… 
我们来找全目标,appStore的娱乐排行榜https://itunes.apple.com/cn/genre/ios-yu-le/id6016?mt=8 
技术分享

我们要爬取的数据就是列表中的app名字跟其相应的具体信息的url。

首先我们来定制我们用来保存数据类型的 items.py,打开items.py,境加后的代码如下:

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

简单说明一下,所有item都继承于scrapy.Item,里面的字段都是scrapy.Field()类型,scrapy.Field()可以接收任何数据类型。

现在该定制我们的爬虫了。

在spiders 文件夹下建立一个AppScrapy.py,然后打开添加如下代码

from scrapy.spider import BaseSpider
from appScrapy.items import AppscrapyItem

class AppScrapy(BaseSpider):
    name = ‘app_scrapy‘
    start_urls = ["https://itunes.apple.com/cn/genre/ios-yu-le/id6016?mt=8"]

    def parse(self, response):
        result = []
        lis = response.xpath("//div[@class=‘grid3-column‘]/div")
        for li in lis:
            array = li.xpath("./ul/li")
            for node in array:
                item = AppscrapyItem()
                item["name"] = node.xpath("./a/text()").extract()
                item["url"] = node.xpath("./a/@href").extract()
                result.append(item)
        return result

所有爬虫类都需要继承自 BaseSpider,并且必须定义一个name,因为启动爬虫时我们要靠这个名字来启动。一个url的数组,必须的这个爬虫才能知道自己应该去哪,最后必须实现parse方法,在这里对爬回来的数据真行筛选得到我们想要的。

当我们启动这个爬虫时 (scrapy crawl app_scrapy),scrapy会从start_urls中取出第一条url,并且用这个url发起一个request,并且把parse作为该request的回调函数,在回调函数中的response就是该request请求后得到的响应。 
技术分享

对于内容的选取我们用xpath方法,xpath方法中要求输入一个路径返回一个selector数组。

对于路径我们可以使用Chrome的开发者工具得到,如上图所示。 我们想要获取内容时,只要在Element选项卡下选中内容,然后右键选择 copy xPath

技术分享

技术分享

lis = response.xpath("//div[@class=‘grid3-column‘]/div")

首先我们利用xpath获得 class = ‘grid3-column’的div 中所有的div,返回的值一个数组。从上面的图片中我们可以看数组中应该是3个表示div 的selector.

技术分享
每个div中的内容如上图所示。我们取出每一个div对其内容再解析。

              for li in lis:
            array = li.xpath("./ul/li")
            for node in array:
                item = AppscrapyItem()
                item["name"] = node.xpath("./a/text()").extract()
                item["url"] = node.xpath("./a/@href").extract()
                result.append(item)

首先用for 循环取出每一个div,然后在当前的div下获取所有的ul下的所有li,所上图所示,我们会得到一个表示li的selector数组。我们再看一下li的结构 
技术分享
中间的文字我们通过text()来获得,所以当前li的文字路径为”./a/text()” “.”表示当前的selector开始。如果这样返回,xpath返回的是一个selector.我们想要获取其真正的值还需要调用extract(),这样就会返回一个其真实字面值的数组。 
要想获取字段的属性值,需要使用 @,如上面的@href,然后把这些值赋给我们写好的item就ok了。

数据当然要把保存了,未完待续,下次写怎么保存到数据库。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。