Python3 硒问题

2024-01-12

我想通过以下方式抓取一些评论Web page https://hotels.ctrip.com/hotel/347422.html?isFull=F#ctm_ref=hod_sr_lst_dl_n_1_8。当我尝试通过 Selenium 选择转到按钮(更改到下一页)时,它总是显示一个弹出窗口。我尝试使用Selenium关闭弹出窗口,但仍然不起作用。有人可以帮助我吗解决这个问题并帮助我完成下面的next_page()函数?非常感谢!

我已经完成了功能scrape_comments()。我想做的是完成 Function下一页().

这是我的代码。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By

# url
url = "https://hotels.ctrip.com/hotel/347422.html?isFull=F#ctm_ref=hod_sr_lst_dl_n_1_8"

# User Agent
User_Agent_List = ["Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2",
                   "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
                   "Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)",
                   "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
                   "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2",
                   "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1",
                   "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"]

# Define the related lists
Score = []
Travel_Types = []
Room_Types = []
Travel_Dates = []
Comments = []

DEFINE_PAGE = 10

def next_page():
    """
    It is a function to execute Next Page function
    """
    current_page = int(browser.find_element_by_css_selector('a.current').text)

    # First, clear the input box
    browser.find_element_by_id("cPageNum").clear()
    print('Clear the input page')

    # Second, input the next page
    nextPage = current_page + 1
    print('Next page ',nextPage)
    browser.find_element_by_id("cPageNum").send_keys(nextPage)
    
    # Third, press the goto button
    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="cPageBtn"]')))
    browser.find_element_by_xpath('//*[@id="cPageBtn"]').click()


def scrape_comments():
    """
    It is a function to scrape User comments, Score, Room types, Dates.
    """
    html = browser.page_source
    soup = BeautifulSoup(html, "lxml")
    scores_total = soup.find_all('span', attrs={"class":"n"})
    # We only want [0], [2], [4], ...
    travel_types = soup.find_all('span', attrs={"class":"type"})
    room_types = soup.find_all('a', attrs={"class":"room J_baseroom_link room_link"})
    travel_dates = soup.find_all('span', attrs={"class":"date"})
    comments = soup.find_all('div', attrs={"class":"J_commentDetail"})
    # Save score in the Score list
    for i in range(2,len(scores_total),2):
        Score.append(scores_total[i].string)
    Travel_Types.append(item.text for item in travel_types)
    Room_Types.append(item.text for item in room_types)
    Travel_Dates.append(item.text for item in travel_dates)
    Comments.append(item.text.replace('\n','') for item in comments)

if __name__ == '__main__':

    # Random choose a user-agent
    user_agent = random.choice(User_Agent_List)
    print('User-Agent: ', user_agent)

    # Browser options setting
    options = Options()
    options.add_argument(user_agent)
    options.add_argument("disable-infobars")

    # Open a Firefox browser
    browser = webdriver.Firefox(options=options)
    browser.get(url)

    #### My ISSUE #####
    browser.find_element_by_xpath('//*[@id="appd_wrap_close"]').click()

    page = 1    
    while page <= DEFINE_PAGE:
        scrape_comments()
        next_page()
    
    browser.close()

提前致谢!


好吧,看来确实必须切换到某个窗口才能让 Selenium 单击'//*[@id="appd_wrap_close"]'element 和我尝试了一段时间才找到一个。最终我想我偶然发现了阻止您点击该元素的原因。他们有适当的测试跟踪软件。我是这样发现的:首先,我所做的就是显而易见的,检查您试图单击的“x”元素。我试图找到该元素的任何不寻常之处,过了一会儿我注意到有一个Event附于其上。我点击Event在 Firefox 的 Inspector 中看到以下内容:

嗯...我原以为它会关闭它所在的盒子,但它有以下 JavaScript:

function() {
  c.setCookie({
    manualclose: "1"
  }, "", 1), u.collapse(), window.__bfi.push(["_tracklog", "pcfloatClose", location.href + "&urlPageId=" + e + "&htmlType=" + d])
}

嗯,有u.collapse,我猜这是折叠面板所需的所有代码。但为什么还有这些其他的东西呢?有几件事对我来说似乎很奇怪:为什么每次您单击该按钮时它都会设置一个 cookie?以及为什么叫它**manual**close?然后我仔细一看,看到了“点击”后面的文字:_esUnionOnline/R3/float/floating_normal.min.js?20190316:2。嗯。所以他们正在调用一个 javascript 文件。这看起来像是一个 URL。为什么他们要为那个小“x”上的鼠标单击事件而费尽心思呢?

我将鼠标悬停在它上面,果然,它向我显示了https://webresource.c-ctrip.com/ResUnionOnline/R3/float/floating_normal.min.js?20190306:2.

