python - 在本网站上使用 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)
看完后,我知道我应该尝试找到身份验证方法,但是我没有运气。
其余工作正常(抓取网页链接)
谢谢!
解决方案
在这种情况下,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
推荐阅读
- audiokit - Audiokit:(V5)音序器无法在轨道的同一位置同时播放音符
- java - 保存 ImageView 背景状态
- python - 基维不工作。[CRITICAL] [Window] 找不到任何有价值的 Window 提供程序
- javascript - 如何在反应中并排放置两个输入字段
- oop - Fortran 派生类型继承
- .net - .Net 核心项目中的 CodeCoverage -MSBuild 错误
- django - 为什么在迁移以下模型时出现“引用非模型本地的字段”错误?
- node.js - RxJS 调度程序
- php - Imagick 安装成功但发生错误:未捕获错误:找不到类 'imagick'
- vba - 未调用 Outlook VBA 事件处理程序