Web网页自动化实战获取所有酒店的名字、价格、评分信息,并写入文件
1. 目录
- 一、find_elements()的作用- 1.获取当前页面中所有酒店名称的元素
- 2.获取当前页面中所有酒店价格的元素
- 3.获取当前页面中所有酒店评分的元素
 
- 二、分别拿到每家的价格、评分、酒店名并写入文件- 1.分别拿到每家的价格、评分、酒店名
- 2.将拿到的数据写入文件
 
- 三、代码
- 四、与扩展- 1.
- 2.拓展
 
1.1 一、find_elements()的作用
1.1.1 1.获取当前页面中所有酒店名称的元素

通过元素的class属性获取酒店名,获取到了20个
这20个酒店展示的格式都是一样的。每个div都是独立的。每个div都是个酒店的信息。

这20个酒店名称都有同一个爸爸div
1.1.1.1 1)find_element(By.XPATH,)
find_element的意思是查找一个元素。 //span[@class="name"]这个表达式可能匹配到一个或多个元素,有多少个由页面来决定。
find_element(By.XPATH,)只匹配找到的元素中的一个,而且是页面中第一个出现的元素。
页面中按先后顺序,从最顶端的html开始从上往下加载。如果页面中有一个以上的,那么它匹配到的是第一个元素。
1.1.1.2 2)find_elements(By.XPATH,)
要获取找到的这20个元素的文本内容,它们的文本内容是酒店名称。
find_elements(By.XPATH,) ----获取匹配到表达式的所有元素。

Elements里面呈现的html中的元素呈现的顺序和页面中的顺序是一样的。
1.1.2 2.获取当前页面中所有酒店价格的元素

这个表达式匹配到20个元素
1.1.3 3.获取当前页面中所有酒店评分的元素

这个表达式匹配到20个元素
1.2 二、分别拿到每家的价格、评分、酒店名并写入文件
这20个元素,每个这样的元素里面都有价格、评分、酒店名称。
1.2.1 1.分别拿到每家的价格、评分、酒店名

这几行代码会一直反复执行,这是个遍历的过程。等到最后一个值全部取完了,它才会执行下面的部分。这几行全部缩进了,表示每取一个值,大家都会去做的事情。

