美文网首页
Scrapy 框架学习(二):Scrapy 入门

Scrapy 框架学习(二):Scrapy 入门

作者: 浪花三朵 | 来源:发表于2019-04-15 11:44 被阅读0次

一个简单的 Scrapy demo,完成基本的抓取流程以对 Scrapy 有基本的认识。
基本目标:

  1. 命令行创建项目
  2. 创建一个 spider 抓取站点和处理数据
  3. 通过命令行将抓取的数据导出
  4. 将抓取的数据保存到 MongoDB

一、环境配置
安装好 Scrapy 框架、MongoDB 和 PyMongo 第三方库。

二、创建项目

scrapy startproject scrapydemo

该命令会创建一个 scrapydemo 的文件夹

三、创建 Spider
你可以命令行创建

cd scrapydemo
scrapy genspider quotes quotes.toscrape.com

命令行创建,你首先需要进入到该项目的目录里,再运行第二行命令。这里有两个参数,第一个 quotes 是 Spider 的文件名,第二个是网站域名。
当然你也可以通过 IDE 创建,进入 spiders 文件夹,创建 quotes.py 文件。
打开命令行创建的 quotes.py 文件,可以看到已经初始化了一些代码。


2019-04-15 104207.png

这里有三个属性,一个方法:

  • name:它是每个项目里唯一的名字,用来区分不同的 Spider。
  • allowed_domains,它是允许爬取的域名,如果初始或者后续的链接不属于次域名,将被过滤掉,不被爬取。
  • start_urls:它包含了 Spider 在启动时爬取的 url 列表,初始请求由它来定义。
  • parse():它是 Spider 的一个方法,默认情况下,被调用时 start_urls 里面的链接构成的请求完成下载执行后,返回的响应就会作为唯一的参数传递给这个函数,该方法负责解析响应,提取数据或者进一步生成要出来的请求

四、创建 Item
Item 是爬取数据的容器,使用发放和字典类似。创建的 Item 是继承自 Scrapy.Item 类。我们要从目标网站获取以下数据:text、author、tags。
修改 items.py 文件如下:

import scrapy

class QuotesItem(scrapy.Item):
    text = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()

五、解析 Response
打开 quotes.py 文件,parse() 方法的 response 是 start_urls 的返回结果。所以可以直接在此方法中解析response提取数据。

    def parse(self, response):
        quotes = response.css(".quote") # 获取所有 class=quote 的element
        print(quotes)
        for quote in quotes:
            text = quote.css(".text::text").extract_first()
            author = quote.css(".author::text").extract_first()
            tags = quote.css(".tags .tag::text").extract()

六、使用 Item
修改 parse() 方法

    def parse(self, response):
        quotes = response.css(".quote") # 获取所有 class=quote 的element
        print(quotes)
        for quote in quotes:
            item = QuoteItem()
            item["text"] = quote.css(".text::text").extract_first()
            item["author"] = quote.css(".author::text").extract_first()
            item["tags"] = quote.css(".tags .tag::text").extract()
            yield item

如此,首页的内容被抓取并复制给了一个个 QuoteItem 对象。

七、后续 Request
上面的操作实现了初始 Url 的抓取,那么下一页内容如何抓取?这时就需要从当前页面找到信息生成下一页的请求,如此循环构造出整个网站的请求。
此页面有一个 Next 按钮,通过源代码可以看出链接是/page/2,全链接是 http://quotes.toscrape.com/page/2,因此可通过这个链接构造下个请求。构造请求需要用到 scrapy.Requst(),这里我们传递连个参数:url,callback

  • url:它是请求链接
  • callback:它是回调函数,当制定了该回调函数的请求完成后,获取响应,引擎会将该响应作为参数传递给这个回调函数。回调函数进行解析或生成下个请求。
    quote.py 完整代码:
import scrapy

from scrapydemo.items import QuoteItem


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        quotes = response.css(".quote") # 获取所有 class=quote 的element
        print(quotes)
        for quote in quotes:
            item = QuoteItem()
            item["text"] = quote.css(".text::text").extract_first()
            item["author"] = quote.css(".author::text").extract_first()
            item["tags"] = quote.css(".tags .tag::text").extract()
            yield item

        next = response.css('.pager .next a::attr("href")').extract_first()
        url = response.urljoin(next)
        yield scrapy.Request(url, callback=self.parse)

八、运行

scrapy crawl quotes
2019-04-15 114313.png

从控制台可以看到抓取的数据。

最后
对于提取元素,extract() 可以用 getall() 方法代替,extract_first() 可以用 get() 代替
Scrapy 官方文档

相关文章

网友评论

      本文标题:Scrapy 框架学习(二):Scrapy 入门

      本文链接:https://www.haomeiwen.com/subject/pmiywqtx.html