1. 分析登录请求
使用浏览器开发者工具(F12)分析登录请求:
- 登录URL地址
- 请求方法(通常是POST)
- 提交的表单数据
- 必要的请求头(如User-Agent, Content-Type)
掌握网站登录技术,突破爬虫访问限制
许多网站的内容需要用户登录后才能访问。使用Scrapy实现模拟登录可以:
使用浏览器开发者工具(F12)分析登录请求:
Scrapy提供了FormRequest类专门用于处理表单提交:
import scrapy
class LoginSpider(scrapy.Spider):
name = 'login_spider'
start_urls = ['https://example.com/login']
def parse(self, response):
# 提取CSRF令牌(如果存在)
csrf_token = response.css('input[name="csrf_token"]::attr(value)').get()
# 构造FormRequest提交登录表单
return scrapy.FormRequest.from_response(
response,
formdata={
'username': 'your_username',
'password': 'your_password',
'csrf_token': csrf_token # 如果网站有CSRF保护
},
callback=self.after_login
)
def after_login(self, response):
# 检查登录是否成功
if "Logout" in response.text:
self.log("登录成功!")
# 登录成功后开始爬取其他页面
yield scrapy.Request("https://example.com/dashboard", callback=self.parse_dashboard)
else:
self.log("登录失败!", level=scrapy.log.ERROR)
Scrapy会自动处理Cookies,确保后续请求保持登录状态。如果需要手动处理:
# 在settings.py中启用Cookies中间件
COOKIES_ENABLED = True
# 手动处理Cookies示例
def start_requests(self):
# 首先获取登录页以设置初始Cookies
yield scrapy.Request(
url='https://example.com/login',
callback=self.parse_login_page
)
def parse_login_page(self, response):
# 从响应中获取Cookies
cookies = response.headers.getlist('Set-Cookie')
# 使用获取的Cookies发送登录请求
yield scrapy.FormRequest(
url='https://example.com/login',
formdata={'username': 'user', 'password': 'pass'},
cookies=cookies,
callback=self.after_login
)
对于有验证码的网站,可以使用以下解决方案:
# 验证码处理示例
def parse(self, response):
# 提取验证码图片URL
captcha_url = response.css('img.captcha::attr(src)').get()
if captcha_url:
# 请求验证码图片
yield scrapy.Request(
url=response.urljoin(captcha_url),
callback=self.parse_captcha,
meta={'login_response': response}
)
def parse_captcha(self, response):
# 保存验证码图片(实际项目中会使用OCR识别)
with open('captcha.png', 'wb') as f:
f.write(response.body)
# 人工输入验证码
captcha_text = input("请输入验证码: ")
# 使用验证码继续登录
response = response.meta['login_response']
return scrapy.FormRequest.from_response(
response,
formdata={
'username': 'user',
'password': 'pass',
'captcha': captcha_text
},
callback=self.after_login
)
import scrapy
class ExampleLoginSpider(scrapy.Spider):
name = "example_login"
login_url = "https://www.example.com/login"
start_urls = [login_url]
def parse(self, response):
# 提取登录所需的隐藏字段
formdata = {
'username': 'your_username',
'password': 'your_password'
}
# 查找隐藏的表单字段
hidden_fields = response.css('form input[type="hidden"]')
for field in hidden_fields:
name = field.css('::attr(name)').get()
value = field.css('::attr(value)').get()
if name:
formdata[name] = value
# 提交登录请求
yield scrapy.FormRequest(
url=self.login_url,
formdata=formdata,
callback=self.check_login
)
def check_login(self, response):
# 验证登录是否成功
if "Welcome" in response.text:
self.logger.info("登录成功!")
# 访问需要登录的页面
yield scrapy.Request(
url="https://www.example.com/dashboard",
callback=self.parse_dashboard
)
else:
self.logger.error("登录失败!")
def parse_dashboard(self, response):
# 解析登录后的页面
user_info = {
'username': response.css('.user-name::text').get(),
'email': response.css('.user-email::text').get(),
'last_login': response.css('.last-login::text').get()
}
yield user_info
# 继续爬取其他链接
for link in response.css('.nav-links a::attr(href)').getall():
yield response.follow(link, callback=self.parse_page)
def parse_page(self, response):
# 解析其他页面的逻辑
pass
不要在代码中明文存储用户名和密码:
完善的登录失败处理机制:
确保长时间运行的爬虫保持会话:
A: 可能原因:
A: 解决方案:
A: 防护措施:
本文由PengTui于2025-08-17发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://pjw.521pj.cn/20258368.html
发表评论