selenium-携程酒店评论

最近好像对这方面需求比较高,总有人问我爬过携程没,我寻思着拿selenium也没太大难度吧,晚上就做了个demo。

这里做的是携程上面天津市酒店的所有评论信息demo,你要问我为啥不拿信息价格类型标签之类的,毕竟是demo嘛,评论跟那些数据在同一页面的,有需要可以自己花点时间改一下。我提的数据直接界面上copy xpath的,只拿了用户的id和他的评论。

下面是测试图,这次放上面。

在这里插入图片描述

那就先说下用selenium拿这个数据时候的坑吧。

刚开始就直接driver.get()看了下,唉发现有数据啊,没啥难度啊,一想又感觉不对劲,就对比了下数据,
观察了下发现,我用webdriver启动的浏览器没有评论,并且酒店的价格也不一样。原来是一个假数据。。。

这么一看那就是 selenium 被检测到了,所以也不考虑到底检测到了哪条属性,为了省时间,我直接用 ChromeOptions 切换成了开发者模式。(方法下面讲)

再次请求,对比数据后发现是一致的。

在这里插入图片描述

这个完成之后,感觉可以直接拿数据了吧,在采集时我发现,他的所有页面都是异步加载的。
也就是说,我在点击下一页的时候,url是不会改变的。
在这里插入图片描述
在这里插入图片描述
这个放代码讲吧。

首先绕过webdriver检测机制

