当我们需要从网络中获取大量数据时,手动爬取数据是非常耗费时间且效率低下的。这时我们可以考虑使用自动化的爬虫框架来实现。Scrapy正是一个强大的Python爬虫框架,它可以帮助我们抓取网页上的数据并将其存储到本地或者通过API接口直接返回给其他应用程序使用。
以下是使用Scrapy框架的步骤:
-
安装Scrapy框架(前提是已经安装了Python)
bash
pip install scrapy -
创建新的Scrapy项目,可以通过以下命令实现:
bash
scrapy startproject your_project_name
运行该命令后,一个名为 your_project_name 的文件夹将被创建在当前目录下。这个文件夹包括了scrapy框架的基本配置文件和代码结构。 -
定义爬虫项目的数据模型, 在 Scrapy 中,将一个网站称之为一个“爬虫”,在每个“爬虫”中需要定义数据模型。数据模型可以定义在 spider.py 文件中,它是爬虫项目中最为重要的文件。
例如,我们想要爬取一个名为 quotes.toscrape.com的网站来获取其中的名言警句, 首先我们需要定义该网站的URL链接, 并在 spider.py 文件中进行如下定义:
“`python
import scrapy
class QuoteSpider(scrapy.Spider):
name = “quote”
start_urls = [
‘http://quotes.toscrape.com/page/1/’,
]
# 网站爬取的逻辑
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('span small::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
“`
在上述代码片段中,我们定义了一个名为 QuoteSpider的子类,它是Scrapy的一个Spider(爬虫)对象。我们定义了名字为quote的爬虫,它定向去爬取 http://quotes.toscrape.com/page/1/ 网站的数据。parse() 是这个 Project 的基本逻辑驱动方法。
- 在定义Spider对象之后,我们需要将其与结果输出机制结合起来。需要生成items.py文件,并定义对应的字段,
“`python
import scrapy
class QuotesItem(scrapy.Item):
# 定义字段
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
“`
在上述代码中,我们定义了一个 QuotesItem 对象,它表示此爬虫程序中所抓取到的信息。属性text, author和tags分别表示名言内容、作者和标签属性。
- 准备最后的输出数据格式。这部分通常可以通过创建 pipelines.py 库来完成。
“`python
import pymongo
class MongoPipeline(object):
collection_name = 'quotes'
def open_spider(self, spider):
self.client = pymongo.MongoClient("mongodb://localhost:27017/")
self.db = self.client["mydatabase"]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db[self.collection_name].insert_one(dict(item))
return item
“`
在上述代码中,我们创建了一个名为 MongoPipeline 的类,用于将抓到的信息存储到 MongoDB 数据库中。
- 最后在终端中运行 scrapy crawl quote 命令,开始爬虫任务。当爬虫运行结束后,系统将会将获取到的数据保存到你所指定的实例中。
在Scrapy框架中,我们可以使用许多有用的工具,如Selector和ItemLoader,这些工具可以大大简化数据的提取、格式化和上传等流程。
以下是一个具体的例子,我们将使用Scrap框架来爬取DouBan的电影排行,并将排行榜信息存储到本地文件中:
import scrapy
import re
class DouBanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ["movie.douban.com"]
start_urls = [
"https://movie.douban.com/top250"
]
def parse(self, response):
for movie in response.xpath('//div[@class="hd"]'):
title = movie.xpath('a/span[@class="title"]/text()').extract_first()
rank = movie.xpath("preceding-sibling::div/span[@class=''][1]/text()").extract_first()
yield {
"title": title,
"rank": re.sub(r'(\xa0)*', '', rank),
}
next_page = response.xpath('//span[@class="next"]/a/@href')
if next_page:
yield response.follow(next_page[0], self.parse)
在上述代码中,我们定义了一个 DouBanSpider 的子类,用于爬取排名前250的电影;我们定义了start_urls作为抓取页面的起始链接,parse() 方法会对页面进行解析,并获取电影名称和该电影在Top 250中的排名。
最后,我们需要将数据存储到本地文件中。在settings.py文件中配置如下所示:
ITEM_PIPELINES = {'douban.pipelines.DoubanPipeline': 300, }
FEED_URI = 'items.csv'
FEED_FORMAT = 'csv'
配置文件中 ITEM_PIPELINES,这里我们使用了管道机制,用于在运行完爬虫之后将数据存储到本地文件items.csv中。
在完成以上步骤后,我们在终端窗口下运行命令 scrapy crawl douban ,即可得到电影排名信息并存储到文件中。
总结来说,使用Scrapy框架,我们可以快速高效地创建自动化的爬虫程序。这里提供的是非常基础的用法,学习成本相对较低,但是对于数据获取或关联需要更深入的学习。