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
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)