寒假打卡22-2月8日
Scrapy 爬虫框架
在本篇文章中,我们将介绍 Scrapy 爬虫框架,它是一个功能强大且灵活的网页爬取和数据提取框架。我们将介绍 Scrapy 的基本架构、Spider、Pipeline、Middleware 的概念,以及如何使用 Scrapy 实现一个简单的爬虫。
1. 安装 Scrapy
首先,我们需要安装 Scrapy。可以使用以下命令通过 pip 安装:
pip install scrapy
2. Scrapy 基本架构
Scrapy 的架构包括以下几个核心组件:
- Spider:定义了如何爬取某个网站,包括如何从初始 URL 开始,如何跟踪链接,以及如何解析页面内容。
- Item:定义了爬取的数据结构。
- Pipeline:处理爬取的数据,例如进行清洗、存储等操作。
- Downloader Middleware:处理请求和响应,可以用于修改请求头、设置代理等。
- Spider Middleware:处理从 Spider 发送的请求和接收到的响应,可以用于过滤请求或修改响应。
3. 创建 Scrapy 项目
使用以下命令创建一个新的 Scrapy 项目:
scrapy startproject myproject
项目目录结构如下:
myproject/
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
4. 定义 Item
在 items.py 文件中定义爬取的数据结构。
import scrapy
class MyprojectItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
description = scrapy.Field()
5. 创建 Spider
在 spiders 目录下创建一个新的 Spider 文件,例如 example_spider.py。
import scrapy
from myproject.items import MyprojectItem
class ExampleSpider(scrapy.Spider):
name = 'example'
allowed_domains = ['example.com']
start_urls = ['http://example.com/']
def parse(self, response):
for article in response.css('article'):
item = MyprojectItem()
item['title'] = article.css('h2::text').get()
item['link'] = article.css('a::attr(href)').get()
item['description'] = article.css('p::text').get()
yield item
6. 定义 Pipeline
在 pipelines.py 文件中定义数据处理的逻辑。
class MyprojectPipeline:
def process_item(self, item, spider):
# 处理爬取的数据,例如清洗、存储等操作
return item
7. 配置项目
在 settings.py 文件中配置项目设置,例如启用 Pipeline。
BOT_NAME = 'myproject'
SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
# Configure item pipelines
ITEM_PIPELINES = {
'myproject.pipelines.MyprojectPipeline': 300,
}
8. 运行爬虫
使用以下命令运行爬虫:
scrapy crawl example
9. Scrapy 反爬机制与应对策略
常见反爬机制
- IP 封禁:网站会封禁频繁访问的 IP 地址。
- User-Agent 检测:网站会检测请求的 User-Agent 头部,封禁爬虫的 User-Agent。
- 验证码:网站会使用验证码防止自动化访问。
- 动态内容加载:网站通过 JavaScript 加载动态内容,使得传统爬虫无法获取数据。
应对策略
- 使用代理 IP:通过轮换代理 IP 避免被封禁。
- 设置请求头:伪装请求头,包括 User-Agent、Referer 等。
- 处理验证码:使用打码平台或机器学习模型识别验证码。
- 模拟浏览器行为:使用
selenium或pyppeteer模拟浏览器行为,处理动态内容加载。
10. 数据存储
Scrapy 支持将爬取的数据存储到多种数据存储中,例如 MongoDB、MySQL、CSV 等。
存储到 MongoDB
在 pipelines.py 中定义存储逻辑。
import pymongo
class MongoDBPipeline:
def open_spider(self, spider):
self.client = pymongo.MongoClient('localhost', 27017)
self.db = self.client['mydatabase']
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db['mycollection'].insert_one(dict(item))
return item
在 settings.py 中启用 Pipeline。
ITEM_PIPELINES = {
'myproject.pipelines.MongoDBPipeline': 300,
}
总结
在本篇文章中,我们介绍了 Scrapy 爬虫框架的基本架构、Spider、Pipeline、Middleware 的概念,并演示了如何使用 Scrapy 实现一个简单的爬虫。通过掌握这些知识,你能够使用 Scrapy 进行高效的网页爬取和数据提取。接下来,我们将探讨动态网页爬取的相关内容,敬请期待!
浙公网安备 33010602011771号