【问题标题】:Can't scrape names from a table using requests无法使用请求从表中刮取名称
【发布时间】:2021-04-23 06:08:51
【问题描述】:

我正在尝试从在网页中选择某些选项时填充的表格中抓取名称。这是在该站点中生成表的options。但是,当我尝试使用下面的脚本执行相同操作时,我总是得到状态 500。我使用 selenium 获得了成功,所以我没有寻求任何基于 selenium 的解决方案。

webpage address

到目前为止我已经写了:

import requests
from bs4 import BeautifulSoup

link = 'https://rederef-saude.appspot.com/proximidade/prestador/buscar?'

params = {
    'canal': '1',
    'latitude': '-23.5505199',
    'longitude': '-46.63330939999999',
    'categoria': '1',
    'produto': '557',
    'plano': '18051',
    'nome': '',
    'qualificacoes': '',
    'prefixoEmpresa': '',
    'empresa': '',
    'especialidade': '',
    'procedimento': '',
    'tipoPesquisaProcedimento': '1',
    'raio': '200000'
}

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
    'referer': 'https://rederef-saude.appspot.com/rederef/buscaPrestadores?login=publico&canal=1&data=23/04/2021&hora=00:16:55&tipoProduto=M&produto=557&plano=18051',
    'x-requested-with': 'XMLHttpRequest',
    'content-type': 'application/json;charset=utf-8',
    'accept': '*/*',
    'captcha-token': ''
}
with requests.Session() as s:
    s.headers = headers
    res = s.get(link,params=params)
    print(res.status_code)

如何使用请求从该表中抓取名称?

【问题讨论】:

  • 不要将? 放在您的网址中。 requests 将在添加参数时添加它。你确定这是一个 GET 请求,而不是 POST?
  • 是的,这是一个获取请求。
  • 有什么关于recaptcha的吗?
  • 当我使用 selenium 创建脚本时,我没有遇到任何验证码,所以我认为它是一个占位符。
  • Chrome 也不会向您提供验证码,但如果您从 F12 网络选项卡记录会话,那里会发生很多事情,对重新验证码不太熟悉,但我想这很重要。 selenium 是否在 captcha-token 参数中设置了某些内容?

标签: python python-3.x web-scraping python-requests


【解决方案1】:

当检查请求时,它确实有 recaptcha 保护,只是它处于一种不可见模式,只有在需要时才会显示,这甚至需要来自第一次调用的 cookie,否则它会给出无效会话错误,因此对于 recaptcha 自动化解决方案(付费但相当便宜)他们的各种提供商,例如:2Captcha、Anti-Captcha、CapMonster 等 我已经使用了 2Captcha,你可以按照下面的代码。 参考2Captcha Library

import requests
from twocaptcha import TwoCaptcha

solver = TwoCaptcha('Twocaptcha API KEY')
result = solver.recaptcha(sitekey='6LdOzkUaAAAAANV9z7gQOokV2kNWI8WI_eSH80vC',
                          url='https://rederef-saude.appspot.com', invisible=1)["code"]
params = {
    'login': 'publico',
    'canal': 1,
    'data': '23/04/2021',
    'hora': '04:10:41',
    'tipoProduto': 'M',
    'produto': 557,
    'plano': 18051
}
cookies = requests.get(
    'https://rederef-saude.appspot.com/rederef/buscaPrestadores', params=params).cookies

headers = {
    'captcha-token': result,
}
params = {
    'canal': '1',
    'latitude': '-23.5505199',
    'longitude': '-46.63330939999999',
    'categoria': '1',
    'produto': '557',
    'plano': '18051',
    'nome': '',
    'qualificacoes': '',
    'prefixoEmpresa': '',
    'empresa': '',
    'especialidade': '',
    'procedimento': '',
    'tipoPesquisaProcedimento': '1',
    'raio': '200000'
}
response = requests.get('https://rederef-saude.appspot.com/proximidade/prestador/buscar', headers=headers,
                        params=params, cookies=cookies)

print(response.json())

不要忘记更新上述代码中的Twocaptcha API KEY。 您可以使用任何您觉得可以的提供商。 输出将在 json 中,因此无需使用 BeautifulSoup 输出:

如果您有任何问题,请告诉我:)

【讨论】:

  • 在 Recaptcha 所在的页面上,您可以在求解器中使用该页面的 URL,也可以在最后使用主域,我猜求解器会将唯一域发送到求解器服务器。我错误地使用了ajax URL,但是两者的域是相同的,所以没关系。我只用基域修改了代码。
猜你喜欢
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多