news 2026/2/21 15:13:03

scrapy基础知识之发送GET请求

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
scrapy基础知识之发送GET请求

你想掌握 Scrapy 框架中发送 GET 请求的核心知识,这是 Scrapy 爬虫最基础、最常用的操作 ——GET 请求主要用于爬取静态页面、带 URL 参数的列表页 / 搜索页等场景,也是新手入门 Scrapy 的第一个核心技能。我会从基础用法、灵活配置、避坑要点三个维度详细讲解。

一、Scrapy 发送 GET 请求的两种核心方式

Scrapy 中发送 GET 请求分「自动发送」和「手动构造」两种形式,分别适配不同场景:

方式适用场景特点
start_urls自动发送无自定义参数的简单起始请求代码最简,无需手动构造 Request 对象
scrapy.Request()手动构造需自定义请求头、参数、回调函数等灵活度高,适配复杂场景(分页、反爬)
1. 方式 1:start_urls自动发送(最简入门)

Scrapy 的Spider类中,start_urls是默认的起始 URL 列表,框架会自动对列表中每个 URL 发送GET 请求,并将响应交给parse方法处理(默认回调函数)。

python

import scrapy class BasicGetSpider(scrapy.Spider): # 爬虫唯一标识(必须) name = "basic_get" # 起始URL列表,Scrapy自动发送GET请求 start_urls = [ "https://example.com/page1", "https://example.com/page2" ] def parse(self, response): """处理GET请求的响应(默认回调函数)""" # 提取页面核心数据(示例:URL、状态码、页面标题) yield { "request_url": response.url, # 请求的URL "status_code": response.status, # 响应状态码(200=成功) "page_title": response.xpath('//title/text()').get() # 提取标题(推荐用get()) }
2. 方式 2:scrapy.Request()手动构造(灵活配置)

当需要自定义请求头、URL 参数、回调函数等时,需重写start_requests()方法,手动构造scrapy.Request对象并yield出去(核心:GET 是Request的默认请求方法,无需额外指定method)。

2.1 基础手动构造

python

import scrapy class ManualGetSpider(scrapy.Spider): name = "manual_get" def start_requests(self): """重写起始请求方法,手动构造GET请求""" # 基础GET请求(自定义回调函数) yield scrapy.Request( url="https://example.com", callback=self.parse_homepage, # 自定义回调函数(替代默认的parse) dont_filter=True # 可选:禁用URL去重(避免重复请求被过滤) ) def parse_homepage(self, response): """处理首页响应""" yield { "home_title": response.css("title::text").get(), # CSS选择器提取标题 "home_url": response.url }
2.2 带 URL 参数的 GET 请求(分页 / 搜索场景)

爬取分页列表、搜索结果时,GET 请求通常带 URL 参数(如?page=2&keyword=python),推荐用urllib.parse.urlencode()拼接参数,避免手动拼接的编码问题(如中文、特殊字符)。

python

import scrapy from urllib.parse import urlencode class ParamsGetSpider(scrapy.Spider): name = "params_get" def start_requests(self): # 定义URL参数(分页+关键词) base_url = "https://example.com/list" # 爬取第1-3页 for page in range(1, 4): params = { "page": page, "keyword": "Scrapy教程" # 中文参数也能自动编码 } # 拼接参数到URL(urlencode自动处理编码) full_url = f"{base_url}?{urlencode(params)}" yield scrapy.Request( url=full_url, meta={"page_num": page}, # 传递分页号到回调函数 callback=self.parse_list ) def parse_list(self, response): """处理列表页响应""" # 从meta中获取分页号(请求→回调的数据传递) page_num = response.meta["page_num"] # 提取列表项数量 item_count = len(response.css("div.item").getall()) yield { "page": page_num, "item_count": item_count, "request_url": response.url }
3. 进阶:自定义请求头(反爬核心)

大部分网站会拦截无合法请求头的爬虫,需在 GET 请求中添加模拟浏览器的User-AgentReferer等字段(也可在settings.py中全局配置)。

python

import scrapy class HeadersGetSpider(scrapy.Spider): name = "headers_get" def start_requests(self): # 模拟浏览器的请求头 custom_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Referer": "https://example.com", # 模拟来源页 "Accept-Language": "zh-CN,zh;q=0.9" # 语言偏好 } yield scrapy.Request( url="https://example.com", headers=custom_headers, # 自定义请求头 callback=self.parse ) def parse(self, response): yield {"title": response.xpath('//title/text()').get()}

