原文件下载路径:
【Scrapy框架】模拟登录与中间件应用:Web爬虫中cookie管理及请求响应处理机制详解
模拟登录与中间件
响应头返回的set-cookie值.
用session就可以自动帮你完成cookie管理和携带
一. Scrapy处理cookie
在requests中我们讲解处理cookie主要有两个方案. 第一个方案. 从浏览器里直接把cookie搞出来. 贴到heades里. 这种方案, 简单粗暴. 第二个方案是走正常的登录流程. 通过session来记录请求过程中的cookie. 那么到了scrapy中如何处理cookie? 其实也是这两个方案.
首先, 我们依然是把目标定好, 还是我们的老朋友,
我爱读电子书 http://www.woaige.net/login.php
url: http://www.woaidu.cc/bookcase.php
这个url必须要登录后才能访问(用户书架). 对于该网页而言, 就必须要用到cookie了. 首先, 创建项目, 建立爬虫. 把该填的地方填上.
import scrapy
from scrapy import Request, FormRequest
class LoginSpider(scrapy.Spider):
name = 'login'
allowed_domains = ['woaidu.cc']
start_urls = ['http://www.woaidu.cc/bookcase.php']
def parse(self, response):
print(response.text)
此时运行时, 显示的是该用户还未登录. 不论是哪个方案. 在请求到start_urls里面的url之前必须得获取到cookie. 但是默认情况下, scrapy会自动的帮我们完成其实request的创建. 此时, 我们需要自己去组装第一个请求. 这时就需要我们自己的爬虫中重写start_requests()方法. 该方法负责起始request的组装工作. 我们不妨先看看原来的start_requests()是如何工作的.
# 以下是scrapy源码
def start_requests(self):
cls = self.__class__
if not self.start_urls and hasattr(self, 'start_url'):
raise AttributeError(
"Crawling could not start: 'start_urls' not found "
"or empty (but found 'start_url' attribute instead, "
"did you miss an 's'?)")
if method_is_overridden(cls, Spider, 'make_requests_from_url'):
warnings.warn(
"Spider.make_requests_from_url method is deprecated; it "
"won't be called in future Scrapy releases. Please "
"override Spider.start_requests method instead (see %s.%s)." % (
cls.__module__, cls.__name__
),
)
for url in self.start_urls:
yield self.make_requests_from_url(url)
else:
for url in self.start_urls:
# 核心就这么一句话. 组建一个Request对象.我们也可以这么干.
yield Request(url, dont_filter=True)
自己写个start_requests()看看.
def start_requests(self):
print("我是万恶之源")
yield Request(
url=LoginSpider.start_urls[0],
callback=self.parse
)
接下来, 我们去处理cookie
1. 方案一, 直接从浏览器复制cookie过来
import scrapy
class DengSpider(scrapy.Spider):
name = "deng"
allowed_domains = ["woaidu.cc"]
start_urls = ["http://www.woaidu.cc/bookcase.php"]
def start_requests(self):
cookies = "Hm_lvt_155d53bb19b3d8127ebcd71ae20d55b1=1725014283,1725263893,1725264973; HMACCOUNT=0BFAD8D83E97B549; username=User; t=727289967466d574c47bb09; Hm_lpvt_155d53bb19b3d8127ebcd71ae20d55b1=1725265123"
cookie_dic = {
}
for cook in cookies.split("; "):
k,v = cook.split("=")
cookie_dic[k] = v
yield scrapy.Request(url=self.start_urls[0], cookies=cookie_dic)
def parse(self, resp, **kwargs):
# 检测cookie是否可以延续
yield scrapy.Request(url=self.start_urls