将loginform与scrapy一起使用

2024-05-05 22:01:37 发布

您现在位置:Python中文网/ 问答频道 /正文

scrapy框架(https://github.com/scrapy/scrapy)提供了一个库,用于登录需要身份验证的网站时,https://github.com/scrapy/loginform
我已经查看了这两个程序的文档,但是我似乎不知道如何让scrapy在运行之前调用loginform。登录仅使用loginform即可正常工作。
谢谢


Tags: 文档https程序githubcom框架身份验证网站
2条回答

我设法让它在没有loginform库的情况下工作,我的解决方案如下。

import scrapy
import requests

class Spider(scrapy.Spider):
    name = 'spider'

    start_urls = [
        'http://start.com',
    ]

    def start_requests(self):
        return [scrapy.FormRequest("login.php",
                               formdata={'username': 'user', 'password': 'pass'},
                               callback=self.start_crawl)]

    def start_crawl(self, response):
        #start crawling

loginform只是一个库,与Scrapy完全分离。

必须编写代码才能将其插入所需的蜘蛛中,可能是在回调方法中。

下面是执行此操作的结构示例:

import scrapy
from loginform import fill_login_form

class MySpiderWithLogin(scrapy.Spider):
    name = 'my-spider'

    start_urls = [
        'http://somewebsite.com/some-login-protected-page',
        'http://somewebsite.com/another-protected-page',
    ]

    login_url = 'http://somewebsite.com/login-page'

    login_user = 'your-username'
    login_password = 'secret-password-here'

    def start_requests(self):
        # let's start by sending a first request to login page
        yield scrapy.Request(self.login_url, self.parse_login)

    def parse_login(self, response):
        # got the login page, let's fill the login form...
        data, url, method = fill_login_form(response.url, response.body,
                                            self.login_user, self.login_password)

        # ... and send a request with our login data
        return scrapy.FormRequest(url, formdata=dict(data),
                           method=method, callback=self.start_crawl)

    def start_crawl(self, response):
        # OK, we're in, let's start crawling the protected pages
        for url in self.start_urls:
            yield scrapy.Request(url)

    def parse(self, response):
        # do stuff with the logged in response

相关问题 更多 >