我导航到该网站并找到一个包含缩小版 Javascript 的大文件。我把它通过一个反压缩器(我用过https://unminify.com/ https://unminify.com/)。就在我看到的文档顶部

document.getElementById("ab_testing_tracker") && "abTestValue_Value" != h ? 
document.getElementById("ab_testing_tracker").value

ab_testing_tracker……这听起来不太好。所以我对此进行了搜索并找到了一堆带有 id 的隐藏输入ab_testing_tracker。在这一点上,我非常确信他们正在检测硒并且不让你点击它。在对常见的测试跟踪方法进行一些谷歌搜索后,发现除其他事项外,检查userAgent很常见。正如您所读,Selenium 默认用户代理只是 webdriverhere https://antoinevastel.com/bot%20detection/2018/01/17/detect-chrome-headless-v2.html,所以我对此进行了搜索。果然有20条结果,都是这样的形式navigator.userAgent,还有一些看起来像

i.test(navigator.userAgent)

然后我注意到你正在使用一个随机的、合法的 userAgent,所以他们必须有其他的方法来检测硒。我确实注意到了这个功能

function n() {
    var t, n;
    switch (n = e.ResponseStatus.Errors[0].ErrorCode ? e.ResponseStatus.Errors[0].ErrorCode : "") {
        case "104":
            t = "验证码输入超时";
            break;
        case "105":
            t = "验证码输入错误";
            break;
        case "106":
            t = "手机号码不正确";
            break;
        case "107":
            t = "客户端IP不能为空";
            break;
        case "108":
            t = "短信内容不能为空";
            break;
        case "109":
            t = "同一号码,两分钟内最多发一次";
            break;
        case "110":
            t = "一天内同一手机最多发两次";
            break;
        case "111":
            t = "一天内同一IP最多发五次";
            break;
        default:
            t = "短信发送失败,请重新发送"
    }
    return t
}

在他们的 javascript 中并在谷歌翻译的帮助下发现最后几个开关正在检查您是否已访问该网站一定次数。但不幸的是我无法想出一个真正的方法来解决这个问题......至少在 Firefox 中是这样。

如果您愿意在 Chrome 中进行测试,默认情况下该框会最小化(无论出于何种原因),因此您不必担心删除它。

所以,长话短说,如果你可以在 Chrome 中进行测试,你可以简单地删除以下行,而不必担心愚蠢的框。测试跟踪器可能仍然,我不知道它是如何工作的,我怀疑他们自己编写了它,因为我找不到任何使用这些“ab_test_tracking”节点的工具 - 事实上,谷歌搜索“ab_test_tracking”产生很少的结果结果大部分都是这个网站。

让我知道您的选择是什么(您是否因某种原因需要使用 Firefox?),如果您能够在 Chrome 中运行测试,请告诉我它是否有效!

编辑有关分页按钮的内容因此,我发现您尝试单击以导航到下一页的按钮也是如此 - 它有一个 onClick 事件,该事件还链接到带有测试跟踪的巨大缩小文件,所以我想这就是您的原因无法点击你的按钮,硒永远不会越过第一页。

但“下一步”按钮没有单击时调用的脚本。你should能够点击该按钮

browser.find_element_by_xpath('//*[@id="divCtripComment"]/div[4]/div/a[2]')

让我知道这是否适合您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3 硒问题 的相关文章

随机推荐

  • 如何 pip 安装 Twisted 而不出现错误?

    我正在尝试使用 Pip 在 Windows 10 上安装 Twisted 我知道还有很多关于安装 Twisted 的其他问题 但没有一个与我的错误相符 当我跑步时pip install Twisted 我收到以下错误 ERROR Comma
  • 如何在 iPhone 应用程序上仅支持纵向模式

    我正在开发的 iPhone 应用程序遇到一个奇怪的问题 我希望我的应用程序支持ONLY肖像模式 但由于某种原因我无法做到这一点 设备和模拟器 为了仅支持纵向模式 我做了如下操作 在 Xcode 的 TARGET 摘要部分中 我仅选择了纵向
  • 为情节图形的每个方面添加痕迹

    我想在情节的各个方面添加痕迹 例如 我想向显示 15 小费的 tips 数据集散点图的每个每日方面添加一条参考线 然而 我下面的尝试仅将线添加到第一个方面 import plotly express as px import plotly
  • laravel Socialite 无法在实时服务器上运行,只能在本地计算机上运行

    我最近将我的应用程序移至实时服务器中 问题是 Laravel Socialite 停止工作 解释如下 我点击谷歌登录并选择电子邮件后 回调时会发生这种情况 InvalidStateException on Abstract php on l
  • 有哪些工具可用于编辑联机帮助页,即 GUI WYSIWYG 编辑器(任何平台)

    是否有任何像样的 GUI 图形用户界面 所见即所得 所见即所得 编辑器 在任何平台上 可用于创作 编辑手册页 一个可以导出为 troff 格式的应用程序也可以 Nroff编辑 http aaa sec com nroffedit 最初是为了
  • 刀片模板和单选按钮 - 在 foreach 循环中选择第一个

    我有以下 Blade 模板条目 它创建 作为表行的一部分 一列单选按钮 我只想选择生成的第一个无线电 并且我想通过 PHP 来执行此操作 没有 js post 页面加载 如何检查这是否是我的集合中的 第一个 条目 从而放置字符串checke
  • 结束 Swing 应用程序时出现 JavaFX 错误

    我有一个 Swing 应用程序 需要在其中显示内部生成的 HTML CSS 为了做到这一点 我已经适应了来自这个 StackOverflow 问题的代码 https stackoverflow com questions 13717769
  • 如何合并动物园对象列表

    我有一个动物园对象列表 我想合并它们 我已经确保它们的长度都相同 看来为了合并它们 我需要做类似的事情 merge my list 1 my list 2 但随着列表长度的增加 这很快就会变得很麻烦 有人对处理这个问题有建议吗 Use do
  • Android SpeechRecognizer设置识别引擎?

    我正在使用 SpeechRecognizer 将语音转换为文本 我使用的是三星 当我将语音识别器设置为 Samsungpowered by Vlingo 时遇到错误 在更改为 Google 后错误消失了 我想知道是否有任何方法可以以编程方式
  • Docker:导出镜像失败:创建镜像失败:获取层失败

    我收到以下错误 导出图像失败 创建图像失败 获取图层失败 sha256 xxxxxxxxxxxxx 层不存在 Dockerfile FROM openjdk 8 COPY lib usr src app BOOT INF lib COPY
  • 在 C# vsto Excel 中选择性粘贴

    我正在开发 C vsto Excel 应用程序 每当用户从另一个 Excel 工作表将某些内容粘贴到 Excel 模板中时 它还会将单元格格式与单元格数据一起粘贴到 Excel 模板中 我想避免这种情况 所以我用谷歌搜索 发现了术语 特殊粘
  • 将元素存储在内存中以防止过于频繁地更新 DOM?

    目前我有一个循环在每次迭代中更新 DOM 我知道这是一种不好的做法 您应该尽可能少地更新 DOM 以提高速度 所以我想知道如何编辑下面的内容 以便我可以将所有元素存储在一个元素或其他元素中 然后在循环结束后执行单个 DOM 添加 这是循环
  • 文本不会被 swift UI 包裹

    即使设置后 lineLimit nil 文本不会被换行 var body some View VStack alignment center Text SwiftUI is a modern way to declare user inte
  • 如何设置自定义单元格的角半径

    这是我的示例输出 其中下面的详细信息中有三个单元格 我为每个自定义单元格设置了角半径 但它无法正常工作 第一个单元格的角半径不起作用 第二个单元格的右上角和顶部左边正在工作 请说明为此做什么 void layoutSubviews supe
  • 临时变量的 C++ 生命周期 - 这安全吗?

    如果我正确理解临时对象生命周期的规则 那么这段代码应该是安全的 因为临时对象的生命周期stringstream in make string 持续到完整表达式结束 我不是 100 确信这里没有一个微妙的问题 但有人可以确认这种使用模式是否安
  • 子类化 UICollectionViewLayout 并分配给 UICollectionView

    我有一个 UICollectionViewController void viewDidLoad super viewDidLoad assign layout subclassed below self collectionView co
  • DebugDiag:如何手动注入 LeakTrack.dll

    我有一个来自生产的故障转储来识别内存泄漏 当我使用 DebugDiag v2 update 2 时 我收到一份报告 DebugDiag 没有检测到 w3wp DMP 中加载的 LeakTrack dll 因此没有泄漏 对此文件进行了分析 如
  • 错误:返回 void,return 关键字后面不能跟对象表达式

    private void QuestionAnswer Load object sender EventArgs e txtQuestion Enabled false txtQuestion BackColor Color White g
  • C 预处理器宏扩展

    我很难理解 C 预处理器在以下上下文中如何应用重写规则 我有以下宏 define A x A x define B x B x define X x x 这个想法是 每个宏都使用串联来创建一个新的表达式 它本身可以是一个宏 如果它是一个宏
  • Python3 硒问题

    我想通过以下方式抓取一些评论Web page https hotels ctrip com hotel 347422 html isFull F ctm ref hod sr lst dl n 1 8 当我尝试通过 Selenium 选择转