首页 > 解决方案 > 在本网站上使用 Scrapy 登录时遇到问题

问题描述

我正在尝试创建一个爬虫,它首先登录到网站,然后继续爬到其他页面。

该网站是https://login.globo.com/login/6668?url=https://valor.globo.com/

在摆弄了一下之后,我想出了这个(我已经导入了库和东西):

class CrawlSite(scrapy.Spider):
name = 'WebCrawl'

start_urls = ('https://login.globo.com/login/6668?url=https://valor.globo.com/')

def login_valor(self, response):
    return FormRequest.from_response(response,
                                     formdata={
                                               'password': 'password.',
                                               'login': 'username'},
                                     callback=self.scrape_links)
def scrape_links(self):
    urls = ['https://valor.globo.com/impresso/20200501/']   
    
    
    for url in urls:
            yield scrapy.Request(url, callback= self.parse_normal)

看完后,我知道我应该尝试找到身份验证方法,但是我没有运气。

其余工作正常(抓取网页链接)

谢谢!

标签: pythonauthenticationscrapy

解决方案


在这种情况下,FormRequest.from_response 将不起作用,因为 Scrapy 没有可见的表单(它是动态加载的)。您可以使用 Splash 之类的内容呈现页面,或者您自己创建后请求。您可以通过在 Chrome 中打开开发者工具来了解其工作原理,并在手动登录时检查“网络”选项卡。基于此,我认为下面的代码应该可以工作(我无法真正测试,因为我没有该网站的登录名):

import scrapy
import json


class CrawlSite(scrapy.Spider):
    name = 'WebCrawl'
    start_urls = ['https://login.globo.com/login/6668?url=https://valor.globo.com/']
    login_url = 'https://login.globo.com/api/authentication'
    username = 'test_username'
    password = 'test_password'
    headers = {'authority': 'login.globo.com',
               'referer': 'https://login.globo.com/login/6668?url=https'
                          '://valor.globo.com/',
               'origin': 'https://login.globo.com',
               'content-type': 'application/json; charset=UTF-8',
               'accept': 'application/json, text/javascript',
               'accept-language': 'en-GB,en;q=0.9,nl-BE;q=0.8,nl;q=0.7,'
                                  'ro-RO;q=0.6,ro;q=0.5,en-US;q=0.4,fr;q=0.3,'
                                  'it;q=0.2',}

    def parse(self, response):
        payload = {
            'payload': {
                'email': self.username,
                'password': self.password,
                'serviceId': 6668,  # better get this value from the html
            },
            'captcha': ''
        }

        yield scrapy.Request(
            url='https://login.globo.com/api/authentication',
            body=json.dumps(payload),
            method='POST',
            headers=self.headers,
            callback=self.scrape_links
        )

    def scrape_links(self, response):
        urls = ['https://valor.globo.com/impresso/20200501/']
        for url in urls:
            yield scrapy.Request(url, callback=self.parse_normal)

    def parse_normal(self, response):
        pass


推荐阅读