上一篇我们已经知道怎么简单使用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的,具体步骤是:
driver.find_element_by_xpath('//*[@id="domesticDiv"]/dl[1]/dd/input').clear()
# 将搜索框中的内容清理
driver.find_element_by_xpath('//*[@id="domesticDiv"]/dl[1]/dd/input').send_keys('鹤壁市')
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() # 点击搜索
from selenium import webdriver
import 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语法
from lxml import etree
import re
html_data = driver.page_source # 将数据存入html_data
ht = ht_ht.xpath('//div[@class="to_detail"]/a/@data-link') # 提取到url的后半段
for ur in ht:
new_ul = 'http://www.elong.com' + ur
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 = {
} # 将字典内的数据清楚,留待下一次循环使用
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)
driver.find_element_by_xpath('//*[@id="pageContainer"]/a[9]').click()
然后,我们就进入了 下一页,然后下面就没有代码了,怎么办,怎么让代码一直运行将很多页的数据爬下来呢?有两种方法:
然后,就没有然后了…
成功拿到数据
希望大家能够通过实战了解各种语法的功能,而不是死记硬背各种语法,那样你很容易忘记,其实很多学习都可以通过这种方式来学习