scrapy设置headers,cookies

时间:2024-05-19 10:46:34

scrapy中有三种方式设置headers,cookies

  • setting中设置cookie
  • middlewares中设置cookie
  • sipder文件中重写start_requests方法

这里记录第三种,重写start_requests方法,这里以豆瓣网为例

一、设置请求头headers

在start_request中新增

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
    }​

二、设置cookies

1、登录豆瓣网并获取cookie

  • 首先在chrome中登录豆瓣网
  • 按F12调出开发者工具
  • 查看cookie

scrapy设置headers,cookies

2、在start_requests中新增

cookies = {
    'key':'value',
    'key':'value',
    'key':'value'
    }​

需要注意的是,从浏览其中复制的cookie格式为key=value; key=value; key=value,而scrapy中需要转换为字典格式

3、修改方法返回值

yield scrapy.Request(url=url, headers=headers, cookies=cookies, callback=self.parse)​​

4、修改COOKIES_ENABLED

  • 当COOKIES_ENABLED是注释的时候scrapy默认没有开启cookie
  • 当COOKIES_ENABLED没有注释设置为False的时候scrapy默认使用了settings里面的cookie
  • 当COOKIES_ENABLED设置为True的时候scrapy就会把settings的cookie关掉,使用自定义cookie

因此在settings.py文件中设置COOKIES_ENABLED = True​

5、修改COOKIES_ENABLED

在settings.py文件中设置ROBOTSTXT_OBEY = False​

三、测试

1、新建scrapy爬虫项目

scrapy stratproject douban

2、在./doouban/spiders/下新建short_spider.py文件

# -*- coding: utf-8 -*-
import scrapy

class ShortSpider(scrapy.Spider):
    name = 'short'
    allow_domains = ['movie.douban.com']

    # 重写start_requests方法
    def start_requests(self):

        # 浏览器用户代理
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
        }
        # 指定cookies
        cookies = {
            'key':'value',
            'key':'value',
            'key':'value'
        }
        urls = [
            'https://movie.douban.com/subject/26266893/comments?start=250&limit=20&sort=new_score&status=P'
        ]
        for url in urls:
            yield scrapy.Request(url=url, headers=headers, cookies=cookies, callback=self.parse)

    def parse(self, response):
        file_name = 'data.html'
        with open(file_name, 'wb') as f:
            f.write(response.body)

 因为豆瓣电影短评论对未登录用户有限制,因此这里使用豆瓣电影段评论数比较靠后的页数进行测试

3、进入douban目录执行scrapy crawl short

状态码200,爬取成功(无权限返回403)

scrapy设置headers,cookies

scrapy设置headers,cookies