Python爬蟲實戰之用selenium爬取某旅遊網站

一、selenium實戰

這裡我們隻會用到很少的selenium語法,我這裡就不補充別的用法瞭,以實戰為目的

二、打開藝龍網

可以直接點擊這裡進入:藝龍網

這裡是主頁

在這裡插入圖片描述

三、精確目標

我們的目標是,鶴壁市,所以我們應該先點擊搜索框,然後把北京刪掉,替換成鶴壁市,那麼怎麼通過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()
# 將搜索框中的內容清理

4.在搜索框添加“鶴壁市”

driver.find_element_by_xpath('//*[@id="domesticDiv"]/dl[1]/dd/input').send_keys('鶴壁市')

5.點擊搜索,進入下一頁

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()  # 點擊搜索

6.下一頁
此時我們絕望的發現,這些操作都是沒用的(對這個網站沒用,但是至少我們學到瞭點知識?)她還是北京

在這裡插入圖片描述 

所以我們隻能這樣做瞭
直接點擊搜索,進入這個頁面後再輸入鶴壁(那幹嘛不直接訪問這個網頁呢?為瞭我這該死的儀式感!!)這樣做,再那樣做,就行瞭

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語法

然後就成功的定位到瞭鶴壁市

在這裡插入圖片描述

8.分析網頁,找到詳情頁的url
我們可以這樣做

在這裡插入圖片描述

我們發現,這個詳情頁每個的xpath都不相同,怎麼做到把所有詳情頁都“照顧”得到呢?看來隻能請出我們的requests來瞭,然後我們發現,這個隻是一段URL,那怎麼辦?拼接咯!

9.通過查看響應,我們知道響應和元素是一樣的,那麼說明什麼?我們可以通過xpath提取到我們的元素,直接請出我們的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的後半段

10.拼接字符串形成新URL

點進去一個詳情頁查看URL,發現是這樣的

在這裡插入圖片描述

研究發現,將?issugtrace=2刪去也可以運行,而我們通過xpath取到的正是後面的 /31712004/,所以:

for ur in ht:
    new_ul = 'http://www.elong.com' + ur

11.取到詳情頁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 = {}  # 將字典內的數據清楚,留待下一次循環使用

12.數據拿到之後,還沒完,我們還要爬下一頁,首先需要把主頁滑倒最底部

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)

13.回到主頁面,找到下一頁的xpath,點擊

driver.find_element_by_xpath('//*[@id="pageContainer"]/a[9]').click()

然後,我們就進入瞭 下一頁,然後下面就沒有代碼瞭,怎麼辦,怎麼讓代碼一直運行將很多頁的數據爬下來呢?有兩種方法:

封裝函數,並發爬取使用循環進行爬取

然後,就沒有然後瞭…

四、成功

成功拿到數據

在這裡插入圖片描述

結語

希望大傢能夠通過實戰瞭解各種語法的功能,而不是死記硬背各種語法,那樣你很容易忘記,其實很多學習都可以通過這種方式來學習

到此這篇關於Python爬蟲實戰之用selenium爬取某旅遊網站的文章就介紹到這瞭,更多相關Python selenium爬取網站內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: