当前位置:首页 > Python > 正文

Python重写start_requests方法教程 - 详解Scrapy爬虫初始请求

Python Scrapy中重写start_requests方法教程

本文详细介绍了在Scrapy框架中重写start_requests方法的各种应用场景和实现技巧,包含多个实用代码示例。

什么是start_requests方法?

在Scrapy框架中,start_requests方法是爬虫的入口点,负责生成爬虫的初始请求。默认情况下,Scrapy会读取start_urls列表并为其创建Request对象。

为什么要重写start_requests?

  • 需要自定义请求头(如User-Agent、Cookies)
  • 需要POST请求而非默认的GET请求
  • 需要从文件或数据库读取起始URL
  • 需要为不同URL设置不同回调函数
  • 需要动态生成请求参数

基本重写方法

import scrapy

class MySpider(scrapy.Spider):
    name = 'my_spider'
    
    def start_requests(self):
        # 自定义起始URL
        urls = [
            'https://example.com/page1',
            'https://example.com/page2'
        ]
        for url in urls:
            # 创建Request对象并设置回调函数
            yield scrapy.Request(url=url, callback=self.parse)
    
    def parse(self, response):
        # 解析响应内容
        pass

实用场景示例

1. 添加自定义请求头

def start_requests(self):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
        'Accept-Language': 'zh-CN,zh;q=0.9'
    }
    urls = [...]  # 你的URL列表
    
    for url in urls:
        yield scrapy.Request(
            url=url, 
            headers=headers,
            callback=self.parse
        )

2. 发送POST请求

def start_requests(self):
    # 登录请求示例
    login_url = 'https://example.com/login'
    form_data = {
        'username': 'your_username',
        'password': 'your_password'
    }
    
    # 发送POST请求
    yield scrapy.FormRequest(
        url=login_url,
        formdata=form_data,
        callback=self.after_login
    )

3. 使用不同回调函数

def start_requests(self):
    # 为不同URL设置不同回调
    urls = [
        ('https://example.com/news', self.parse_news),
        ('https://example.com/products', self.parse_products)
    ]
    
    for url, callback in urls:
        yield scrapy.Request(url=url, callback=callback)

4. 从文件读取URL

def start_requests(self):
    with open('urls.txt', 'r') as f:
        urls = [line.strip() for line in f if line.strip()]
    
    for url in urls:
        yield scrapy.Request(url=url, callback=self.parse)

高级应用场景

1. 分页请求处理

def start_requests(self):
    base_url = "https://example.com/products?page={}"
    
    # 生成1-10页的请求
    for page in range(1, 11):
        url = base_url.format(page)
        yield scrapy.Request(
            url=url,
            callback=self.parse_products,
            meta={'page': page}  # 传递额外数据
        )

2. 使用代理和自定义设置

def start_requests(self):
    urls = [...]  # 你的URL列表
    
    for url in urls:
        yield scrapy.Request(
            url=url,
            callback=self.parse,
            meta={'proxy': 'http://user:pass@proxy_ip:port'},  # 设置代理
            dont_filter=True  # 不过滤重复请求
        )

注意事项

  1. 使用yield返回Request对象而不是return
  2. 确保为每个请求设置了正确的回调函数
  3. 处理请求异常和重试逻辑
  4. 避免在start_requests中进行阻塞操作
  5. 使用dont_filter=True参数防止重复请求被过滤

通过重写start_requests方法,你可以完全控制Scrapy爬虫的初始请求行为,实现各种复杂场景下的爬取需求。掌握这一技巧能显著提高爬虫开发的灵活性和效率。

发表评论