使用 selenium 登录到 stackoverflow 可以正常工作,但是使用 scrapy python 是 not.How 我可以使用无头浏览登录吗?
Login to stackoverflow using selenium is working but using scrapy python is not.How can I login with headless browsing?
我一直在尝试自动登录到 Whosebug 以学习网络抓取。首先我尝试了 scrapy,但使用下面的代码我并没有那么幸运。
import scrapy
from scrapy.utils.response import open_in_browser
class QuoteSpider(scrapy.Spider):
name = 'Whosebug'
start_urls = ['https://whosebug.com/users/login']
def parse(self, response):
token = response.xpath('.//*[@name="fkey"]/@value').extract_first()
yield scrapy.FormRequest('https://whosebug.com/users/login?ssrc=head&returnurl=https://whosebug.com/',
formdata = {
'fkey': token,
"ssrc": "head",
'username': "example@gmail.com",
'password': 'example123',
'oauth_version':'',
'oauth_server':''
},callback=self.startscraper)
def startscraper(self,response):
yield scrapy.Request('https://whosebug.com/users/12454709/gopal-kisi',callback=self.verifylogin)
def verifylogin(self,response):
open_in_browser(response)
所以,我后来尝试了 selenium,我使用以下代码成功登录到 Whosebug。
from selenium import webdriver
import pandas as pd
import time
driver = webdriver.Chrome("./chromedriver.exe")
driver.get("https://whosebug.com/users/login?ssrc=head&returnurl=https%3a%2f%2fwhosebug.com%2f")
time.sleep(2)
username = driver.find_element_by_xpath("//*[@id='email']")
username.clear()
username.send_keys("example@gmail.com")
time.sleep(5)
password = driver.find_element_by_xpath("//*[@id='password']")
password.clear()
password.send_keys("example123")
time.sleep(0.5)
driver.find_element_by_xpath("//*[@id='submit-button']").click()
driver.close()
我知道 selenim 和 scrapy 是两种不同的方法。现在,对于抓取,我发现 scrapy 比 selenium 更容易处理和保存数据,而且它使用无头浏览,就像我需要的那样。
那么,有什么办法可以解决scrapy中的登录问题。或者,我可以将 selenium 与 scrapy 合并,这样,我可以使用 selenium 登录,然后剩下的工作可以由 scrapy 完成吗?
- 似乎 url https://whosebug.com/users/login 被 robots.txt 禁止,所以我不确定 Whosebug
是否允许自动执行此操作
- 你不需要Selenium来登录。你可以只使用Scrapy。我以他们官方 documentation 中的示例为基础。您可以使用 FromRequest.from_response 来填充登录所需的大部分字段,只需添加正确的电子邮件和密码即可。以下在 scrapy shell:
中对我有用
from scrapy import FormRequest
url = "https://whosebug.com/users/login"
fetch(url)
req = FormRequest.from_response(
response,
formid='login-form',
formdata={'email': 'test@test.com',
'password': 'testpw'},
clickdata={'id': 'submit-button'},
)
fetch(req)
除了Wim Hermans的方式,你还可以POST https://whosebug.com/users/login
使用以下参数:
email
: 你的邮箱
password
: 您的密码
fkey
这是一个例子:
import requests
import getpass
from pyquery import PyQuery
# Fetch the fkey
login_page = requests.get('https://whosebug.com/users/login').text
pq = PyQuery(login_page)
fkey = pq('input[name="fkey"]').val()
# Prompt for email and password
email = input("Email: ")
password = getpass.getpass()
# Login
requests.post(
'https://whosebug.com/users/login',
data = {
'email': email,
'password': password,
'fkey': fkey
})
我一直在尝试自动登录到 Whosebug 以学习网络抓取。首先我尝试了 scrapy,但使用下面的代码我并没有那么幸运。
import scrapy
from scrapy.utils.response import open_in_browser
class QuoteSpider(scrapy.Spider):
name = 'Whosebug'
start_urls = ['https://whosebug.com/users/login']
def parse(self, response):
token = response.xpath('.//*[@name="fkey"]/@value').extract_first()
yield scrapy.FormRequest('https://whosebug.com/users/login?ssrc=head&returnurl=https://whosebug.com/',
formdata = {
'fkey': token,
"ssrc": "head",
'username': "example@gmail.com",
'password': 'example123',
'oauth_version':'',
'oauth_server':''
},callback=self.startscraper)
def startscraper(self,response):
yield scrapy.Request('https://whosebug.com/users/12454709/gopal-kisi',callback=self.verifylogin)
def verifylogin(self,response):
open_in_browser(response)
所以,我后来尝试了 selenium,我使用以下代码成功登录到 Whosebug。
from selenium import webdriver
import pandas as pd
import time
driver = webdriver.Chrome("./chromedriver.exe")
driver.get("https://whosebug.com/users/login?ssrc=head&returnurl=https%3a%2f%2fwhosebug.com%2f")
time.sleep(2)
username = driver.find_element_by_xpath("//*[@id='email']")
username.clear()
username.send_keys("example@gmail.com")
time.sleep(5)
password = driver.find_element_by_xpath("//*[@id='password']")
password.clear()
password.send_keys("example123")
time.sleep(0.5)
driver.find_element_by_xpath("//*[@id='submit-button']").click()
driver.close()
我知道 selenim 和 scrapy 是两种不同的方法。现在,对于抓取,我发现 scrapy 比 selenium 更容易处理和保存数据,而且它使用无头浏览,就像我需要的那样。
那么,有什么办法可以解决scrapy中的登录问题。或者,我可以将 selenium 与 scrapy 合并,这样,我可以使用 selenium 登录,然后剩下的工作可以由 scrapy 完成吗?
- 似乎 url https://whosebug.com/users/login 被 robots.txt 禁止,所以我不确定 Whosebug 是否允许自动执行此操作
- 你不需要Selenium来登录。你可以只使用Scrapy。我以他们官方 documentation 中的示例为基础。您可以使用 FromRequest.from_response 来填充登录所需的大部分字段,只需添加正确的电子邮件和密码即可。以下在 scrapy shell: 中对我有用
from scrapy import FormRequest
url = "https://whosebug.com/users/login"
fetch(url)
req = FormRequest.from_response(
response,
formid='login-form',
formdata={'email': 'test@test.com',
'password': 'testpw'},
clickdata={'id': 'submit-button'},
)
fetch(req)
除了Wim Hermans的方式,你还可以POST https://whosebug.com/users/login
使用以下参数:
email
: 你的邮箱password
: 您的密码fkey
这是一个例子:
import requests
import getpass
from pyquery import PyQuery
# Fetch the fkey
login_page = requests.get('https://whosebug.com/users/login').text
pq = PyQuery(login_page)
fkey = pq('input[name="fkey"]').val()
# Prompt for email and password
email = input("Email: ")
password = getpass.getpass()
# Login
requests.post(
'https://whosebug.com/users/login',
data = {
'email': email,
'password': password,
'fkey': fkey
})