(二)selenium的实际运用

(二)selenium的实际运用

(二)selenium的实际运用

前言

上一篇我们已经知道怎么简单使用selenium了,那么我们就从这篇博客来动手爬取网站吧。

selenium实战

这里我们只会用到很少的selenium语法,我这里就不补充别的用法了,以实战为目的

打开艺龙网

网站:http://www.elong.com/
也可以直接点击这里进入:艺龙网

这里是主页
在这里插入图片描述

精确目标

我们的目标是,鹤壁市,所以我们应该先点击搜索框,然后把北京删掉,替换成鹤壁市,那么怎么通过selenium实现呢?
打开pycharm,新建一个叫做艺龙网的py文件,先导包:

from selenium import webdriver 
import time   # 导包
driver = webdriver.Chrome()  # 创建一个selenium的对象
driver.get("http://www.elong.com/")  
time.sleep(1)  # 打开网站,并让它睡1s,避免渲染未完成就进行下一步操作
driver.maximize_window()  # 将浏览器最大化

怎么找到搜索框呢,有很多方法,xpath,css,JavaScript,jQuery,,,因为xpath简单,所以我们只使用xpath,因为这个网站也是可以用xpath的,具体步骤是:

  1. F12,小箭头,点击搜索框
    在这里插入图片描述
  2. 点击后,找到元素中的位置,右键,复制,复制xpath

    在这里插入图片描述

  3. 进入pycharm中,在之前创建的py文件中添加如下代码
driver.find_element_by_xpath('//*[@id="domesticDiv"]/dl[1]/dd/input').clear()# 将搜索框中的内容清理
  1. 在搜索框添加“鹤壁市”
driver.find_element_by_xpath('//*[@id="domesticDiv"]/dl[1]/dd/input').send_keys('鹤壁市')
  1. 点击搜索,进入下一页
time.sleep(1)driver.find_element_by_xpath('//*[@id="hotel_sub_tabs"]/span[1]/b').click()  # 点击无关time.sleep(1) # 避免渲染不及时导致报错driver.find_element_by_xpath('//*[@id="domesticDiv"]/div/span[1]').click()  # 点击搜索
  1. 下一页
    此时我们绝望的发现,这些操作都是没用的(对这个网站没用,但是至少我们学到了点知识?)她还是北京
    在这里插入图片描述
    所以我们只能这样做了
    直接点击搜索,进入这个页面后再输入鹤壁(那干嘛不直接访问这个网页呢?为了我这该死的仪式感!!)
  2. 这样做,再那样做,就行了
from selenium import webdriverimport time   # 导包driver = webdriver.Chrome()  # 创建一个selenium的对象driver.get("http://www.elong.com/")time.sleep(1)  # 打开网站,并让它睡1s,避免渲染未完成就进行下一步操作driver.maximize_window()  # 将浏览器最大化driver.find_element_by_xpath('//*[@id="domesticDiv"]/div/span[1]').click()  # 点击搜索driver.find_element_by_xpath('//*[@id="m_searchBox"]/div[1]/label/input').clear()  # 清空搜索框内容driver.find_element_by_xpath('//*[@id="m_searchBox"]/div[1]/label/input').send_keys('鹤壁市')  # 在搜索框输入 鹤壁市time.sleep(1)driver.find_element_by_xpath('//*[@id="sugContent"]/ul/li[1]/div/div[1]/div[1]/span/b').click()  # 鹤壁市time.sleep(1)# 只是改变了顺序,并更换了xpath语法
  1. 然后就成功的定位到了鹤壁市
    在这里插入图片描述
  2. 分析网页,找到详情页的url
    我们可以这样做:在这里插入图片描述
    我们发现,这个详情页每个的xpath都不相同,怎么做到把所有详情页都“照顾”得到呢?看来只能请出我们的requests来了,然后我们发现,这个只是一段URL,那怎么办?拼接咯!
  3. 通过查看响应,我们知道响应和元素是一样的,那么说明什么?我们可以通过xpath提取到我们的元素,直接请出我们的xpath选手。
from lxml import etreeimport rehtml_data = driver.page_source  # 将数据存入html_dataht = ht_ht.xpath('//div[@class="to_detail"]/a/@data-link')  # 提取到url的后半段
  1. 拼接字符串形成新URL
    点进去一个详情页查看URL,发现是这样的
    在这里插入图片描述
    研究发现,将?issugtrace=2删去也可以运行,而我们通过xpath取到的正是后面的 /31712004/,所以:
for ur in ht:    new_ul = 'http://www.elong.com' + ur
  1. 取到详情页URL后,就要点进去,然后再分析网页,再提取数据,然后存数据,找xpath的我就先不说了,也不难。
