Python 爬虫入门(九):Scrapy安装及使用「详细介绍」
前言
1. Scrapy 简介
Scrapy 是一个用于抓取 Web 数据的应用框架。与其他 Python 爬虫库(如 BeautifulSoup 和 requests)相比,Scrapy 提供了更高的抓取速度、更强的扩展性和更便捷的项目管理方式。Scrapy 框架包含了数据抓取、处理和存储的一整套工具,使得用户能够更高效地完成爬虫任务。
2. Scrapy 的安装
2.1 环境准备
在安装 Scrapy 之前,请确保你的计算机已经安装了以下环境:
- Python 3.6 及以上版本
- pip 包管理工具
2.2 安装 Scrapy
使用 pip 命令可以方便地安装 Scrapy:
pip install scrapy
安装完成后,可以通过以下命令验证 Scrapy 是否安装成功:
scrapy
如果安装成功,你将看到 Scrapy 的版本信息。
3. 创建 Scrapy 项目
3.1 创建项目
在命令行中,导航到你希望存放项目的目录,并运行以下命令来创建一个新的 Scrapy 项目:
scrapy startproject myproject
此命令将在当前目录下创建一个名为 myproject
的文件夹,文件夹结构如下:
myproject/scrapy.cfgmyproject/__init__.pyitems.pymiddlewares.pypipelines.pysettings.pyspiders/__init__.py
3.2 项目结构简介
scrapy.cfg
: Scrapy 项目的配置文件。myproject/
: 项目的 Python 模块,之后会在此加入代码。items.py
: 定义爬取的数据结构。middlewares.py
: 定义 Scrapy 中间件。pipelines.py
: 定义数据处理管道。settings.py
: 定义项目的配置。spiders/
: 存放爬虫代码的目录。
4. 编写爬虫
4.1 创建爬虫
在 spiders/
目录下创建一个新的爬虫文件,例如 example_spider.py
,并编写以下内容:
python">import scrapyclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['https://jsonplaceholder.typicode.com/posts']def parse(self, response):for post in response.json():yield {'userId': post['userId'],'id': post['id'],'title': post['title'],'body': post['body']}
4.2 解析数据
在 parse
方法中,我们解析响应内容并提取所需的数据。response.json()
方法将响应内容解析为 JSON 格式,便于我们提取数据。
4.3 运行爬虫
在项目的根目录下,运行以下命令来启动爬虫:
scrapy crawl example
如果一切正常,你将看到爬虫开始抓取数据,并在控制台输出抓取到的内容。
5. 存储数据
5.1 存储为 JSON 文件
Scrapy 提供了多种存储抓取数据的方法,这里介绍将数据存储为 JSON 文件的方法。在命令行中运行以下命令:
scrapy crawl example -o output.json
此命令将抓取的数据保存到 output.json
文件中。
5.2 存储到数据库
我们也可以将抓取的数据存储到数据库中,例如 MongoDB 或 MySQL。在 pipelines.py
文件中编写数据存储的逻辑。
5.2.1 MongoDB
首先,安装 pymongo 库:
pip install pymongo
然后在 pipelines.py
中添加以下代码:
python">import pymongoclass MongoPipeline:def __init__(self):self.client = pymongo.MongoClient('localhost', 27017)self.db = self.client['scrapy_db']self.collection = self.db['scrapy_collection']def process_item(self, item, spider):self.collection.insert_one(dict(item))return item
在 settings.py
中启用该管道:
python">ITEM_PIPELINES = {'myproject.pipelines.MongoPipeline': 300,
}
6. 处理请求和响应
6.1 请求头设置
为了模拟真实用户的浏览行为,我们可以在爬虫中设置请求头。在爬虫文件中添加 headers
属性:
python">class ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['https://jsonplaceholder.typicode.com/posts']headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}def start_requests(self):for url in self.start_urls:yield scrapy.Request(url, headers=self.headers, callback=self.parse)
6.2 处理响应
在 parse
方法中,我们可以根据需要处理响应数据。这里的示例中,我们将 JSON 数据解析并提取需要的字段。
7. 高级功能
7.1 使用中间件
Scrapy 中间件可以在请求和响应之间执行一些自定义的处理逻辑。例如,我们可以使用中间件来处理请求的重试逻辑、设置代理等。
在 middlewares.py
中添加以下示例代码:
python">from scrapy import signalsclass CustomMiddleware:@classmethoddef from_crawler(cls, crawler):s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return sdef process_request(self, request, spider):request.headers['User-Agent'] = 'Custom User-Agent'def process_response(self, request, response, spider):return responsedef process_exception(self, request, exception, spider):passdef spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)
在 settings.py
中启用中间件:
python">DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.CustomMiddleware': 543,
}
7.2 使用代理
有时我们需要通过代理来抓取数据。Scrapy 支持通过中间件设置代理。在 middlewares.py
中添加以下代码:
python">class ProxyMiddleware:def process_request(self, request, spider):request.meta['proxy'] = 'http://your_proxy_address'
在 settings.py
中启用该代理中间件:
python">DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.ProxyMiddleware': 543,
}
7.3 使用管道处理数据
数据管道用于处理和存储抓取的数据。在 pipelines.py
中定义数据管道,并在 settings.py
中启用它。
8. 常见问题及解决方法
8.1 爬虫被封禁
当我们抓取某些网站时,可能会遇到 IP 被封禁的情况。为了解决这个问题,我们可以使用代理轮换、设置合理的抓取间隔时间等方法。
8.2 数据解析错误
在解析数据时,可能会遇到数据结构变化或数据格式不匹配的情况。为了应对这些问题,我们可以在解析过程中加入异常处理机制,确保程序在遇到错误时不会崩溃。
8.3 数据存储失败
在将数据存储到数据库或文件时,可能会遇到存储失败的情况。常见的原因包括数据库连接问题、数据格式不匹配等。通过日志记录和异常处理,可以更好地定位和解决这些问题。
总结
通过本文的学习,我们深入了解了 Scrapy 的安装和使用方法。Scrapy 作为一个功能强大的爬虫框架,能够帮助我们高效地抓取和处理网页数据。从项目创建、编写爬虫、解析数据到数据存储,我们一步步学习了 Scrapy 的基本使用方法,并介绍了一些高级功能和常见问题的解决方法。