这个换行的效果是print()搞定的
1.2.2 2.将拿到的数据写入文件
fs = open("我的酒店数据.txt", "w",encoding='UTF-8') UTF-8支持中英文。
读:比如读本地某个数据表格,本地必须有才能读,没有就读不到。
w可写入模式:文件不存在,就创建文件并写入。文件存在,直接写入。
w 这种模式写的时候是直接覆盖文件中的内容的。
1.3 三、代码
from selenium.webdriver.common.by import By
from selenium import webdriverimport time
# 打开谷歌浏览器,与浏览器建立了会话。
# driver变量=会话。
driver = webdriver.Chrome()driver.get("https://www.elong.com/")  # 这行代码执行后,会等到页面加载得差不多了再去执行下一行代码。
# get()这个功能是会等到页面加载完成的。
# 有的时候页面加载出来了,但是渲染的方式有些慢。
# 所以我还想等1秒也是可以的。
time.sleep(1)# 查找元素通过xpath定位方式。
ele = driver.find_element(By.XPATH, '//input[@data-bindid="city"]')  # 定位到目的地的输入框,将刚才在写好的表达式复制过来。
# ele= 我找到的元素
# 点击操作 -- 点击目的地输入框,弹出城市选择框。
ele.click()time.sleep(2)  # 运行这行代码后会停留2秒,然后再去运行下一行代码。
# 因为接下来要操作的元素,是动态出现的(不是一开始访问网站就有的,而是你做了一个动作让人家动态的出现了)。
# 它是需要时间呈现在页面上的。这个时间就需要你来等一等了。等一等网页,再去找这个元素去操作。
# 输入操作 --ele.send_keys("输入操作")# 获取它的属性-- ele.get_attribute("属性名称")# 获取它的文本内容-- ele.text
# 选择热门城市当中的广州
driver.find_element(By.XPATH, '//li[@data="0|15"]').click()time.sleep(1)  # 加上等待时间。sleep时间不宜太长,7秒8秒,这个时间就太长了。
# 没加等待时间的时候运行代码,会发现操作太快了,且没有选择到对应的日期。
# 选择入住日期
ele = driver.find_element(By.XPATH, '//input[@data-bindid="checkIn"]')ele.clear()  # 输入日期前,先清空输入框的内容。
ele.send_keys("2022-05-27")time.sleep(1)  # 每个操作间都加了等待时间。'''
输入日期后,日期框没有消失,得让日期框消失。点击除了它以外的其它元素
(选一个页面固定的元素,那就点击目的地这个元素),
日期框就能消失了。再去处理下一个元素。不然日期框会挡住别的元素。
接下来点击搜索,搜索按钮被这个日期框遮住了。就会影响你的操作效果。
所以我是根据页面的特征习性来处理的。'''
# 把弹出的日期选择框关掉。
driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()# 选择退房日期
b = driver.find_element(By.XPATH, '//input[@data-bindid="checkOut"]')b.clear()b.send_keys("2022-05-30")  # 输入日期
time.sleep(1)driver.find_element(By.XPATH, '//div[@id="domesticDiv"]//dt[text()="目的地"]').click()time.sleep(1)# a=driver.find_element(By.XPATH,'//input[@data-bindid="allInOne"]')# a.clear()# a.send_keys("喜悦门酒店(广州融创文旅城店)")# time.sleep(1)# driver.find_element(By.XPATH,'//div[@id="domesticDiv"]//dt[text()="目的地"]').click()# ========2、点击搜索按钮=========# time.sleep(0.5)driver.find_element(By.XPATH, '//span[@data-bindid="search"]').click()# ==========3、跳转到新的页面了,等待新的页面内容加载=========time.sleep(7)  # 等待新的内容加载出来,用的是比较长的时间。
# ================4、获取酒店的名字、酒店的价格、酒店的评价===============# 拿到第一家酒店的信息
# hotel_name=driver.find_element(By.XPATH,'//span[@class="name"]').text
# hotel_price=driver.find_element(By.XPATH,'//p[@class="loginToSee"]').text
# hotel_review=driver.find_element(By.XPATH,'//p[@class="score mb5"]').text
# print("酒店信息:",hotel_name,hotel_review,hotel_price)# ======================5、获取当前页面的所有酒店的价格、评分、名字
# find_elements(By.XPATH,) --- 获取匹配到表达式的所有元素。names是个列表。列表里面放的是元素对象。
# 所有酒店的名称元素
total_names = driver.find_elements(By.XPATH, '//span[@class="name"]')  # 20个同类型的元素。
time.sleep(1)# python中用来存放多个数据的是:list/字典/元组/集合这几种方式。
# 所有酒店的价格元素
total_prices = driver.find_elements(By.XPATH, '//p[@class="loginToSee"]')time.sleep(1)# 所有酒店的评分元素
total_previews = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')# 从3个列表当中,每个值都要取出来。
# 店子里有20件衣服。从第1件开始到第20件都要去看一眼。把看一眼叫做访问。
# 这个叫做遍历/循环。从头到尾,每一个成员,你都要去访问。20个集合。
# 20个酒店。每一个酒店,都要去获取名字、价格、评分------遍历。'''for 变量 in 列表:# 在列表当中,取每一个成员,给到变量。
    取到的每一个成员,会去做的事情。
    取到的每个酒店,都要去拿酒店的名字、价格和评分。
