最近好像对这方面需求比较高,总有人问我爬过携程没,我寻思着拿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 ChromeOptionsoption = 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_handleHandles = driver.window_handlesfor 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:passdriver.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 ChromeOptionsoption = 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_handleHandles = driver.window_handlesfor 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:passdriver.find_element_by_xpath('//*[@id="divCtripComment"]/div[4]/div/a[2]').click()time.sleep(2)driver.close()except:passtime.sleep(2)driver.switch_to_window(mainWindow)driver.find_element_by_xpath('//*[@id="downHerf"]').click()

selenium-携程酒店评论相关推荐

  1. python携程酒店评论_携程酒店评论爬虫心得

    携程酒店评论爬虫心得 发布时间:2018-09-02 15:58, 浏览次数:613 携程酒店评论爬虫心得 这次爬取数据,遇到了不少的困难,也走了很多弯路,特此写下帮助记忆.以下基本是我爬取数据的过程 ...

  2. 携程酒店评论爬虫心得

    携程酒店评论爬虫心得 这次爬取数据,遇到了不少的困难,也走了很多弯路,特此写下帮助记忆.以下基本是我爬取数据的过程,前半段是弯路,可直接绕过,后半段是解决方法. 打开携程,南京YMCA酒店页面,可以发 ...

  3. python携程酒店评论_Python基于selenium爬取携程酒店评论信息

    爬取站点 任意一个携程酒店的详细链接,这里给出了四个,准备开四个线程爬取: https://hotels.ctrip.com/hotel/6278770.html#ctm_ref=hod_hp_hot ...

  4. pyhton爬虫(12)——抓取携程酒店评论数据

    本文主要目标是抓取携程酒店基本信息和用户评论数据.具体来说,酒店基本信息包括:酒店名.酒店星级.酒店最低房价.用户推荐比.酒店总评分等:用户评论数据包括:用户评论时间,用户评分,评论内容等. 实现代码 ...

  5. Selenium爬携程酒店评论+jieba数据分析实战

    如果你想使用最少的时间相对客观的了解一样事物,那么最好的方式就是快速收集大量的关于它的评价,然后迅速地找出这些评价中的关键信息. 而这道题目,有两个特别大的难点:1.如何快速收集大量的评论:2.如何迅 ...

  6. 携程酒店评论获取-解密过程

    这个东西搞出来有段时间了,一直硬盘吃灰,今天看了一下发现不能用啦,又去网页看了一下 变了一小部分,既然之前的不能用啦,那我就分享出来解密过程.具体分析过程就免了,时间太久时间太久记不起来当时的思路了 ...

  7. 携程酒店评论EDA及词云展示—数据来自和鲸社区

    import numpy as np import pandas as pd import matplotlib.pyplot as plt import plotly.express as px d ...

  8. python携程酒店评论_python爬取携程景点评论信息

    今天要分析的网站是携程网,获取景点的用户评论,评论信息通过json返回API,页面是这个样子的 按下F12之后,F5刷新一下 具体需要URL Request的方式为POST,还需要你提取的哪一页,下面 ...

  9. python爬携程酒店评论_python爬虫爬取携程网的酒店评论数据时,有个请求参数不知道是怎么生成的?...

    是下面这个代码生成的,看不懂: ,_getElevenValue:function(e){ function o(e){ for(var o=["A","B", ...

  10. python爬取携程酒店评论_python爬取携程酒店列表

    做个笔记,亲测可用 ```python import requests import json from lxml import etree from bs4 import BeautifulSoup ...

最新文章

  1. 2021年昆明师专附中高考成绩查询,昆明高中4大名校,2019高考成绩厉害了,快看看是哪些?...
  2. python汉诺塔游戏_Python实战:搭建汉诺塔小游戏,快和小伙伴一起玩玩吧
  3. VirtualBox通过命令方式批量创建并配置虚拟机
  4. oracle 学习——巨人的肩膀
  5. shell脚本(五)——函数的格式、传参、变量、递归、函数库
  6. Android 监控网络状态
  7. spring集成多个rabbitMQ
  8. [导入]C#实现WEB浏览器
  9. 面试问题:Spring实现AOP的方式
  10. Linux开机启动过程(8):初期中断(缺页中断)和异常处理
  11. DOM疑惑点整理(三)
  12. Android蓝牙电话(SCO)和蓝牙音乐(A2DP)总结(四)
  13. oracle11g和10的区别,同平台升级 oracle 10 到 oracle11g的一些考虑和实际操作
  14. JDE 系统表(标准表)
  15. html滑动验证到最右边,jQuery滑块拖动到最右边验证插件
  16. Appium环境搭建2021年最新详细教程
  17. 八数码问题引发的思考
  18. 从认知动机理论看设计:如何读懂用户?
  19. 从头开始制作51智能车——循迹+遥控+避障(二)——电机驱动模块
  20. autojs连连看脚本可视化

热门文章

  1. MessageBox所有图标样例
  2. 坚持#第268天~个人博客和qq农场成功实现了全分离(mysql、nginx、php)
  3. TestableMock这一篇就够了
  4. 华为新品Mate50将搭载北三短报文通信功能?这项技术是何方神圣
  5. DevGridControl中GridView排序问题
  6. Frank Nuovo:多元化与本土化设计
  7. iOS设置静音模式播放声音以及注意点
  8. 详解shell语法检查模式
  9. 给南开大学礼鹤同学的回信----关于开源的思考
  10. css 轨道,css 实现多个小球绕轨道运动