我的代码正在打开选项卡,搜索主题并关闭,但它没有向我发送它应该收集的链接。
from selenium import webdriver
pesquisa = input ("o que você quer pesquisar: ")
def get_results(search_term):
url = "https://www.startpage.com"
driver = webdriver.Chrome()
driver.get(url)
search_box = driver.find_element_by_id("q")
search_box.send_keys(search_term)
search_box.submit()
try:
links = driver.find_elements_by_xpath("//ol[@class='web_regular_results']//div//a")
except:
links = driver.find_elements_by_xpath("//div//a")
results = []
for link in links:
href = link.get_attribute("href")
print(href)
results.append(href)
driver.close()
return results
get_results(pesquisa)
的代码存在几个可能导致其无法正确抓取链接的问题:
-
页面加载时间: 的代码可能在页面完全加载并生成搜索结果链接之前就尝试找到它们。这会导致找不到任何链接或找到不完整的链接列表。
-
不正确的 XPath: 使用的 XPath 表达式可能无法在 Startpage 的当前 HTML 结构中找到正确的链接元素。网站经常更改其 HTML 结构,这可能会破坏依赖于特定 XPath 的网络抓取工具。
-
JavaScript 呈现: Startpage 可能正在使用 JavaScript 来动态加载搜索结果。如果的代码仅查看初始 HTML 源代码,它将看不到这些动态加载的链接。
以下是如何解决这些问题的更新代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
pesquisa = input("o que você quer pesquisar: ")
def get_results(search_term):
url = "https://www.startpage.com"
driver = webdriver.Chrome()
driver.get(url)
# 等待搜索框出现并输入搜索词
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "q"))
)
search_box.send_keys(search_term)
search_box.submit()
# 等待搜索结果出现
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "web_regular_results"))
)
# 提取链接
links = driver.find_elements_by_xpath("//ol[@class='web_regular_results']//h3/a")
results = [link.get_attribute("href") for link in links]
driver.close()
return results
get_results(pesquisa)
此代码包含以下改进:
-
显式等待:
使用
WebDriverWait
来等待特定元素(搜索框和搜索结果)在尝试与它们交互之前加载。这确保的代码不会过早地尝试查找元素。 -
更强大的 XPath:
使用更具体的 XPath 来定位包含结果链接的
<h3>
元素。 - 更简洁的代码: 使用列表推导来提取和存储链接,从而使代码更简洁易懂。
通过实施这些更改,的代码应该能够更可靠地从 Startpage 中抓取链接。
标签:python,html,web-scraping,hyperlink From: 67874637