head = {       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'}for ur in ht:    new_ul = 'http://www.elong.com' + ur    xiangqing_ht = requests.get(new_ul, headers=head).content.decode()  			    # 使用requests	time.sleep(1)  # 睡1s    ht_data = etree.HTML(xiangqing_ht) # 转为可使用xpath的HTML格式    tingche = ht_data.xpath('//*[@id="hotelContent"]/div/dl[4]/dd/text()')  # 停车位            if tingche == []:                tingche = '无停车位'            name = ht_data.xpath('/html/body/div[3]/div/div[1]/div[1]/div/h1/text()')[0]  # 酒店名字            phine_num = ht_data.xpath('//*[@id="hotelContent"]/div/dl[1]/dd/span/text()')  # 电话            photo_li = ht_data.xpath('/html/body/div[3]/div/div[2]/div[1]/div[2]/ul[1]/li/img/@src')  # 照片            weizhi = ht_data.xpath('//*[@id="map"]/div[1]/div[2]/div[1]/div/div[9]/div[2]/div/p[2]/text()')  # 位置            miaoshu = ht_data.xpath('//*[@id="hotelContent"]/div/dl[1]/dd/ul/li[2]/div/p/span[1]/text()')

然后我们就拿到了数据,接下来,这些数据怎么保存呢?可以使用字典保存到json中。我就接着上面的写了

dic = {
   } # 使用字典进行json存储
ic[f"{name}"] = {
   }
dic[f"{name}"][f"{name}停车场"] = tingche
dic[f"{name}"][f"{name}电话"] = phine_num
dic[f"{name}"][f"{name}位置"] = weizhi
dic[f"{name}"][f"{name}描述"] = miaoshu
path = f"酒店数据//{name}"
if not os.path.exists(path):
    os.mkdir(path)
# 创建酒店文件夹
for num, photo in zip(range(len(photo_li)), photo_li):
    if num > 4:
        break
    else:
        with open(f'酒店数据//{name}//{name, num + 1}.jpg', 'wb') as f:
            f.write(requests.get(photo).content)  # 将照片存进本地
with open(f"酒店数据//{name}//酒店数据.json", 'w') as f:
      f.write(str(dic))  # 将json存入文件
dic = {
   }  # 将字典内的数据清楚,留待下一次循环使用
  1. 数据拿到之后,还没完,我们还要爬下一页,首先需要把主页滑倒最底部
for i in range(4):  # 0 1
     time.sleep(0.5)
     j = (i + 1) * 1000  # 1000 2000
     js_ = f'document.documentElement.scrollTop={j}'
     driver.execute_script(js_)
     time.sleep(5)
  1. 回到主页面,找到下一页的xpath,点击
driver.find_element_by_xpath('//*[@id="pageContainer"]/a[9]').click()

然后,我们就进入了 下一页,然后下面就没有代码了,怎么办,怎么让代码一直运行将很多页的数据爬下来呢?有两种方法:

  1. 封装函数,并发爬取
  2. 使用循环进行爬取

然后,就没有然后了…

成功

成功拿到数据

在这里插入图片描述

结语

希望大家能够通过实战了解各种语法的功能,而不是死记硬背各种语法,那样你很容易忘记,其实很多学习都可以通过这种方式来学习

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100263.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Owasp top10 小结[通俗易懂]

    Owasp top10 小结[通俗易懂]Owasptop101.SQL注入原理:web应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过恶意的sql语句来实现对数据库的任意操作。2.失效的身份认证和会话管理原理:在开发web应用程序时,开发人员往往只关注Web应用程序所需的功能,所以常常会建立自定义的认证和会话方案。但是要正确的实现这些方案却是很难的。结果就在退出,密码管理,超时,密码找回,账户更新等方面存在漏洞。危害:由于存在以上的漏洞,恶意用户可能会窃取

  • Eclipse代码自动补全功能

    Eclipse代码自动补全功能相信用过IntelliJIDEA的同学都知道哈,输出语句是可以直接sout回车得到System.out.println();这语句哈,最近呢,想用eclipse写写java,发现打出输出语句不是那么快,于是就上网查询了相关资料,期间发现个很棒的教程。教程如下:1.打开eclipse找到顶部Windows那里(如图)2.点击Windows那里,然后在弹出的框中选择Preference(如图)3.点开后在弹出界面找到java(如图,找到后点击java左边的那个箭头(箭头额)4.第三

  • 详解自动编码器(AE)

    详解自动编码器(AE)自动编码器(Auto-Encoders,AE)降噪自编码(DenoisingAuto-Encoders,DAE)(2008)堆叠降燥自动编码器(StackedDenoisingAuto-Encoders,SAE)(2008)卷积自动编码器(ConvolutionAuto-Encoders,CAE)(2011)变分自动编码器(VariationalAuto-Encoders,VAE)(Kingma,2014)

  • jrtplib for android,Jrtplib Android平台编译

    jrtplib for android,Jrtplib Android平台编译??jrtplib库使用C++语言实现,封装了RTP、RTCP协议的内容,可用于发送RTP数据包和RTCP数据包。RTP、RTCP协议本身不是很复杂的协议,使用该库可以免去实现协议的细节,但是如果要用好该库,最好对RTP、RTCP协议有一个比较清晰的了解。??本文介绍如何在AndroidStudio中通过编写CMakeList.txt文件,将下载好的jlibrtp库编译成动态库。此处关键…

  • keil5使用技巧

    keil5使用技巧文章目录前言1、关闭其他文件2、keil注释如何不乱码4、每段程序后都要空行5、添加头文件6、开启和关闭工程列表框7、找到库函数总结前言1、关闭其他文件2、keil注释如何不乱码4、每段程序后都要空行5、添加头文件6、开启和关闭工程列表框7、找到库函数方法就是打开一个.h文件拖到最后→看到如下字样的,就是库函数了/**@defgroupGPIO_Exported_Functions@{*/例如:找EXTI的库函数打开exti.h文件,拖到最后,这些就是EXTI

  • 1553B总线协议

    1553B总线协议概述1553B总线组成包括总线控制端(BC:BusControl)、远程终端(RT:RemoteTerminal)和总线监视端(MT:MonitorTerminal)。总线控制端(BC:Bu

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号