selenium笔记:从安装到爬取去哪儿上海当日酒店信息
目录
本人刚刚接触Selenium,觉得还挺好玩的,据本人了解,Selenium是一个自动化监测工具,一般我们会使用Firefox、Chrome来进行浏览器的驱动,它可以对页面进行控制,对页面进行多种操作,也可以获得浏览器当前页面的源代码,实现对指定内容的爬取。话不多说,内容呈上!
一、Selenium的安装
1. 两种安装方法
- 命令行安装,打开cmd,直接输入命令pip install selenium
- 到https://pypi.org/project/selenium/下直接下载selenium包(也可以到https://www.selenium.dev/downloads/下载,不过本人推荐使用第一个链接)
下载后解压,在cmd里进入到该文件所在路径下,打开dir文件
我的下载位置:
进行安装
最后若是出现语句 Finishd processing dependencies for selenium==3.141.0 则表明安装成功
2. 验证是否成功
在cmd里进入到python下,import selenium 回车,没有报错说明安装成功
二、安装驱动
要想调用selenium包控制浏览器就要安装webdriver,可以选择下载Firefox的驱动,但是Firefox55以后Selenium IDE就不能用了,所以如果你想用火狐驱动的话,可能就要配一个低版本的火狐浏览器了。这里我下载的是Google的驱动chromedriver,详细过程如下:
1.查看Google版本
不同的版本对应不同的chromedriver,所以在下载驱动前我们要先查看自己电脑上Google浏览器的版本。
2、下载驱动
在http://chromedriver.storage.googleapis.com/index.html下下载对应的版本,我的Google是86.xxxx,所以对应的 我下载的86.xxxx版本的驱动
不要怀疑,就是只有win32位的,各个版本的也只有32位的,32位的64位也是可以用的,所以放心下载吧
3、配置环境变量
下载后解压,复制chromedriver.exe文件粘贴到Google安装路径下的Application下
这是我的安装路径:
复制路径,添加到path下
右击“计算机”——>选择“属性”——>点击“高级系统配置”——>“环境变量”——>Path,粘贴进去
4、验证
打开cmd,输入命令chromedriver回车
5、测试
在程序中测试:
from selenium import webdriver
browser = webdriver.Chrome()
成功
三、驱动页面在去哪儿网查询上海的酒店信息(这一部分主要是练习驱动)
1、大致思路
去哪儿酒店信息查询
刚刚进去的页面是这样的
网页默认地点是“北京”,时间为当天
所以我们需要定位到地址框——>清空框——>填入目的地“上海”——>定位到“搜索”按钮——>点击按钮
2、详细代码
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("https://hotel.qunar.com")#调用get()方法 来请求网页
#元素交互操作
#将关键词传入搜索框
input = browser.find_element_by_class_name('inputText')#定位到搜索框
input.clear()#原搜索框中有“北京”,所以要先清空搜索框
input.send_keys('上海')#传入地点
#点击“搜索”按钮
button = browser.find_element_by_class_name('main')#找到搜索按钮
#button.click()#点击按钮 或
#定位搜索按钮时,有可能会被填入地址栏时触动的东西所遮挡,以至于程序报错,无法点击搜索按钮,所以也可以换成这个语句
browser.execute_script("arguments[0].click();", button)#避免了按钮被遮挡
time.sleep(5)
四、爬取搜索下的所有酒店名称
这一部分个人的主要描述放在代码里注释了,尽可能做到详细,把我的思路都解释出来,为了使代码整体上简洁,所以对上面的代码做了调整,总的代码如下:
from selenium import webdriver
import time
from lxml import etree
#调度页面,查询上海的酒店信息
#这一部分便是对上面的代码做的微调
def contral(url):
browser = webdriver.Chrome()
browser.get(url)#调用get()方法 来请求网页
input = browser.find_element_by_class_name('inputText')#定位到搜索框
input.clear()#原搜索框中有“北京”,所以要先清空搜索框
input.send_keys('上海')#传入地点
time.sleep(5)
button = browser.find_element_by_class_name('main')#找到搜索按钮
#button.click()#点击按钮
browser.execute_script("arguments[0].click();", button)#避免了按钮被遮挡
time.sleep(1)
return browser
#获取单个页面下酒店的名字
def get_one_page(html):
#使用xpath方法获取内容
html = etree.HTML(html)
#爬取酒店名称时,我用的xpath方法,其实本人还是挺喜欢这种方法的可以偷懒
h = html.xpath('//*[@id="hotel_lst_body"]/li/div/div[3]/p[1]/a/text()')
#将内容用空格隔开
hotel = " ".join(h)
return hotel
获取指定内容的xpath时,可以采用复制偷懒
比如下面获取单个酒店名称,
复制内容为 //*[@id=“hotel_lst_body”]/li[1]/div/div[3]/p[1]/a ,当然这只是获取单个,获取多个时,li不比添加索引
#进行页面的切换,汇总总数
def get_content(browser):
hotels = []
for i in range(8):
html = browser.page_source#get_newhtml(browser)
oneh = get_one_page(html)
hotels.append(oneh)
#定位到“下一页”按钮
#这里我本来选用的find_element_by_class_name()方法但是失败了,
#报错提醒我让我用find_element_by_css_selector()
next_page = browser.find_element_by_css_selector('[class="next fl_right cur able"]')
next_page.click()#点击“下一页”
time.sleep(5)
return hotels
if __name__ == '__main__':
url = 'https://hotel.qunar.com'
browser = contral(url)
hotels = get_content(browser)
print(hotels)#也可以保存起来
注意的点就是别忘了使用time.sleep(),我看其他资料说这个是为了模拟人操作时的进行时间,其实本人也说不上来具体什么意思,但就是少了它还真不能运行。
*~~*前路漫漫,任重而道远