手把手教你利用 Scrapy 编写一个完整的爬虫

本文介绍了如何使用Scrapy框架搭建一个完整的爬虫项目,包括安装依赖、创建项目和爬虫、定义Item、编写爬虫逻辑、设置自定义UA中间件、定义下载管道(CSV和MySQL同步)、配置爬虫设置以及主入口。目标是爬取指定网站的帖子信息,并将数据存入MySQL数据库。

提到爬虫框架,这里不得不提 Scrapy,它是一款非常强大的分布式异步爬虫框架,更加适用于企业级的爬虫!

项目地址:

https://github.com/scrapy/scrapy

本篇文章将借助一个简单实例来聊聊使用 Scrapy 编写爬虫的完整流程

  1. 实战
    目标对象:

aHR0cHMlM0EvL2dvLmNxbW1nby5jb20vZm9ydW0tMjMzLTEuaHRtbA==

我们需要爬取目标网站下帖子的基本信息

2-1 安装依赖

安装依赖

pip3 install Scrapy

Mysql

pip3 install mysqlclient
2-2 创建项目及爬虫

分析目前地址,获取网站 HOST 及爬取地址,在某个文件夹下利用命令创建一个爬虫项目及一个爬虫

创建一个爬虫项目

scrapy startproject cqmmgo

打开文件夹

cd cqmmgo

创建一个爬虫

scrapy genspider talk 网站HOST
2-3 定义 Item 实体对象

在 items.py 文件中,将需要爬取的数据定义为 Item

比如,这里就需要爬取帖子标题、作者、阅读数、评论数、贴子 URL、发布时间

items.py

import scrapy

杂谈

class CqTalkItem(scrapy.Item):
# 标题
title = scrapy.Field()

# 作者
author = scrapy.Field()

# 查看次数
watch_num = scrapy.Field()

# 评论次数
comment_num = scrapy.Field()

# 地址
address_url = scrapy.Field()

# 发布时间
create_time = scrapy.Field()

2-4 编写爬虫

在 spiders 文件夹下的爬虫文件中编写具体的爬虫逻辑

通过分析发现,帖子数据是通过模板直接渲染,非动态加载,因此我们直接对 response 进行数据解析

PS:解析方式这里推荐使用 Xpath

解析完成的数据组成上面定义的 Item 实体添加到生成器中

spiders/talk.py

import scrapy
from cqmmgo.items import CqTalkItem
from cqmmgo.settings import talk_hour_before
from cqmmgo.utils import calc_interval_hour

class TalkSpider(scrapy.Spider):
name = ‘talk’
allowed_domains = [‘HOST’]

# 第1-5页数据
start_urls = ['https://HOST/forum-233-{}.html'.format(i + 1) for i in range(5)]

def parse(self, response
<think>好的,我现在需要回答用户关于如何使用Scrapy框架编写一个爬虫的问题。首先,我得回忆一下Scrapy的基本结构和常用步骤。Scrapy一个强大的Python爬虫框架,用于快速、高效地抓取网页数据。用户可能希望了解从创建项目编写爬虫的整个过程。 首先,我应该介绍Scrapy的安装和项目创建步骤。用户可能还不熟悉如何初始化项目,所以需要详细说明命令,比如使用`scrapy startproject`来创建项目,然后用`scrapy genspider`生成爬虫文件。这部分需要确保用户能够正确搭建环境。 接下来是编写爬虫的核心部分,也就是Spider类。要解释Spider的几个关键属性,比如name、allowed_domains、start_urls,以及解析函数parse的作用。用户可能需要了解如何发送请求和处理响应,特别是如何提取数据。这里需要提到选择器,比如XPath或CSS选择器的使用,以及如何生成Item或字典。 然后,应该涉及Item的定义,说明如何在items.py中创建数据模型,这样可以帮助用户结构化数据。Pipeline部分可能对用户来说有点复杂,但至少需要简要提及,用于处理存储或后续数据处理。同时,设置ITEM_PIPELINES的激活步骤也是必要的,否则用户可能无法保存数据。 运行爬虫的命令是最后一步,用户需要知道如何启动爬虫,所以给出`scrapy crawl`命令的示例很重要。此外,可能需要提到一些常见问题,比如如何处理分页、处理动态加载的内容,或者如何遵守robots.txt协议,但用户的问题主要集中在编写爬虫的基础步骤上,这些可以作为后续问题提及。 在解释过程中,需要确保每个步骤的代码示例正确无误,比如Spider类的结构,Item的定义,以及Pipeline的基本写法。同时,要提醒用户注意allowed_domains和start_urls的设置,避免爬虫抓取不相关的页面。 可能用户在使用过程中会遇到反爬机制,比如User-Agent检测或验证码,但这些问题可能超出了当前问题的范围,可以作为相关问题提出。此外,存储数据的方式(如保存到JSON或数据库)也是用户可能感兴趣的后续步骤。 总结来说,回答应该分步骤引导用户创建项目编写Spider、定义Item、配置Pipeline,并运行爬虫。每个部分都要简明扼要,同时提供示例代码,确保用户能够跟随操作。最后的相关问题需要围绕Scrapy的其他功能和常见使用场景展开,帮助用户进一步学习。</think><< 使用Scrapy框架编写爬虫的步骤如下: 1. 安装Scrapy ```bash pip install scrapy ``` 2. 创建项目 ```bash scrapy startproject myproject cd myproject ``` 3. 生成爬虫模板 ```bash scrapy genspider example example.com ``` 4. 编写爬虫(spiders/example.py) ```python import scrapy from myproject.items import MyItem class ExampleSpider(scrapy.Spider): name = "example" allowed_domains = ["example.com"] start_urls = ["https://example.com"] def parse(self, response): # 使用CSS选择器或XPath提取数据 item = MyItem() item["title"] = response.css("h1::text").get() item["description"] = response.xpath("//p[@class='desc']/text()").get() yield item # 跟进分页链接示例 next_page = response.css("a.next::attr(href)").get() if next_page: yield response.follow(next_page, callback=self.parse) ``` 5. 定义Item(items.py) ```python import scrapy class MyItem(scrapy.Item): title = scrapy.Field() description = scrapy.Field() ``` 6. 配置管道(pipelines.py) ```python class MyprojectPipeline: def process_item(self, item, spider): # 数据清洗/存储逻辑 return item ``` 7. 启用管道(settings.py) ```python ITEM_PIPELINES = { "myproject.pipelines.MyprojectPipeline": 300, } ``` 8. 运行爬虫 ```bash scrapy crawl example -o output.json ``` 实现原理: 1. Spider类定义爬取规则,通过start_requests生成初始请求 2. 下载器获取网页内容后返回Response对象 3. 解析方法使用选择器提取结构化数据 4. Item对象封装结构化数据 5. Pipeline处理清洗和持久化逻辑 6. 中间件体系处理请求/响应生命周期 注意事项: - 遵守robots.txt协议(可在settings.py设置ROBOTSTXT_OBEY) - 设置合理的下载延迟(DOWNLOAD_DELAY) - 使用User-Agent轮换避免被封禁 - 处理异常和重试逻辑 - 使用CrawlSpider/规则式爬虫处理复杂站点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值