遍历的是:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]'''
# 文件操作 -- 我的酒店数据.txt
# 读写操作。创建一个文件,写入数据,然后关闭。
# open -- 文件操作。
# 打开文件的时候,指明写入方式,以及编码格式为utf-8fs = open("我的酒店数据.txt", "w",encoding='UTF-8')  # write -- w  可写入的模式。文件不存在会创建文件并写入。文件存在,直接写入。
# 这里只有文件名称,没有写路径,这就是告诉python,我就在当前路径下生成文件。
#w 这种模式是直接覆盖文件中的内容的。
# write写的时候,不会自动换行。  换行:\n
# for index in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]:for index in range(20):
    print(total_names[index].text, total_prices[index].text, total_previews[index].text)  # 拿到了每家酒店的名字价格和评分。
    fs.write(total_names[index].text + "  ")  # 在我没有关闭这个文件之前,是可以持续写入的。
    fs.write(total_prices[index].text + "  ")
    # fs.write(total_prices[index].get_attribute("属性名称")+"    ")#获取属性值
    # fs.write(total_prices[index].get_attribute('class') + "    ")
    fs.write(total_previews[index].text + "\n")# 关闭文件
fs.close()# for 后面的变量可以随便取名,in后面可以跟列表,当然除了列表以外,很多都可以的。
time.sleep(10)#########6.更多的事情:先选价格,再去看评分。###################
jiage=driver.find_element(By.XPATH,'//li[@class="radio fl"]//span[text()="150元以下"]').click()try:
    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')
    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')
    for score in range(20):
        print(pingfens[score].text)
        fn.write(pingfens[score].text+ "\n")
    fn.close()except:
    pingfens = driver.find_elements(By.XPATH, '//p[@class="score mb5"]')
    fn = open("150元以下的评分数据.txt", "w",encoding='UTF-8')
    for score in range(20):
        print(pingfens[score].text)
        fn.write(pingfens[score].text+ "\n")
    fn.close()#用捕获异常的方法规避当前遇到的异常了。否则代码是没问题,但多次运行后会报错。
# ========7、关闭浏览器,关闭本次会话========time.sleep(10)driver.quit()  # 退出相关驱动,关闭所有窗口。
运行成功
1.4 四、与扩展
1.4.1 1.
1.find_elements()用来查找所有的元素,而且它的结果是个列表。
2.列表的处理方式 -- 遍历取值,创建文件。
3.遍历列表 -- for循环。
4.数据写入文件。
1.4.2 2.扩展
根据列表的长度去遍历:再掌握range函数的用法。参考链接:操作列表
运行这个fs.write(total_prices[index].get_attribute("属性名称")+"    ")#获取属性值
和fs.write(total_prices[index].text + "  ")运行出来的结果都是一样的。

第一种方式的运行结果

第二种方式的运行结果
以上所学,比如领导要看下平台的一些数据,可以利用这个脚本去访问公司的系统把数据拿下来。有些时候领导就想要个报告。学的这些不是没用,要在对应的时机用上来。
爬虫有的时候会用到这么点自动化知识,但不是完全用的自动化知识。爬虫要学得好,真的要学得很深入。
提示:在享受本文内容的同时,请注意版权归属 徐州鑫坤机电设备有限公司https://www.xzxkjd.com如果您觉得有价值欢迎分享,但请务必注明出处,感谢您的理解,谢谢!
以下部分内容需要登录查看 立即登录
相关内容
- Web网页自动化实战获取所有酒店的名字、价格、评分信息,并写入文件
- 上海非急救出租服务全解析
- 深耕中考复读赛道 深圳深才教育为复读生搭建升学桥梁
- 阳光下的童年:那些被温暖照亮的纯真时光
- 群晖DSM7.0-7.21监控套件Surveillance Station 9.20-11289开心版60个许可证设置教程(无重启、无断流、无卡死、史上最完美)
- 云服务器+SD-WAN组网和域名DNS解析
- 在云主机上安装iKuai OS,实现SD-WAN组网,利用云主机80;443端口搭建企业网站。个人博客。让云主机当做你的堡垒机,实现数据本地化。
- 中央空调只开一台=全开耗电?真相让人意外!
- 告别卡顿时代:PCDN正成为互联网内容分发的核心引擎
- 5G时代必备!PCDN如何让视频加载速度快如闪电?
- 降本增效利器!企业都在用的PCDN技术到底强在哪?
- 揭秘PCDN业务:如何用边缘计算重构内容分发新生态?
 简体中文
简体中文 繁體中文
繁體中文 English
English Nederlands
Nederlands Français
Français Русский язык
Русский язык Polski
Polski 日本語
日本語 ภาษาไทย
ภาษาไทย Deutsch
Deutsch Português
Português español
español Italiano
Italiano 한어
한어 Suomalainen
Suomalainen Gaeilge
Gaeilge dansk
dansk Tiếng Việt
Tiếng Việt Pilipino
Pilipino Ελληνικά
Ελληνικά Maori
Maori tongan
tongan ᐃᓄᒃᑎᑐᑦ
ᐃᓄᒃᑎᑐᑦ ଓଡିଆ
ଓଡିଆ Malagasy
Malagasy Norge
Norge bosanski
bosanski नेपालीName
नेपालीName čeština
čeština فارسی
فارسی हिंदी
हिंदी Kiswahili
Kiswahili ÍslandName
ÍslandName ગુજરાતી
ગુજરાતી Slovenská
Slovenská היברית
היברית ಕನ್ನಡ್Name
ಕನ್ನಡ್Name Magyar
Magyar தாமில்
தாமில் بالعربية
بالعربية বাংলা
বাংলা Azərbaycan
Azərbaycan lifiava
lifiava IndonesiaName
IndonesiaName Lietuva
Lietuva Malti
Malti català
català latviešu
latviešu УкраїнськаName
УкраїнськаName Cymraeg
Cymraeg ກະຣຸນາ
ກະຣຸນາ తెలుగుQFontDatabase
తెలుగుQFontDatabase Română
Română Kreyòl ayisyen
Kreyòl ayisyen Svenska
Svenska հայերեն
հայերեն ဗာရမ်
ဗာရမ် پښتوName
پښتوName Kurdî
Kurdî Türkçe
Türkçe български
български Malay
Malay मराठीName
मराठीName eesti keel
eesti keel മലമാലം
മലമാലം slovenščina
slovenščina اوردو
اوردو አማርኛ
አማርኛ ਪੰਜਾਬੀName
ਪੰਜਾਬੀName albanian
albanian Hrvatski
Hrvatski Suid-Afrikaanse Dutch taal
Suid-Afrikaanse Dutch taal ខ្មែរKCharselect unicode block name
ខ្មែរKCharselect unicode block name


 印修
 印修

