寒假打卡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 等。
  • 处理验证码:使用打码平台或机器学习模型识别验证码。
  • 模拟浏览器行为:使用 seleniumpyppeteer 模拟浏览器行为,处理动态内容加载。

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 进行高效的网页爬取和数据提取。接下来,我们将探讨动态网页爬取的相关内容,敬请期待!

posted @ 2025-02-08 09:11  aallofitisst  阅读(19)  评论(0)    收藏  举报