二、常见注意事项

  1. URL 编码问题

    • 中文 / 特殊字符(如空格、&)直接拼接 URL 会导致请求失败,优先用urlencode()处理参数;
    • 示例:urlencode({"keyword": "Scrapy 教程"})会自动编码为keyword=Scrapy+%E6%95%99%E7%A8%8B
  2. 反爬基础配置

    • 全局设置 User-Agent(推荐):在settings.py中添加USER_AGENT = "你的浏览器UA"
    • 设置请求延迟:DOWNLOAD_DELAY = 2(每次请求间隔 2 秒,避免高频爬取);
    • 禁用 Cookie(可选):COOKIES_ENABLED = False(部分网站会通过 Cookie 识别爬虫)。
  3. 响应解析与异常处理

    • 提取数据优先用get()/getall()(Scrapy 2.0 + 推荐),替代旧的extract_first()/extract()
    • 处理请求失败:通过errback参数捕获异常(如 404、500 错误):

      python

      def start_requests(self): yield scrapy.Request( url="https://example.com/error", callback=self.parse, errback=self.handle_error # 错误回调 ) def handle_error(self, failure): """处理请求失败""" self.logger.error(f"请求失败:{failure.request.url},原因:{failure.value}")
  4. 去重机制

    • Scrapy 默认开启 URL 去重,重复的 URL 会被过滤;
    • 如需重复请求(如定时爬取),添加dont_filter=True参数。

三、全局配置优化(settings.py)

为了让 GET 请求更稳定,建议在settings.py中添加以下配置:

python

# 模拟浏览器UA USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" # 请求延迟(秒) DOWNLOAD_DELAY = 2 # 并发请求数(默认16,新手建议调低) CONCURRENT_REQUESTS = 4 # 禁用robots.txt(部分网站禁止爬虫,可关闭) ROBOTSTXT_OBEY = False

总结

  1. Scrapy 发送 GET 请求有两种核心方式:start_urls自动发送(最简)、scrapy.Request()手动构造(灵活);
  2. 带参数的 GET 请求优先用urlencode()拼接参数,避免中文 / 特殊字符编码问题;
  3. 自定义请求头(User-Agent)、设置请求延迟是应对反爬的基础,也是 GET 请求稳定运行的关键;
  4. meta参数可在请求和回调函数间传递数据(如分页号、商品 ID),errback可处理请求失败场景。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/21 20:08:54

一键降AI靠谱吗?实测十大自动化工具的真实效果

家人们,现在学校查得是真严,不仅重复率,还得降ai率,学校规定必须得20%以下... 折腾了半个月,终于把市面上各类方法试了个遍,坑踩了不少,智商税也交了。今天这就把这份十大降AI工具合集掏心窝子…

作者头像 李华
网站建设 2026/2/21 23:25:18

一对括号,百种人生:聊聊「为运算表达式设计优先级」这道被低估的算法题

一对括号,百种人生:聊聊「为运算表达式设计优先级」这道被低估的算法题 大家好,我是 Echo_Wish。 今天想跟你聊一道看起来像小学数学,实际是算法内功心法的题—— Different Ways to Add Parentheses(为运算表达式设计优先级)。 很多人第一次看到这题的反应是: “这不…

作者头像 李华
网站建设 2026/2/21 23:20:47

IT运维的核心目标和主要工作内容

IT运维,全称信息技术运营与维护,是确保企业IT基础设施和服务能够稳定、安全、高效运行的一系列活动。它已经从传统的“救火队”角色,演变为保障业务连续性和驱动业务创新的关键支柱。 一、IT运维的核心目标稳定性与可用性:确保业务…

作者头像 李华
网站建设 2026/2/16 12:17:09

通信协议仿真:5G NR协议仿真_(13).5G NR仿真中的资源管理

5G NR仿真中的资源管理 5G NR资源管理概述 在5G NR(New Radio)系统中,资源管理是确保高效、可靠的数据传输和网络性能的关键组件。资源管理包括多个方面,如资源分配、调度、负载均衡、功率控制等。这些功能通过网络节点&#xff0…

作者头像 李华
网站建设 2026/2/21 0:37:09

洗涤类消泡剂的作用场景在什么地方

在工业零部件清洗、日化产品洗涤、酒店布草洗护及衣物洗涤等核心环节,受表面活性剂作用、机械搅拌卷气、水温波动等因素影响,易产生大量顽固泡沫。这类泡沫会阻碍洗涤介质与待洗物的充分接触,导致洗涤不均、清洁度不达标,还可能造…

作者头像 李华
网站建设 2026/2/22 5:43:15

PostgreSQL NULL处理详解

PostgreSQL NULL处理详解 引言 在数据库管理系统中,NULL是一个非常重要的概念。特别是在PostgreSQL中,NULL的处理方式有其独特的特点。本文将详细介绍PostgreSQL中NULL的概念、处理方式以及在实际应用中的注意事项。 NULL的概念 在PostgreSQL中,NULL表示未知、不确定或者…

作者头像 李华