使用Scrapy登录此网站时出现问题

2024-06-10 11:50:45 发布

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

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

该网站是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)

阅读之后,我明白我应该尝试找到身份验证方法,但我没有运气

其余的工作正常(删除网页链接)

谢谢


Tags: httpsselfcomurl网站responsedefcallback
1条回答
网友
1楼 · 发布于 2024-06-10 11:50:45

FormRequest.from_响应在这种情况下不起作用,因为Scrapy没有可见的表单(它是动态加载的)。要么用类似Splash的东西呈现页面,要么自己创建post请求。您可以通过在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

相关问题 更多 >