首页 > 编程问答 >由于分页,无法使用 python al beautifulsoup 在 tripadvisor 中获取所有结果

由于分页,无法使用 python al beautifulsoup 在 tripadvisor 中获取所有结果

时间:2024-08-07 15:55:51浏览次数:11  
标签:python web-scraping beautifulsoup tripadvisor

我正在尝试获取餐厅的链接,但我只能获取前 30 家餐厅的链接,而无法获取所有其他餐厅的链接。 马德里地区的餐馆有数百家,分页每页只显示 30 家,以下代码只获取这 30 家

import re
import requests
from openpyxl import Workbook
from bs4 import BeautifulSoup as b

city_name = 'Madrid'
geo_code = '187514'

headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)       Chrome/91.0.4472.124 Safari/537.36"
}

data = requests.get(
"https://www.tripadvisor.com//Restaurants-g{}-{}.html".format(geo_code, city_name), headers=headers
).text

for link in re.findall(r'"detailPageUrl":"(.*?)"', data):
        print("https://www.tripadvisor.com.sg/" + link)
        next_link = "https://www.tripadvisor.com.sg/" + link
        f.write('%s\n' % next_link)

你说的没错!问题在于 TripAdvisor 通过 JavaScript 动态加载分页内容,而你的代码目前只抓取了初始页面。

为了获取所有餐厅链接,你需要模拟分页的行为并依次访问每一页。这里有两种主要的方法:

方法一:分析并请求 TripAdvisor 的 API

TripAdvisor 使用 API 来加载分页数据。你可以通过浏览器开发者工具(Network 标签)观察网络请求,找到相应的 API URL。

一般来说,API 的 URL 会包含页码、排序方式等参数。你需要分析这些参数的规律,然后使用循环结构依次请求每一页的数据,直到获取所有餐厅链接。

这种方法的优点是效率高,缺点是需要分析 API 的参数结构,如果 TripAdvisor 修改了 API,你的代码可能需要调整。

方法二:使用 Selenium 或 Playwright 等浏览器自动化工具

Selenium 和 Playwright 可以模拟真实用户的浏览器行为,包括点击分页按钮、滚动页面等。你可以使用这些工具加载每一页的内容,然后使用 BeautifulSoup 解析餐厅链接。

以下是使用 Selenium 的示例代码:

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
from bs4 import BeautifulSoup

city_name = 'Madrid'
geo_code = '187514'

# 使用 Chrome 浏览器
driver = webdriver.Chrome()  
# 替换为你的 ChromeDriver 路径: driver = webdriver.Chrome(executable_path="/path/to/chromedriver")

url = f"https://www.tripadvisor.com//Restaurants-g{geo_code}-{city_name}.html"
driver.get(url)

while True:
    # 等待页面加载完成
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'pageNumbers')))

    # 使用 BeautifulSoup 解析当前页面的餐厅链接
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    for link in soup.find_all('a', {'class': 'bGoCa'}):  # 根据实际情况修改 class 名称
        print(link['href'])

    # 查找下一页按钮
    try:
        next_button = driver.find_element(By.XPATH, "//a[@class='nav next rndBtn ui_button primary taLnk'][contains(., 'Next')]")  # 根据实际情况修改 XPath
        next_button.click()
    except:
        # 没有找到下一页按钮,说明已经到达最后一页
        break

driver.quit()

这种方法的优点是不需要分析 API,代码更简洁易懂。缺点是效率较低,因为需要加载完整的网页内容。

你需要根据实际情况选择适合你的方法,并根据 TripAdvisor 网站的结构调整代码。

标签:python,web-scraping,beautifulsoup,tripadvisor
From: 75316907

相关文章

  • 改进删除文件和目录的 python 脚本运行时间
    我有一个Python脚本,可以删除X天之前的文件和目录。然而,该脚本运行在一个包含数百万个文件和目录的巨大目录上。按照目前的速度,完成删除过程大约需要六周时间(查看磁盘空间指标)。看来主要瓶颈在于列出文件和目录。任何人都可以建议代码更改或优化,以帮助减少运行时间?不......
  • python+flask计算机毕业设计新冠疫情后病历管理系统(程序+开题+论文)
    志羽·羽场管理与智能推荐系统2220o本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景新冠疫情的爆发对全球医疗体系产生了深远影响,特别是在病历管理方面。传统的病历管理方式在面对大规模......
  • python+flask计算机毕业设计微信小程序“班级小管家”(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展和移动互联网的普及,微信小程序作为一种轻量级的应用程序,凭借其无需下载、即用即走的特性,在教育领域展现出了巨大的......
  • 您好,我有一个关于仅使用 python 3.10 发送电子邮件附件的问题
    我在发送包含附件的电子邮件时遇到问题。我的电子邮件的内容类型似乎设置不正确,这导致附件无法正确附加。这是我的电子邮件发送功能的片段:python复制代码self.send(subject=self.subject、recipients=self.recipients、html=""、text=""、attachments=self.attac......
  • python+flask计算机毕业设计社区居民信息管理系统 (程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加快,社区居民信息管理成为社区管理的重要组成部分。传统的社区管理方式存在信息更新不及时、管理效率低下等问题,难以满足......
  • Python安装教程(含MacOS&&Linux系统)
    Python安装教程Windows用户访问Python官网:WelcometoPython.org 打开下载好的安装包根据提示安装   Pip换源(系统级别)(注:Pip在3.4以上的版本才支持,3.4之前的版本可以在cmd中输入 easy_installpip 下载pip)1.为什么要换源?Python安装......
  • python
    字符串比较按位比较,有一位大,整体就大。函数多返回值正确:deftest_return():return1,2,3错误:return1return2函数的多种传参方式位置参数:关键字参数:函数调用时通过“键=值”的形式传递参数(传参顺序无所谓)eg:test(name="niu",age="19")缺省参数:举例说明:def......
  • 将普通 python 文件导入另一个文件时出现 AttributeError
    我是新手。我正在尝试将简单的python文件导入到我的主文件中。相同的代码在我的mac上工作,但在我的电脑上不起作用。我不断收到此错误消息。“AttributeError:模块‘logo’没有属性‘hammer_logo’”第一个文件拍卖.py代码importlogoprint(logo.hammer_logo)第......
  • 使用python读取mysql数据,并记录到本地的文件中
    上次写过一次读取sqlserver数据,写入本地文件。今天分享一下mysql的。原理相似,希望对大家有小小的帮忙PS,我是3.6.13版本python,上一版本用包mysql-connector,一直不成功,查询官方文档,发现这个版本的PYTHON简直是奇葩的存在了。基本所有版本都支持,就是几个小版本排除在外了。......
  • python合并音视频-通过moviepy模块合并音视频
    ......