熟练使用Cookies在编写爬虫程序时是非常重要的,Cookies代表用户的信息,如果需要爬取登录后网页的信息,就可以将Cookies信息保存,然后在第二次获取登录后的信息时就不需要再次登录了,直接使用Cookies进行登录即可。
import scrapy
class CookiespiderSpider(scrapy.Spider):
# 爬虫名称
name = 'cookieSpider'
# 域名列表
allowed_domains = ['httpbin.org/get']
# 请求初始化列表
start_urls = ['http://httpbin.org/get']
# 模拟Cookies信息
cookies = {'CookiesDemo': 'python'}
def start_requests(self):
# 发送网络请求,请求地址为start_urls列表中的第一个地址
yield scrapy.Request(url=self.start_urls[0], cookies=self.cookies, callback=self.parse)
# 响应信息
def parse(self, response):
# 打印响应结果
print(response.text)
pass
程序运行结果如下:
{
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "en",
"Cookie": "CookiesDemo=python",
"Host": "httpbin.org",
"User-Agent": "Scrapy/2.5.1 (+https://scrapy.org)",
"X-Amzn-Trace-Id": "Root=1-620f78be-7272752a5bfe1e53464471ff"
},
"origin": "122.143.185.159",
"url": "http://httpbin.org/get"
}
注 意
以上示例代码中的Cookies是一个模拟测试所使用的信息,并不是一个真实有效的Cookies信息,所以在使用时需要将Cookies信息设置为爬取网站对应的真实Cookies。
在Scrapy中除了使用以上示例代码中的方法设置Cookies以外,也可以使用自定义中间件的方式设置Cookies。以爬取某网站登录后的用户名信息为列,具体实现步骤如下:
import scrapy
class CookiespiderSpider(scrapy.Spider):
# 爬虫名称
name = 'cookieSpider'
# 域名列表
allowed_domains = ['douban.com']
# 请求初始化列表
start_urls = ['http://douban.com/']
def start_requests(self):
# 发送网络请求,请求地址为start_urls列表中的第一个地址
yield scrapy.Request(url=self.start_urls[0], callback=self.parse)
# 响应信息
def parse(self, response):
# 打印登录后的用户名信息
print(response.xpath('//*[@id="db-global-nav"]/div/div[1]/ul/li[2]/a/span[1]/text()').extract_first())
pass
# 导入CrawlerProcess类
from scrapy.crawler import CrawlerProcess
# 导入获取项目设置信息
from scrapy.utils.project import get_project_settings
# 程序入口
if __name__=='__main__':
# 创建CrawlerProcess类对象并传入项目设置信息参数
process = CrawlerProcess(get_project_settings())
# 设置需要启动的爬虫名称
process.crawl('cookieSpider')
# 启动爬虫
process.start()
# 自定义Cookies中间件
class CookiesdemoMiddleware(object):
# 初始化
def __init__(self, cookies_str):
self.cookies_str = cookies_str
@classmethod
def from_crawler(cls, crawler):
return cls(
# 获取配置文件中的Cookies信息
cookies_str = crawler.settings.get('COOKIES_DEMO')
)
# 保持格式化后的Cookies
cookies = {}
def process_request(self, request, spider):
# 通过';'分割Cookies字符串
for cookie in self.cookies_str.split(';'):
# 将key与值进行分割
key, value = cookie.split('=', 1)
# 将分割后的数据保存至字典中
self.cookies.__setitem__(key, value)
# 设置格式化以后的Cookies
request.cookies = self.cookies
# 导入请求头类
from fake_useragent import UserAgent
# 自定义随机请求头的中间件
class RandomHeaderMiddleware(object):
# 随机请求头对象
def __init__(self, crawler):
self.ua = UserAgent()
# 如果配置文件中不存在就使用默认的Google Chrome请求头
self.type = crawler.settings.get('RANDOM_UA_TYPE', 'chrome')
@classmethod
def from_crawler(cls, crawler):
# 返回cls()实例对象
return cls(crawler)
# 发送网络请求时调用该方法
def process_request(self, request, spider):
# 设置随机生成的请求头
request.headers.setdefault('User-Agent', getattr(self.ua, self.type))
DOWNLOADER_MIDDLEWARES = {
# 启动自定义cookies中间件
'cookiesDemo.middlewares.CookiesdemoMiddleware': 201,
# 启动自定义随机请求头中间件
'cookiesDemo.middlewares.RandomHeaderMiddleware':202,
# 禁用默认生成的配置信息
'cookiesDemo.middlewares.CookiesdemoDownloaderMiddleware': None,
}
# 定义从浏览器中获取的Cookies
COOKIES_DEMO = '此处填写您自己登录网页后中的Cookie信息'
程序运行结果如下:
2022-02-18 21:17:49 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.douban.com/> (referer: None)
bruce_liu的帐号
2022-02-18 21:17:49 [scrapy.core.engine] INFO: Closing spider (finished)
与抓包工具里显示的登录用户信息完全一致。