Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇

优采云 发布时间: 2022-06-04 00:41

  Web网页自动化实战《4.获取所有酒店的名字、价格、评分信息,并写入文件》上篇

  目录二、分别拿到每家的价格、评分、酒店名并写入文件三、代码四、总结与扩展一、find_elements()的作用1.获取当前页面中所有酒店名称的元素

  

  通过元素的class属性获取酒店名,获取到了20个

  这20个酒店展示的格式都是一样的。每个div都是独立的。每个div都是个酒店的信息。

  

  这20个酒店名称都有同一个爸爸div1)find_element(By.XPATH,)

  find_element的意思是查找一个元素。 //span[@class="name"]这个表达式可能匹配到一个或多个元素,有多少个由页面来决定。

  find_element(By.XPATH,)只匹配找到的元素中的一个,而且是页面中第一个出现的元素。

  页面中按先后顺序,从最顶端的html开始从上往下加载。如果页面中有一个以上的,那么它匹配到的是第一个元素。

  2)find_elements(By.XPATH,)

  要获取找到的这20个元素的文本内容,它们的文本内容是酒店名称。

  find_elements(By.XPATH,) ----获取匹配到表达式的所有元素。

  

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

  

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

  

  这个表达式匹配到20个元素二、分别拿到每家的价格、评分、酒店名并写入文件

  这20个元素,每个这样的元素里面都有价格、评分、酒店名称。

  1.分别拿到每家的价格、评分、酒店名

  

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

  

  这个换行的效果是print()搞定的2.将拿到的数据写入文件

  fs = open("我的酒店数据.txt", "w",encoding='UTF-8') UTF-8支持中英文。

  读:比如读本地某个数据表格,本地必须有才能读,没有就读不到。

  w可写入模式:文件不存在,就创建文件并写入。文件存在,直接写入。

  w 这种模式写的时候是直接覆盖文件中的内容的。

  三、代码

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

  

  运行成功四、总结与扩展1.总结

  1.find_elements()用来查找所有的元素,而且它的结果是个列表。

  2.列表的处理方式 -- 遍历取值,创建文件。

  3.遍历列表 -- for循环。

  4.数据写入文件。

  2.扩展

  根据列表的长度去遍历:再掌握range函数的用法。参考链接:

  运行这个fs.write(total_prices[index].get_attribute("属性名称")+" ")#获取属性值

  和fs.write(total_prices[index].text + " ")运行出来的结果都是一样的。

  

  第一种方式的运行结果

  

  第二种方式的运行结果

  以上所学,比如领导要看下平台的一些数据,可以利用这个脚本去访问公司的系统把数据拿下来。有些时候领导就想要个报告。学的这些不是没用,要在对应的时机用上来。

  爬虫有的时候会用到这么点自动化知识,但不是完全用的自动化知识。爬虫要学得好,真的要学得很深入。

  文章中的链接的版权归原作者所有,除标明“图片来自网络”的图片,皆为小编本人所画所截图。欢迎关注“清菡软件测试”,进群加v:qhtester,感谢点赞与分享!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线