scrapy-设置请求头

当我们大量使用scrapy 请求一个网站的时候我们知道scrapy默认的请求头是:
这里写图片描述
可以看到默认的请求头就是scrapy,这样就很容易导致浏览器封掉的可能,这个时候我们就需要给请求加一个请求头来模拟浏览器,一般的可以这样做:
这里写图片描述
可以直接在spider文件中添加custom_settings 这个设置,代码如下:

custom_settings = {
    'LOG_LEVEL': 'DEBUG',
    'LOG_FILE': '5688_log_%s.txt' % time.time(),   # 配置的日志
    "DEFAULT_REQUEST_HEADERS": {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    }
}   # 添加的请求头

当然也可以随机的添加请求头,步骤如下:
第一步, 在settings文件中添加一些UserAgent,在这里笔者是查找别人的:

USER_AGENT_LIST=[
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

同时在settings文件中设置 “DOWNLOADER_MIDDLEWARES”

DOWNLOADER_MIDDLEWARES = {
   # 'lagou.middlewares.LagouDownloaderMiddleware': 543,
    'lagou(项目的名称).middlewares.RandomUserAgentMiddleware': 400,
    scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None
}

第二步骤, 在 middlewares.py 文件中导入 settings模块中的 USER_AGENT_LIST 方法

from lagou.settings import USER_AGENT_LIST

同时在这个文件中添加以下的操作:

class RandomUserAgentMiddleware(object):
    def process_request(self, request, spider):
        rand_use  = random.choice(USER_AGENT_LIST)
        if rand_use:
            request.headers.setdefault('User-Agent', rand_use)

图片显示:

这里写图片描述
这样就可以了。

原创,转载需标明作者和来源。违者必究。

<think>我们正在讨论如何在Scrapy设置请求头。根据用户提供的引用,有几种不同的方法可以设置请求头。下面我将总结这些方法,并给出示例代码。 ### 方法1:在单个请求中设置headers(适用于特定请求) 在`scrapy.Request`或`scrapy.FormRequest`中直接设置`headers`参数。 ```python import scrapy class MySpider(scrapy.Spider): name = 'example_spider' start_urls = ['http://example.com'] def start_requests(self): for url in self.start_urls: yield scrapy.Request( url=url, callback=self.parse, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Referer': 'http://example.com', # 其他自定义请求头 } ) def parse(self, response): # 解析响应 pass ``` ### 方法2:在Spider中设置默认请求头(适用于该Spider的所有请求) 在Spider类中定义`custom_settings`,设置`DEFAULT_REQUEST_HEADERS`。 ```python import scrapy class MySpider(scrapy.Spider): name = 'example_spider' start_urls = ['http://example.com'] custom_settings = { 'DEFAULT_REQUEST_HEADERS': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', # 其他默认请求头 } } def parse(self, response): # 解析响应 pass ``` ### 方法3:通过中间件设置请求头(全局或随机User-Agent) 创建一个下载中间件来设置请求头。这种方法可以设置全局的请求头,或者实现随机User-Agent。 #### 步骤1:创建中间件 在`middlewares.py`文件中添加一个中间件类: ```python import random class RandomUserAgentMiddleware: def __init__(self, user_agents): self.user_agents = user_agents @classmethod def from_crawler(cls, crawler): # 从设置中获取USER_AGENT_LIST user_agents = crawler.settings.get('USER_AGENT_LIST', []) if not user_agents: # 默认提供一些User-Agent user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0' ] return cls(user_agents) def process_request(self, request, spider): # 随机选择一个User-Agent request.headers['User-Agent'] = random.choice(self.user_agents) # 也可以设置其他固定请求头 # request.headers['Referer'] = 'http://example.com' ``` #### 步骤2:启用中间件 在`settings.py`中启用该中间件,并可以设置`USER_AGENT_LIST`(可选): ```python DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.RandomUserAgentMiddleware': 400, # 数字代表中间件的顺序,一般400-500之间 } # 可选:自定义USER_AGENT_LIST USER_AGENT_LIST = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...', # 更多User-Agent ] ``` ### 注意事项: 1. **优先级**:单个请求中设置的headers优先级最高,其次是中间件,最后是`DEFAULT_REQUEST_HEADERS`。 2. **User-Agent**:为了避免被网站封禁,建议使用随机User-Agent中间件。 3. **其他请求头**:如Referer、Cookie等也可以类似设置。 ### 调试请求头 可以使用`scrapy shell`来查看请求头是否设置成功: ```bash scrapy shell 'http://example.com' >>> view(response.request) # 查看请求头 ``` ### 总结 - 对于单个请求,直接在`Request`中设置`headers`。 - 对于整个Spider,使用`custom_settings`中的`DEFAULT_REQUEST_HEADERS`。 - 对于全局且需要动态变化(如随机User-Agent),使用下载中间件。 [^1][^2][^3][^4][^5] §§相关问题§§ 1. Scrapy中如何设置动态变化的User-Agent? 2. 如何为Scrapy中的所有请求添加相同的请求头? 3. Scrapy中间件设置请求头的原理是什么? 4. 在Scrapy中如何管理多个不同的请求头? 5. Scrapy请求头设置中如何避免被目标网站反爬?</think>### Scrapy设置请求头的完整指南 在Scrapy设置请求头主要有以下几种方法,根据需求选择合适的方式: #### 方法1:在单个请求中设置(推荐) ```python import scrapy class MySpider(scrapy.Spider): name = 'header_example' def start_requests(self): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Referer': 'https://example.com', 'Accept-Language': 'zh-CN,zh;q=0.9', 'X-Custom-Header': 'value' } yield scrapy.Request( url='https://example.com', callback=self.parse, headers=headers # 直接设置请求头 ) def parse(self, response): # 处理响应 ``` **特点**: - 最灵活的方式,可为不同请求设置不同请求头 - 适合需要动态设置头信息(如CSRF令牌)的场景 - 优先级最高,会覆盖其他设置[^1][^4] #### 方法2:设置默认请求头(全局生效) ```python class MySpider(scrapy.Spider): name = 'global_header' custom_settings = { 'DEFAULT_REQUEST_HEADERS': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Accept': 'text/html,application/xhtml+xml', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive' } } def parse(self, response): # 所有请求都会自动使用这些请求头 ``` **特点**: - 影响该爬虫的所有请求 - 在`settings.py`中设置会全局生效 - 优先级低于单个请求的设置[^3] #### 方法3:使用中间件设置随机User-Agent(防封禁推荐) 1. 创建中间件文件`middlewares.py`: ```python import random class RandomUserAgentMiddleware: USER_AGENTS = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0' ] def process_request(self, request, spider): request.headers['User-Agent'] = random.choice(self.USER_AGENTS) ``` 2. 在`settings.py`中启用中间件: ```python DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.RandomUserAgentMiddleware': 400, } ``` **特点**: - 自动为每个请求设置随机User-Agent - 有效避免因固定User-Agent被封禁 - 可扩展为设置其他动态头信息[^5] #### 方法4:通过Scrapy项目设置 在`settings.py`中全局设置: ```python DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } ``` #### 最佳实践建议: 1. **优先使用随机User-Agent中间件**,防止被目标网站封禁[^2][^5] 2. **敏感头信息通过环境变量管理**: ```python import os headers = {'Authorization': f'Bearer {os.getenv("API_TOKEN")}'} ``` 3. **动态设置CSRF令牌**: ```python def parse(self, response): token = response.css('meta[name="csrf-token"]::attr(content)').get() yield FormRequest(..., headers={'X-CSRF-Token': token}) ``` 4. **调试技巧**: ```bash scrapy shell --nolog 'https://example.com' >>> req = scrapy.Request(url, headers={...}) >>> fetch(req) # 查看实际发送的请求头 ``` [^1][^2][^3][^4][^5]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值