使用带有 FORMDATA 的 scrapy 问题使用凭据抓取网站
Scraping website with credentials using scrapy issue with FORMDATA
希望大家平安无事,
我目前正在接受 scrapy 培训,并决定尝试抓取一个需要登录的网站 (Glassdoor)。
我被困住了,想知道是否有人可以检查我到目前为止所做的事情并帮助我?
1)我加载了 glassdoor 登录页面并打开了检查工具(在 Chrome 中),
2) 选择网络部分并在页面中输入我的登录名,登录后我查找具有 302 状态 (POST) 的 login_input.htm 文件,一旦选择我进入 HEADER 部分但我找不到 FORMDATA 部分。所以我没有所有的信息可以添加到我的代码中。
我尝试了很多在线资源,但找不到解决方法?
我还放置了我开始使用的代码:
import scrapy
from scrapy.http import FormRequest
from scrapy.utils.response import open_in_browser
class GdSpider(scrapy.Spider):
name = 'gd'
allowed_domains = ['https://www.glassdoor.co.uk/profile/login_input.htm']
start_urls = ('http://https://www.glassdoor.co.uk/profile/login_input.htm/',)
def parse(self, response):
return FormRequest.from_response(response,
formdata={'password': 'mypassword',
'username': 'myusername'},
callback=self.scrape_pages)
def scrape_pages(self, response):
open_in_browser(response)
谁能告诉我我做错了什么?
谢谢,
阿尔诺
Glasdoor 的登录是一个 JavaScript 呈现的弹出窗口,如果您禁用 JS,当您尝试单击登录 link 或打开您拥有的 link 时,您将看不到任何呈现给出。
这似乎是您要查找的内容:
https://www.glassdoor.com/profile/ajax/loginAjax.htm
当您打开登录弹出窗口并尝试使用任何凭据登录时(可能是错误的,无关紧要),您将在网络选项卡中看到 loginAjax.htm
弹出窗口。这个有一个表单,可以通过 POST 将凭据发送到我在上面发布的 link。
不幸的是,它也会发送带有凭据的令牌,因此使用它登录可能会很困难。
要发送数据,您可以使用 from scrapy.http.request.form import _urlencode
中的 _urlencode
,如下所示:
inputs = [("key", "value"),]
body = _urlencode(inputs, response.encoding)
并通过 POST 将 body
发送到上面的 URL (输入必须是元组列表)构建一个正常的 Scrapy 请求。
希望大家平安无事,
我目前正在接受 scrapy 培训,并决定尝试抓取一个需要登录的网站 (Glassdoor)。
我被困住了,想知道是否有人可以检查我到目前为止所做的事情并帮助我?
1)我加载了 glassdoor 登录页面并打开了检查工具(在 Chrome 中),
2) 选择网络部分并在页面中输入我的登录名,登录后我查找具有 302 状态 (POST) 的 login_input.htm 文件,一旦选择我进入 HEADER 部分但我找不到 FORMDATA 部分。所以我没有所有的信息可以添加到我的代码中。
我尝试了很多在线资源,但找不到解决方法?
我还放置了我开始使用的代码:
import scrapy
from scrapy.http import FormRequest
from scrapy.utils.response import open_in_browser
class GdSpider(scrapy.Spider):
name = 'gd'
allowed_domains = ['https://www.glassdoor.co.uk/profile/login_input.htm']
start_urls = ('http://https://www.glassdoor.co.uk/profile/login_input.htm/',)
def parse(self, response):
return FormRequest.from_response(response,
formdata={'password': 'mypassword',
'username': 'myusername'},
callback=self.scrape_pages)
def scrape_pages(self, response):
open_in_browser(response)
谁能告诉我我做错了什么?
谢谢,
阿尔诺
Glasdoor 的登录是一个 JavaScript 呈现的弹出窗口,如果您禁用 JS,当您尝试单击登录 link 或打开您拥有的 link 时,您将看不到任何呈现给出。
这似乎是您要查找的内容:
https://www.glassdoor.com/profile/ajax/loginAjax.htm
当您打开登录弹出窗口并尝试使用任何凭据登录时(可能是错误的,无关紧要),您将在网络选项卡中看到 loginAjax.htm
弹出窗口。这个有一个表单,可以通过 POST 将凭据发送到我在上面发布的 link。
不幸的是,它也会发送带有凭据的令牌,因此使用它登录可能会很困难。
要发送数据,您可以使用 from scrapy.http.request.form import _urlencode
中的 _urlencode
,如下所示:
inputs = [("key", "value"),]
body = _urlencode(inputs, response.encoding)
并通过 POST 将 body
发送到上面的 URL (输入必须是元组列表)构建一个正常的 Scrapy 请求。