如何模拟请求中的按钮单击?

时间:2020-02-22 14:25:16

标签: python web-scraping beautifulsoup python-requests urllib

请不要关闭此问题-这不是重复的问题。我需要使用here

使用Python请求而不是Selenium来单击按钮

我正在尝试抓取Reverso Context translation examples page。我有一个问题:我只能得到20个示例,然后我需要单击“显示更多示例”按钮页面上存在的很多次,以获取完整的结果列表。只需使用网络浏览器即可完成,但是如何使用Python Requests库呢?

我查看了按钮的HTML代码,但是找不到select Gender, Person, group_concat(PhoneNumber) PhoneNumbrSSS from TableContacts where Person = (select Person from TableContacts where id = 1) group by Gender, Person 属性来查看附加到该按钮的JS脚本,而且我不明白我需要发送什么请求:

| Gender | Person | PhoneNumbrSSS       |
| ------ | ------ | ------------------- |
| Male   | Jhon   | 500000001,500000002 |

这是我的Python代码:

onclick

注意: 您需要登录,否则它将仅显示前10个示例,并且不显示按钮。您可以使用以下真实身份验证数据:
电子邮件: reverso.scraping@yahoo.com
密码:示例

1 个答案:

答案 0 :(得分:0)

这是一个使用requests获取所有例句的解决方案,并使用BeautifulSoup从其中删除所有HTML标记:

from bs4 import BeautifulSoup
import requests
import json


headers = {
    "Connection": "keep-alive",
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "X-Requested-With": "XMLHttpRequest",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
    "Content-Type": "application/json; charset=UTF-8",
    "Content-Length": "96",
    "Origin": "https://context.reverso.net",
    "Sec-Fetch-Site": "same-origin",
    "Sec-Fetch-Mode": "cors",
    "Referer": "https://context.reverso.net/^%^D0^%^BF^%^D0^%^B5^%^D1^%^80^%^D0^%^B5^%^D0^%^B2^%^D0^%^BE^%^D0^%^B4/^%^D0^%^B0^%^D0^%^BD^%^D0^%^B3^%^D0^%^BB^%^D0^%^B8^%^D0^%^B9^%^D1^%^81^%^D0^%^BA^%^D0^%^B8^%^D0^%^B9-^%^D1^%^80^%^D1^%^83^%^D1^%^81^%^D1^%^81^%^D0^%^BA^%^D0^%^B8^%^D0^%^B9/cat",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
}

data = {
    "source_text": "cat",
    "target_text": "",
    "source_lang": "en",
    "target_lang": "ru",
    "npage": 1,
    "mode": 0
}

npages = requests.post("https://context.reverso.net/bst-query-service", headers=headers, data=json.dumps(data)).json()["npages"]
for npage in range(1, npages + 1):
    data["npage"] = npage
    page = requests.post("https://context.reverso.net/bst-query-service", headers=headers, data=json.dumps(data)).json()["list"]
    for word in page:
        print(BeautifulSoup(word["s_text"]).text, "=", BeautifulSoup(word["t_text"]).text)

首先,我收到了Google Chrome DevTools的请求:

  1. 按下 F12 键将其输入并选择“网络”标签
  2. 点击“显示更多示例”按钮
  3. 找到了最后一个请求(“ bst-query-service”)
  4. 右键单击它,然后选择复制>复制为cURL(cmd)

然后,我打开this online-tool,将复制的cURL插入左侧的文本框中,并复制右侧的输出(为此使用 Ctrl-C 热键,否则可能不会工作)。

之后,将其插入到IDE中:

  1. 删除了cookies字典-在这里没有必要
  2. 重要提示:将data字符串重写为Python字典,并用json.dumps(data)包裹起来,否则,它返回一个带有空单词列表的请求。
  3. 添加了一个脚本,该脚本:获取多次以获取单词(“页面”),并创建了一个for循环,该循环获取了该次数的单词并在不使用HTML标签的情况下将它们打印出来(使用BeautifulSoup)< / li>

UPD:
对于那些访问了该问题以学习如何使用Reverso Context(不仅仅是模拟其他网站上的按钮单击请求)的人,有一个针对Reverso API的Python包装器发布:Reverso-API。它可以执行与上述相同的操作,但更简单:

from reverso_api.context import ReversoContextAPI


api = ReversoContextAPI("cat", "", "en", "ru")
for source, target in api.get_examples_pair_by_pair():
    print(highlight_example(source.text), "==", highlight_example(target.text))