使用场景:
有一些页面,必须要在登陆情况下才能展示,比如个人页面。当用户登陆成功后,会在浏览器端保存一个cookie的值,有了这个值,就可以不用每次都进行登陆,就可以直接访问个人页面了。
具体步骤如下:
修改settings:
代码:
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36"
# Obey robots.txt rules
# ROBOTSTXT_OBEY = True
进入某一个网站:
登陆后,进入个人页面:(假设我想获取余额这个值)
打开F12.,获取cookie:复制下来
新建爬虫文件:(将cookie放在temp中,并且循环得到 json格式的内容并通过scrapy.Request发送)
代码:
import scrapy
class NewSpider(scrapy.Spider):
name = "cgj"
allowed_domains = ["***.com"]
start_urls = ["https://www.***.com/Home/User/index.html"]
def start_requests(self):
url = self.start_urls[0]
temp = '*********此处是cookie的内容*************'
cookies = {data.split('=')[0]: data.split('=')[1] for data in temp.split(';')}
yield scrapy.Request(
url=url,
callback=self.parse,
cookies=cookies
)
def parse(self, response):
yuer = response.xpath('/html/body/div[6]/ul[1]/li/font[1]/b/text()').get()
print("yuer===="+yuer)
以上是自己使用浏览器登陆的情况下,再模拟cookie进行获取页面数据的过程。如果要自己模拟用户名和密码的输入,该如何实现?
使用scrapy.FormRequest
对应的php服务器端代码:(特别注意:login.php之后是直接进入my.php,所以爬虫文件不需要再进入my.php去获取数据,而直接在前往login.php之后直接根据返回的页面进行获取数据)
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Form</title>
</head>
<body>
<h2>Login Form</h2>
<form action="login.php" method="post">
<label for="username">Username:</label><br>
<input type="text" id="username" name="username" value="admin"><br>
<label for="password">Password:</label><br>
<input type="password" id="password" name="password" value="123456"><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
login.php
<?php
// 获取从表单提交的用户名和密码
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
// 假设正确的用户名和密码是 admin 和 123455
$correct_username = 'admin';
$correct_password = '123456';
// 验证用户名和密码
if ($username === $correct_username && $password === $correct_password) {
// 如果验证通过,设置一个会话变量来存储用户名
session_start();
$_SESSION['username'] = $username;
// 跳转到 my.html 页面
header('Location: my.php');
exit;
} else {
// 如果验证不通过,可以返回到登录页面或者显示错误信息
echo 'Invalid username or password. Please try again.';
}
?>
my.php
<!-- my.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome</title>
</head>
<body>
<h2>Welcome</h2>
<?php
session_start();
// 检查会话中是否有存储的用户名
if (isset($_SESSION['username'])) {
$username = $_SESSION['username'];
echo "<p>Hello,<div id='username'>$username!!</div> </p>";
echo "<p>This is your personalized page.</p>";
} else {
// 如果没有存储的用户名,可以返回到登录页面或者显示错误信息
echo "<p>Access denied. Please login first.</p>";
// 如果需要,可以提供返回登录页面的链接
// echo '<p><a href="index.html">Go back to login</a></p>';
}
?>
</body>
</html>