我正在尝试使用website从Scrapy抓取一堆文本消息,目前在进行任何抓取之前,我一直处于身份验证阶段。
[更具体地说,我无法通过目标网站的登录屏幕进入该页面,该网站中的reCAPTCHA复选框如下图所示。问题在于,它会一直重定向到原始登录链接,以及机械手复选框的验证错误。
我已经搜索了社区中所有类似的问题,并尝试使用从浏览器中复制带有经过身份验证的会话的cookie的解决方案(在我手动登录后),以便我可以将它们与Scrapy一起使用,但仍然可以不起作用。
到目前为止是我的代码:
import ...
class CrawlerSpider(scrapy.Spider):
name = "test"
allowed_domains = ["chatwork.com"]
start_urls = [
"https://www.chatwork.com/#!rid178468980"
#this is the link contains the data i want but only available after valid authentication
]
def start_requests(self):
my_cookies = {
'IDE': 'AHWqTUndZmIFDWBVb1ykpytLr0WAZOuBRQ8q363qEvII08rf3386rKljf4OVYIFp',
#...some other lines copied from browser after manually logged in
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/80.0.3987.132 Safari/537.36'
}
for i, url in enumerate(self.start_urls):
yield scrapy.Request(url, cookies=my_cookies, headers=headers, callback=self.parse)
def parse(self, response):
#... get data by scrapy Selector
yield
[我还根据本文here尝试了另一种解决方案,其中我使用了Scraper API,因为我认为它可以以某种方式“处理” reCAPTCHA,但仍然无法正常工作。
这是我的Scraper API方式代码:
import ...
class LoginSpider(scrapy.Spider):
name = 'crawler_handle_captcha'
url_link = "https://www.chatwork.com/login.php?args="
API_KEY = '...'
start_urls = ['http://api.scraperapi.com/?api_key=' + API_KEY + '&url=' + url_link +
'&render=true']
def parse(self, response):
return [FormRequest.from_response(
response,
formxpath='//form[@name="login"]',
formdata={'email': '[email protected]', 'password': 'sample'},
callback=self.after_login
)]
def after_login(self, response):
return scrapy.Request(url="https://www.chatwork.com/#!rid178468980",
callback=self.parse_page)
def parse_page(self, response):
#... get data by scrapy Selector
yield
任何帮助将不胜感激!
没有一种“简便”的方式来处理草率的Recaptcha。
但是您可以使用2captcha之类的验证码解决服务来通过其API解决该问题。它是有偿服务,但很便宜。
[recaptcha将由服务解决时,您将获得答案代码,要登录,您必须创建登录请求(通常是带有登录名和密码的POST请求),然后将已解决的验证码cookie添加到请求中。