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

2019-04-15  本文已影响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

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

四、创建 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

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 官方文档

上一篇 下一篇

猜你喜欢

热点阅读