scrapy follow 笔记

本文详细解析了CrawlSpider的爬取规则及start_urls的处理流程,阐述了如何使用rule参数follws=True实现对新链接的递归爬取,并介绍了callback在规则中的作用。

1. CrawlSpider

rule 爬取规则

follws = True 是指爬取了一个URL之后,得到了response, 对response使用rules例表中的rule中定义的link_extractor对这个response提取新的url, 新的符合该rule的url(即新的links), 然后follow=True, 则, 对在该response中发现的新links, 发起request请求.

 

CrawlSpider 抓取start_urls

1. 假设start_urls = ["http://www.baidu.com"]

rules [A , B, C ]

2. 则 启动spider之后,得到response(仅一个)

分别用A(resp)-->links

B(resp)-->links

C(resp)-->links

 

对这些links都发起请求

3. 如果rule里有callback, 这一般应设置follows =False, 或者不设置, 这样就不会对该response发起规则里的link 请求了.

<think> 我们正在讨论 Scrapy 中的 `scrapy.follow` 函数。实际上,在 Scrapy 中,通常使用 `response.follow` 方法来生成新的请求。这是因为 `response.follow` 方法可以简化 URL 的构造,并且自动处理相对 URL 和绝对 URL 的转换。 根据引用[5]中提到的,在 spider 中,我们通常会解析网页并返回新的请求(Request)或者数据(Item)。而生成新的请求通常有两种方式: 1. 使用 `scrapy.Request` 类,需要传入 URL 和回调函数。 2. 使用 `response.follow` 方法,它是对 `scrapy.Request` 的封装,使用起来更为方便。 具体到 `response.follow` 的使用方法: - 它可以直接接受一个相对 URL(字符串)或者绝对 URL。 - 它也可以接受一个 `Selector` 对象(比如一个链接元素 `a`),并自动提取其 `href` 属性。 - 它还接受一个 `scrapy.http.Response` 对象(这种情况下相当于复制该响应的 URL 并创建一个新的请求)。 - 另外,我们可以传递 `callback` 参数来指定处理响应的回调函数,以及其他的请求参数(如 `method`, `headers`, `body`, `cookies`, `meta`, `encoding` 等)。 下面是一些使用示例: 1. 使用相对 URL 字符串生成请求: ```python yield response.follow('/next-page', callback=self.parse_next_page) ``` 2. 使用绝对 URL 字符串(注意:尽管可以,但通常我们使用相对 URL 更方便,因为 `response.follow` 会自动根据当前响应的 URL 转换为绝对 URL): ```python yield response.follow('https://example.com/next-page', callback=self.parse_next_page) ``` 3. 使用一个链接元素(`a` 标签)的 `Selector` 对象: ```python for link in response.css('ul.pager a'): yield response.follow(link, callback=self.parse_next_page) ``` 4. 传递额外的参数(例如设置请求头、元数据等): ```python yield response.follow( '/next-page', callback=self.parse_next_page, headers={'Referer': response.url}, meta={'page_number': 2} ) ``` 注意:`response.follow` 默认使用 `GET` 请求。如果需要使用 `POST`,则需要传递 `method='POST'`。 另外,引用[2]和引用[4]提到了使用 `scrapy.Request` 来发送请求,而 `response.follow` 实际上是创建 `Request` 对象的一种更简便的方法。它们最终都会生成 `Request` 对象并交给引擎调度。 总结一下,`response.follow` 的使用步骤: 1. 在解析函数(如 `parse`)中,获取到需要跟进的链接(可以是相对URL、绝对URL或包含链接的元素)。 2. 调用 `response.follow`,传入链接(或元素)和回调函数,以及可选的额外参数。 3. 使用 `yield` 返回这个请求。 下面是一个完整的例子,假设我们要爬取一个分页的网站: ```python import scrapy class MySpider(scrapy.Spider): name = 'example' start_urls = ['http://example.com/page1'] def parse(self, response): # 解析当前页面的数据 for item in response.css('div.item'): yield { 'title': item.css('h2::text').get(), 'link': item.css('a::attr(href)').get() } # 提取下一页的链接 next_page = response.css('li.next a::attr(href)').get() if next_page is not None: # 使用 response.follow 跟进下一页 yield response.follow(next_page, callback=self.parse) ``` 在这个例子中,我们首先解析当前页面的每个项目,然后查找下一页的链接。如果存在下一页,则使用 `response.follow` 创建一个新的请求,并指定回调函数为 `parse` 本身,以便处理下一页。 需要注意的是,`response.follow` 返回的是一个 `Request` 对象,因此我们必须使用 `yield` 来返回它。 另外,引用[4]中提到,我们也可以重写 `start_requests` 方法来自定义初始请求。但是,在初始请求的响应中,我们同样可以使用 `response.follow` 来跟进链接。 希望这能帮助你理解 `response.follow` 的使用方法。 </think> 在Scrapy框架中,`response.follow()` 是创建新请求的核心方法,比传统的 `scrapy.Request()` 更简洁智能。以下是详细使用指南: ### 一、基础使用方法 ```python # 1. 直接传入相对URL yield response.follow('/next-page.html', callback=self.parse_detail) # 2. 传入绝对URL(自动处理域名拼接) yield response.follow('https://example.com/page2', callback=self.parse) # 3. 从CSS选择器提取链接 for link in response.css('div.links a'): yield response.follow(link, callback=self.parse_category) # 4. 从XPath提取链接 for link in response.xpath('//a[@class="next"]'): yield response.follow(link, self.parse_next_page) ``` ### 二、核心优势 1. **自动URL标准化** 自动将相对URL转为绝对URL,无需手动处理 2. **智能链接提取** 当传入选择器对象时,自动提取 `href/src` 属性(支持 `<a>`、`<link>`、`<img>` 等标签) 3. **继承基础属性** 自动继承当前请求的: - Cookies - Headers - Encoding设置 - Meta数据(通过 `follow()` 的 `meta` 参数可覆盖) ### 三、高级参数配置 ```python yield response.follow( link, callback=self.parse_item, meta={'proxy': 'http://proxy.example.com'}, # 覆盖元数据 headers={'Referer': response.url}, # 自定义请求头 cb_kwargs={'page_num': 2}, # 传递给回调函数的参数 errback=self.error_handler # 错误处理函数 ) ``` ### 四、与scrapy.Request对比 | 特性 | `response.follow()` | `scrapy.Request()` | |---------------------|---------------------------|----------------------------| | URL处理 | 自动绝对路径转换 | 需手动`urljoin`处理 | | 选择器支持 | 直接解析`href/src` | 需先提取属性值 | | 继承当前请求上下文 | 自动继承 | 需手动配置`dont_filter`等 | | 代码简洁度 | ⭐⭐⭐⭐ | ⭐⭐ | ### 五、实战示例(分页爬取) ```python import scrapy class BookSpider(scrapy.Spider): name = 'books' start_urls = ['https://books.com/catalog'] def parse(self, response): # 提取图书详情页链接 for book in response.css('div.book-title a'): yield response.follow(book, self.parse_book) # 自动翻页(带页码追踪) next_page = response.css('li.next-page a').attrib['href'] if next_page: yield response.follow( next_page, callback=self.parse, meta={'page': response.meta.get('page', 1) + 1} ) def parse_book(self, response): yield { 'title': response.css('h1::text').get(), 'price': response.css('.price::text').get(), 'current_page': response.meta['page'] # 接收传递的页码 } ``` ### 六、注意事项 1. **回调函数必须定义**:未设置`callback`时默认使用父级的`parse()`方法 2. **Meta数据传递**:需显式传递才能维持上下文(如登录状态) 3. **重复URL过滤**:默认启用`dont_filter=False`,相同URL自动去重 4. **链接提取限制**:非标准链接元素需改用`scrapy.Request(response.urljoin(...))` > 技术要点:`response.follow()` 本质是封装了 `scrapy.Request` 的快捷方法,自动处理URL拼接和选择器解析,大幅简化跟进链接的代码量 [^1][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值