from selenium import webdriver
import time
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
#option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(executable_path=“你的路径”,options=option)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
                """ })

上面方法失效了,更换下面这个

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('useAutomationExtension',False)
chrome_options.add_argument("disable-blink-features")
chrome_options.add_argument("disable-blink-features=AutomationControlled")  
driver=webdriver.Chrome(executable_path=r'你的路径',chrome_options =chrome_options)

然后请求我已经确定好的天津酒店列表页 url。
driver.get(‘https://hotels.ctrip.com/hotel/tianjin3#ctm_ref=hod_hp_sb_lst’)

在这里插入图片描述
这里我要通过点击标题来访问到详情页,然后拿评论信息。

在这直接获取 xpath 来进行点击是不行的,因为有的标题他对应的xpath 并不是完全规范的。

所以我就观察了页面,他的这个data-id是每个都有的,所以可以通过获取他的ID来进行访问,

在这里插入图片描述
但是又有新问题了,在通过获取id后,来get新页面。在selenium中会覆盖当前窗口,一开始我用的是 driver.back(),在采集完后返回之前的列表页,但是因为上面说的他是异步加载的,每次back都只会返回到第一页。

所以这里我就换了种策略,在通过id打开窗口的时候,我新建一个窗口,然后对新窗口里面的属性进行操作,这样就不会影响之前的页面了,翻到了第几页都没事。

对了,页码是通过最下面的最大页数来判断的。
在这里插入图片描述
这里的代码:

mainWindow = driver.current_window_handle  #保存主页面句柄
jiudian_page_max = driver.find_element_by_xpath('//*[@id="page_info"]/div[1]/a[8]').get_attribute('data-value')
for i in range(1,int(jiudian_page_max)):
    time.sleep(2)
    for i in range(1,26):
        jiudian_id = driver.find_element_by_xpath('//*[@id="hotel_list"]/div[{}]'.format(i)).get_attribute('id')
	#打开新的窗口,通过句柄来切换页面。
    js = "window.open('{}')".format(f'https://hotels.ctrip.com/hotel/{jiudian_id}.html?isFull=F')
    driver.execute_script(js)
    new_handle = driver.current_window_handle
    Handles = driver.window_handles
    for handle in Handles:
        if handle != mainWindow:
            driver.switch_to_window(handle)

接着就是评论数据的采集了,这个倒是没有什么难度,也是通过给出的页数来获取最大页,然后循环去点击下一页。但是有些酒店是没有评论的 =。= 所以要加上try 异常操作

    try:
        page_max = driver.find_element_by_xpath('//*[@id="divCtripComment"]/div[4]/div/div[1]/a[7]').get_attribute('value')
        for j in range(int(page_max)):
            print(f"* * * * * * ID:{jiudian_id} * * 第{j+1}页 * * * * * * * ")
            for i in range(1,16):
                try:
                    print(driver.find_element_by_xpath('//*[@id="divCtripComment"]/div[3]/div[{}]/div[1]/p[2]/span'.format(i)).text)
                    print(driver.find_element_by_xpath('//*[@id="divCtripComment"]/div[3]/div[{}]/div[2]/div/div[1]'.format(i)).text)
                    print('- - - - - - - -  - - - - - - - - - - - - - ')
                except:
                    pass
            driver.find_element_by_xpath('//*[@id="divCtripComment"]/div[4]/div/a[2]').click()
            time.sleep(2)
        driver.close()		# close关闭当前的这个窗口,quit是关闭所以 !  
    except:
        pass

在采集完一个酒店的所有评论数据之后,记得要关闭当前的窗口,然后再切换到最开始的窗口句柄。

    time.sleep(2)
	driver.switch_to_window(mainWindow)

最后是列表页的一页跑完了再去点击下一页。

driver.find_element_by_xpath('//*[@id="downHerf"]').click()

差不多了,可能说的不是很详细,有问题可以留言或者QQ联系我。

完整代码:

from selenium import webdriver
import time
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
# 按前文的绕过检测方法修改
option.add_experimental_option()
driver = webdriver.Chrome(executable_path=r'',options=option)

driver.get('https://hotels.ctrip.com/hotel/tianjin3#ctm_ref=hod_hp_sb_lst')

mainWindow = driver.current_window_handle  #保存主页面句柄
jiudian_page_max = driver.find_element_by_xpath('//*[@id="page_info"]/div[1]/a[8]').get_attribute('data-value')
for i in range(1,int(jiudian_page_max)):
    time.sleep(2)
    for i in range(1,26):
        jiudian_id = driver.find_element_by_xpath('//*[@id="hotel_list"]/div[{}]'.format(i)).get_attribute('id')

        js = "window.open('{}')".format(f'https://hotels.ctrip.com/hotel/{jiudian_id}.html?isFull=F')
        driver.execute_script(js)
        new_handle = driver.current_window_handle
        Handles = driver.window_handles
        for handle in Handles:
            if handle != mainWindow:
                driver.switch_to_window(handle)
        time.sleep(2)
        try:
            page_max = driver.find_element_by_xpath('//*[@id="divCtripComment"]/div[4]/div/div[1]/a[7]').get_attribute('value')
            for j in range(int(page_max)):
                print(f"* * * * * * ID:{jiudian_id} * * 第{j+1}页 * * * * * * * ")
                for i in range(1,16):
                    try:
                        print(driver.find_element_by_xpath('//*[@id="divCtripComment"]/div[3]/div[{}]/div[1]/p[2]/span'.format(i)).text)
                        print(driver.find_element_by_xpath('//*[@id="divCtripComment"]/div[3]/div[{}]/div[2]/div/div[1]'.format(i)).text)
                        print('- - - - - - - -  - - - - - - - - - - - - - ')
                    except:
                        pass
                driver.find_element_by_xpath('//*[@id="divCtripComment"]/div[4]/div/a[2]').click()
                time.sleep(2)
            driver.close()
        except:
            pass
        time.sleep(2)
        driver.switch_to_window(mainWindow)
    driver.find_element_by_xpath('//*[@id="downHerf"]').click()
使用Selenium爬取携程酒店评论可以分为以下几个步骤: 1. 安装Selenium和ChromeDriver Selenium是一个自动化测试工具,可以通过编写Python代码来控制浏览器模拟用户行为,ChromeDriver是Selenium控制Chrome浏览器的驱动,需要下载对应版本的ChromeDriver并配置环境变量。 2. 打开携程酒店评论页面 使用Selenium打开携程酒店评论页面,并在页面中输入酒店名称,选择日期等筛选条件,点击搜索按钮,等待页面加载完成。 3. 模拟下滑操作 由于携程酒店评论是动态加载的,需要模拟下滑操作触发JavaScript代码将评论加载出来。可以使用Selenium提供的`execute_script`方法执行JavaScript代码模拟下滑操作。 4. 解析评论内容 使用Selenium获取评论页面的HTML代码,然后使用BeautifulSoup等HTML解析库解析出评论内容,包括评论内容、评分、评论时间等信息。 5. 存储数据 将解析出来的评论数据存储到数据库或者文件中,方便后续的分析和使用。 下面是一个简单的示例代码: ```python from selenium import webdriver from bs4 import BeautifulSoup # 打开Chrome浏览器 driver = webdriver.Chrome() # 打开携程酒店评论页面 hotel_name = "xxx" # 酒店名称 start_date = "xxxx-xx-xx" # 入住日期 end_date = "xxxx-xx-xx" # 离店日期 url = f"https://hotels.ctrip.com/hotel/{hotel_name}/k1{start_date}-k2{end_date}/" driver.get(url) # 等待页面加载完成 driver.implicitly_wait(10) # 模拟下滑操作 for i in range(5): driver.execute_script("window.scrollBy(0, 500)") # 解析评论内容 html = driver.page_source soup = BeautifulSoup(html, "html.parser") comments = soup.find_all("div", {"class": "J_commentDetail"}) for comment in comments: # 解析评论内容,包括评论内容、评分、评论时间等信息 content = comment.find("div", {"class": "detail_txt"}).text.strip() score = comment.find("span", {"class": "score"}).text.strip() date = comment.find("span", {"class": "time"}).text.strip() # 存储数据 # TODO # 关闭浏览器 driver.quit() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考古学家lx(李玺)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值