python - url 不适用于代码,但手动搜索有效
问题描述
我正在尝试在我的 python 代码中输入一个字符串,以将其转换并实现为 URL 以在网站上搜索字符串。我正在使用的网站是 songbpm.com,我想要的是搜索一首歌曲,我会收到歌曲的速度。在 HTML 中查找相关信息不是问题,我已经完成了这个,并且我的 url 创建正在工作,这里是:
import urllib.request
import urllib.parse
song = input("")
fin = ""
for i in song:
if i == "(":
tempone = song
song = tempone.split("(")[0] + tempone.split(") ")[1]
previous = ""
for i in song:
if i.isalpha():
temp = fin
fin = temp + i
else:
if previous.isalpha():
temp = fin
fin = temp + "-"
previous = i
songencoded = urllib.parse.quote(song, safe='')
print('https://songbpm.com/'+ fin.lower() + '?q=' + songencoded)
response = urllib.request.urlopen('https://songbpm.com/'+ fin.lower() + '?q=' + songencoded)
text = str(response.read()).split('\\n')
当我在网站上手动输入搜索输入时,返回的 url 与 url 相同,但是,当我运行此代码时,它总是读取 html 数据以进行无结果重定向。
此外,如果我将计算机生成的 URL 粘贴到浏览器中,它会重定向到无结果页面,但是,在浏览器中手动搜索相同的字符串后,计算机生成的 URL 也可以正常工作(重试时)。
我还观察到的是,在手动打开某个 URL 后,我可以使用相同的搜索查询运行代码并且它可以工作 - 如果用户而不是代码打开它,似乎搜索被缓存了一段时间.
我如何解决这个代码问题,虽然生成了确切的 URL,但无法打开与用户相似的网页。
解决方案
好的,我不知道这个网站的驱动力是什么,但您可以使用无头浏览器,而不是在 url 中查找歌曲,您可以在搜索中键入您要查找的歌曲的名称 -盒子,它会工作的!抱歉,我没有正确回答您的问题
这是一个 100% 工作的代码 :) 玩得开心
import bs4
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
options =webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options = options)
url = ('https://songbpm.com/')
while True:
driver.get(url)
inputElement = driver.find_element_by_id("search-field")
inputElement.send_keys(str(input("Enter name of a song: \n>")))
inputElement.send_keys(Keys.ENTER)
html = driver.page_source
soup= bs4.BeautifulSoup(html, "html.parser")
for node in soup.findAll("a", {"class": "media"}):
print("ARTIST:",node.find("p", {"class":"artist-name"}).text.strip())
print("SONG:",node.find("p", {"class": "track-name"}).text.strip())
print("*"*20)
推荐阅读
- python - Python中DF的水平条形图
- azure-devops - Azure DevOps 管道任务以删除 AppService 设置中的密钥
- java - Cassandra - 启动期间遇到异常(java.lang.UnsatisfiedLinkError):找不到依赖库(jna626409071981896679.dll)
- javascript - 使用 sinon 存根私有函数
- c++ - 将字符串转换为 char 数组,然后再转换回字符串
- vb.net - VB.Net如何在代码中将目录附加到Path env变量
- android-studio - 我可以使用 IConnectivityManager、IWifiManager 或 ServiceManager 吗?
- wordpress - 更改一页的 Wordpress 网站标题
- heroku - 从 Heroku 上的 Strapi 部署的麻烦
- google-sheets - Google 表格:以逗号分隔的列表返回员工姓名;按季节位置过滤并按资历排名