python - 从单击“显示更多”时 URL 不变的站点中抓取数据
问题描述
我正在尝试从网站上抓取所有文章链接,并且我成功地这样做了。
网站页面有一个Show more
用于加载更多文章的按钮。
我正在使用 Selenium 单击此按钮,该按钮也可以使用。
问题是单击Show more
不会更改页面的 URL,因此我只能抓取默认显示的初始链接。
这是代码片段:
def startWebDriver():
global driver
options = Options()
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(executable_path = '/home/Downloads/chromedriver_linux64/chromedriver',options=options)
startWebDriver()
count = 0
s = set()
driver.get('https://www.nytimes.com/search? endDate=20181231&query=trump&sort=best&startDate=20180101')
time.sleep(4)
element = driver.find_element_by_xpath('//*[@id="site-content"]/div/div/div[2]/div[2]/div/button')
while(count < 10):
element.click()
time.sleep(4)
count=count+1
url = driver.current_url
我希望点击Show More
10 次后所有文章链接都显示在页面上
解决方案
这是我在网络选项卡中看到的使用 API 信息的 POST 请求的模拟。我已经剥离了似乎需要的标题。
import requests
url = 'https://samizdat-graphql.nytimes.com/graphql/v2'
headers = {
'nyt-app-type': 'project-vi',
'nyt-app-version': '0.0.3',
'nyt-token': 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlYOpRoYg5X01qAqNyBDM32EI/E77nkFzd2rrVjhdi/VAZfBIrPayyYykIIN+d5GMImm3wg6CmTTkBo7ixmwd7Xv24QSDpjuX0gQ1eqxOEWZ0FHWZWkh4jfLcwqkgKmfHJuvOctEiE/Wic5Qrle323SMDKF8sAqClv8VKA8hyrXHbPDAlAaxq3EPOGjJqpHEdWNVg2S0pN62NSmSudT/ap/BqZf7FqsI2cUxv2mUKzmyy+rYwbhd8TRgj1kFprNOaldrluO4dXjubJIY4qEyJY5Dc/F03sGED4AiGBPVYtPh8zscG64yJJ9Njs1ReyUCSX4jYmxoZOnO+6GfXE0s2xQIDAQAB'
}
data = '''
{"operationName":"SearchRootQuery","variables":{"first":10,"sort":"best","beginDate":"20180101","text":"trump","cursor":"YXJyYXljb25uZWN0aW9uOjk="},"extensions":{"persistedQuery":{"version":1,"sha256Hash":"d2895d5a5d686528b9b548f018d7d0c64351ad644fa838384d94c35c585db813"}}}
'''
with requests.Session() as r:
re = r.post(url, headers = headers, data = data)
print(re.json())
推荐阅读
- javascript - 通过 Javascript ECMAscript 问题输入文本
- google-drive-api - 通过“access_token”访问 Google 幻灯片视频
- reactjs - React 和 Socket.io | useState 在输入中生成新的套接字连接 onChange
- python - 在 Python3 中使用解析器模块评估表达式的时间复杂度(theta)是多少?
- c# - C#:String[] of lines,使用带有 ToCharArray() 的 2D char 数组来存储每一行?
- c# - @Html.DropDownListFor onchange 没有调用提到的 Action 方法
- apache-spark - LAST (not NULL) 在少数记录上给出了不正确的答案 (Apache Spark SparkSQL)
- oracle - ORA-00926 缺少值关键字
- c++ - 在 SFML (C++) 中启动新窗口
- wpf - WPF - 如何在 Mahapps HamburgerMenuItem 中使用徽章