使用scrapy进行模拟登陆三种方式

本文介绍了使用Scrapy框架模拟登录网站的三种方法:直接携带cookies、使用scrapy.FormRequest发送POST请求以及利用scrapy.FormRequest.from_response自动化处理登录流程。

scrapy有三种方法模拟登陆方式:

- 直接携带cookies
- 找url地址,发送post请求存储cookie
- 找到对应的form表单,自动解析input标签,自动解析post请求的url地址,自动带上数据,自动发送请求
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中cookie不能够放在headers中,在构造请求的时候有专门的cookies参数,能够接受字典形式的coookie
  • 在setting中设置ROBOTS协议、USER_AGENT

2、使用scrapy.FormRequest()登录

通过scrapy.FormRequest能够发送post请求,同时需要添加fromdata参数作为请求体,以及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是一个强大的Python爬虫框架,用于高效地抓取网站数据。如果你需要模拟登录某个网站,Scrapy可以配合第三方库如Requests或Selenium来完成这个过程。以下是基本步骤: 1. 安装依赖:首先,你需要安装`scrapy`、`requests`(默认支持HTTP请求)和`selenium`(如果目标网站有JavaScript验证)。 ```bash pip install scrapy requests selenium (如果需要) ``` 2. 创建Scrapy项目:使用`scrapy startproject your_project_name`命令创建一个新的Scrapy项目。 3. 导入必要的模块:在`settings.py`文件中添加对Selenium的支持,并设置一个中间件处理登录,例如: ```python DOWNLOADER_MIDDLEWARES = { 'your_project.middlewares.SeleniumMiddleware': 543, } ``` 4. 编写中间件(Middlewares):创建`middlewares/SeleniumMiddleware.py`文件,这里通常会使用`webdriver_manager`来管理浏览器驱动,然后初始化Selenium实例: ```python from scrapy import signals from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager class SeleniumMiddleware: def __init__(self): self.driver = webdriver.Chrome(ChromeDriverManager().install()) @classmethod def from_crawler(cls, crawler): middleware = cls() crawler.signals.connect(middleware.spider_opened, signal=signals.spider_opened) return middleware def spider_opened(self, spider): # 开启浏览器并导航到登录页面 self.driver.get(spider.login_url) def process_request(self, request, spider): if spider.is_login_required and 'login_form_data' in request.meta: # 提交表单数据,模拟登录 form_data = request.meta['login_form_data'] self.driver.find_element_by_name(form_data['username_field']).send_keys(form_data['username']) self.driver.find_element_by_name(form_data['password_field']).send_keys(form_data['password']) login_button = self.driver.find_element_by_css_selector(form_data['submit_button']) login_button.click() # 如果需要保持登录状态,可以在每个后续请求前检查cookie等信息 # ... return request ``` 5. 使用中间件:在Scrapy项目的spiders目录下,编写一个spider,将登录需求作为元数据传递给中间件: ```python class LoginSpider(scrapy.Spider): name = "login_spider" allowed_domains = ["example.com"] start_urls = ['http://example.com/login'] def is_login_required(self): return True def parse(self, response): # 登录成功后的解析逻辑 ... ``` 6. 设置登录数据和启动爬虫:在运行spider之前,指定登录表单的数据(用户名、密码、提交按钮等),然后通过`scrapy crawl`命令启动。 ```bash scrapy crawl login_spider -a login_form_data={"username_field": "username", "password_field": "password", "submit_button": ".btn-login"} ``` 注意:并非所有网站都支持直接模拟登录,某些网站可能需要验证码、OAuth授权等方式。此外,频繁的模拟登录可能会触发反爬机制或违反服务条款,因此在实际操作时需谨慎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值