详解使用scrapy进行模拟登陆三种方式
本文详细介绍在Scrapy框架中实现模拟登录的三种核心方式:直接携带Cookies、使用FormRequest发送POST请求以及利用from_response自动解析表单。通过GitHub登录示例,解析代码逻辑与配置要点,帮助开发者掌握不同场景下的最佳实践。
在Scrapy框架中,实现模拟登录主要包含三种常用策略:第一种是直接携带已获取的Cookies进行访问;第二种是定位目标URL并手动发送POST请求以存储或验证Cookie;第三种则是定位具体的Form表单,自动解析其中的Input标签及POST请求地址,自动填充数据并发送请求。
1、携带Cookies登录GitHub
import scrapy
import re
class Login1Spider(scrapy.Spider):
name = 'login1'
allowed_domains = ['github.com']
start_urls = ['https://github.com/NoobPythoner'] # 这是一个需要登陆以后才能访问的页面
def start_requests(self): # 重构start_requests方法
# 这个cookies_str是抓包获取的
cookies_str = '...' # 抓包获取
# 将cookies_str转换为cookies_dict
cookies_dict = {i.split('=')[0]:i.split('=')[1] for i in cookies_str.split('; ')}
yield scrapy.Request(
self.start_urls[0],
callback=self.parse,
cookies=cookies_dict
)
def parse(self, response): # 通过正则表达式匹配用户名来验证是否登陆成功
result_list = re.findall(r'noobpythoner|NoobPythoner', response.body.decode())
print(result_list)
pass
注意:
在Scrapy中,Cookies不应放置在Headers中,而是在构造Request对象时通过专门的cookies参数传入,该参数接受字典形式的Cookie数据。同时,需要在setting文件中配置ROBOTS协议遵循策略及USER_AGENT用户代理。
2、使用scrapy.FormRequest()登录
通过调用scrapy.FormRequest可以发送POST请求,此时需添加formdata参数作为请求体数据,并指定callback回调函数处理响应。
yield scrapy.FormRequest(
"https://github.com/session",
formdata={
"authenticity_token":authenticity_token,
"utf8":utf8,
"commit":commit,
"login":"****",
"password":"****"
},
callback=self.parse_login
)
3、使用scrapy.FormRequest.from_response登录GitHub
import scrapy
import re
class Login3Spider(scrapy.Spider):
name = 'login3'
allowed_domains = ['github.com']
start_urls = ['https://github.com/login']
def parse(self, response):
yield scrapy.FormRequest.from_response(
response, # 传入response对象,自动解析
# 可以通过xpath来定位form表单,当前页只有一个form表单时,将会自动定位
formxpath='//*[@id="login"]/form',
formdata={'login': '****', 'password': '***'},
callback=self.parse_login
)
def parse_login(self,response):
ret = re.findall(r"noobpythoner|NoobPythoner", response.text)
print(ret)
到此这篇关于详解使用scrapy进行模拟登陆三种方式的文章就介绍到这了,更多相关scrapy模拟登陆内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









