Python爬蟲實(shí)戰(zhàn)之用selenium爬取某旅游網(wǎng)站
一、selenium實(shí)戰(zhàn)
這里我們只會(huì)用到很少的selenium語(yǔ)法,我這里就不補(bǔ)充別的用法了,以實(shí)戰(zhàn)為目的
二、打開(kāi)藝龍網(wǎng)
可以直接點(diǎn)擊這里進(jìn)入:藝龍網(wǎng)
這里是主頁(yè)
三、精確目標(biāo)
我們的目標(biāo)是,鶴壁市,所以我們應(yīng)該先點(diǎn)擊搜索框,然后把北京刪掉,替換成鶴壁市,那么怎么通過(guò)selenium實(shí)現(xiàn)呢?
打開(kāi)pycharm,新建一個(gè)叫做藝龍網(wǎng)的py文件,先導(dǎo)包:
from selenium import webdriver import time # 導(dǎo)包 driver = webdriver.Chrome() # 創(chuàng)建一個(gè)selenium的對(duì)象 driver.get("http://www.elong.com/") time.sleep(1) # 打開(kāi)網(wǎng)站,并讓它睡1s,避免渲染未完成就進(jìn)行下一步操作 driver.maximize_window() # 將瀏覽器最大化
怎么找到搜索框呢,有很多方法,xpath,css,JavaScript,jQuery,,,因?yàn)閤path簡(jiǎn)單,所以我們只使用xpath,因?yàn)檫@個(gè)網(wǎng)站也是可以用xpath的,具體步驟是:
1.F12,小箭頭,點(diǎn)擊搜索框
2.點(diǎn)擊后,找到元素中的位置,右鍵,復(fù)制,復(fù)制xpath
3.進(jìn)入pycharm中,在之前創(chuàng)建的py文件中添加如下代碼
driver.find_element_by_xpath('//*[@id="domesticDiv"]/dl[1]/dd/input').clear() # 將搜索框中的內(nèi)容清理
4.在搜索框添加“鶴壁市”
driver.find_element_by_xpath('//*[@id="domesticDiv"]/dl[1]/dd/input').send_keys('鶴壁市')
5.點(diǎn)擊搜索,進(jìn)入下一頁(yè)
time.sleep(1) driver.find_element_by_xpath('//*[@id="hotel_sub_tabs"]/span[1]/b').click() # 點(diǎn)擊無(wú)關(guān) time.sleep(1) # 避免渲染不及時(shí)導(dǎo)致報(bào)錯(cuò) driver.find_element_by_xpath('//*[@id="domesticDiv"]/div/span[1]').click() # 點(diǎn)擊搜索
6.下一頁(yè)
此時(shí)我們絕望的發(fā)現(xiàn),這些操作都是沒(méi)用的(對(duì)這個(gè)網(wǎng)站沒(méi)用,但是至少我們學(xué)到了點(diǎn)知識(shí)?)她還是北京
所以我們只能這樣做了
直接點(diǎn)擊搜索,進(jìn)入這個(gè)頁(yè)面后再輸入鶴壁(那干嘛不直接訪問(wèn)這個(gè)網(wǎng)頁(yè)呢?為了我這該死的儀式感?。。┻@樣做,再那樣做,就行了
from selenium import webdriver import time # 導(dǎo)包 driver = webdriver.Chrome() # 創(chuàng)建一個(gè)selenium的對(duì)象 driver.get("http://www.elong.com/") time.sleep(1) # 打開(kāi)網(wǎng)站,并讓它睡1s,避免渲染未完成就進(jìn)行下一步操作 driver.maximize_window() # 將瀏覽器最大化 driver.find_element_by_xpath('//*[@id="domesticDiv"]/div/span[1]').click() # 點(diǎn)擊搜索 driver.find_element_by_xpath('//*[@id="m_searchBox"]/div[1]/label/input').clear() # 清空搜索框內(nèi)容 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語(yǔ)法
然后就成功的定位到了鶴壁市
8.分析網(wǎng)頁(yè),找到詳情頁(yè)的url
我們可以這樣做
我們發(fā)現(xiàn),這個(gè)詳情頁(yè)每個(gè)的xpath都不相同,怎么做到把所有詳情頁(yè)都“照顧”得到呢?看來(lái)只能請(qǐng)出我們的requests來(lái)了,然后我們發(fā)現(xiàn),這個(gè)只是一段URL,那怎么辦?拼接咯!
9.通過(guò)查看響應(yīng),我們知道響應(yīng)和元素是一樣的,那么說(shuō)明什么?我們可以通過(guò)xpath提取到我們的元素,直接請(qǐng)出我們的xpath選手。
from lxml import etree import re html_data = driver.page_source # 將數(shù)據(jù)存入html_data ht = ht_ht.xpath('//div[@class="to_detail"]/a/@data-link') # 提取到url的后半段
10.拼接字符串形成新URL
點(diǎn)進(jìn)去一個(gè)詳情頁(yè)查看URL,發(fā)現(xiàn)是這樣的
研究發(fā)現(xiàn),將?issugtrace=2刪去也可以運(yùn)行,而我們通過(guò)xpath取到的正是后面的 /31712004/,所以:
for ur in ht: new_ul = 'http://www.elong.com' + ur
11.取到詳情頁(yè)URL后,就要點(diǎn)進(jìn)去,然后再分析網(wǎng)頁(yè),再提取數(shù)據(jù),然后存數(shù)據(jù),找xpath的我就先不說(shuō)了,也不難。
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) # 轉(zhuǎn)為可使用xpath的HTML格式 tingche = ht_data.xpath('//*[@id="hotelContent"]/div/dl[4]/dd/text()') # 停車位 if tingche == []: tingche = '無(wú)停車位' 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()')
然后我們就拿到了數(shù)據(jù),接下來(lái),這些數(shù)據(jù)怎么保存呢?可以使用字典保存到j(luò)son中。我就接著上面的寫了
dic = {} # 使用字典進(jìn)行json存儲(chǔ) ic[f"{name}"] = {} dic[f"{name}"][f"{name}停車場(chǎng)"] = tingche dic[f"{name}"][f"{name}電話"] = phine_num dic[f"{name}"][f"{name}位置"] = weizhi dic[f"{name}"][f"{name}描述"] = miaoshu path = f"酒店數(shù)據(jù)//{name}" if not os.path.exists(path): os.mkdir(path) # 創(chuàng)建酒店文件夾 for num, photo in zip(range(len(photo_li)), photo_li): if num > 4: break else: with open(f'酒店數(shù)據(jù)//{name}//{name, num + 1}.jpg', 'wb') as f: f.write(requests.get(photo).content) # 將照片存進(jìn)本地 with open(f"酒店數(shù)據(jù)//{name}//酒店數(shù)據(jù).json", 'w') as f: f.write(str(dic)) # 將json存入文件 dic = {} # 將字典內(nèi)的數(shù)據(jù)清楚,留待下一次循環(huán)使用
12.數(shù)據(jù)拿到之后,還沒(méi)完,我們還要爬下一頁(yè),首先需要把主頁(yè)滑倒最底部
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.回到主頁(yè)面,找到下一頁(yè)的xpath,點(diǎn)擊
driver.find_element_by_xpath('//*[@id="pageContainer"]/a[9]').click()
然后,我們就進(jìn)入了 下一頁(yè),然后下面就沒(méi)有代碼了,怎么辦,怎么讓代碼一直運(yùn)行將很多頁(yè)的數(shù)據(jù)爬下來(lái)呢?有兩種方法:
封裝函數(shù),并發(fā)爬取使用循環(huán)進(jìn)行爬取
然后,就沒(méi)有然后了…
四、成功
成功拿到數(shù)據(jù)
結(jié)語(yǔ)
希望大家能夠通過(guò)實(shí)戰(zhàn)了解各種語(yǔ)法的功能,而不是死記硬背各種語(yǔ)法,那樣你很容易忘記,其實(shí)很多學(xué)習(xí)都可以通過(guò)這種方式來(lái)學(xué)習(xí)
到此這篇關(guān)于Python爬蟲實(shí)戰(zhàn)之用selenium爬取某旅游網(wǎng)站的文章就介紹到這了,更多相關(guān)Python selenium爬取網(wǎng)站內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)numpy下的軸交換transpose和swapaxes的示例解讀
今天小編就為大家分享一篇對(duì)numpy下的軸交換transpose和swapaxes的示例解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Python Flask 請(qǐng)求數(shù)據(jù)獲取響應(yīng)詳解
這篇文章主要介紹了Python Flask請(qǐng)求數(shù)據(jù)獲取響應(yīng)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-10-10python爬蟲開(kāi)發(fā)之使用Python爬蟲庫(kù)requests多線程抓取貓眼電影TOP100實(shí)例
這篇文章主要介紹了python爬蟲開(kāi)發(fā)之使用Python爬蟲庫(kù)requests多線程抓取貓眼電影TOP100實(shí)例,需要的朋友可以參考下2020-03-03在Python 不同級(jí)目錄之間模塊的調(diào)用方法
今天小編就為大家分享一篇在Python 不同級(jí)目錄之間模塊的調(diào)用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python可視化篇之流式數(shù)據(jù)監(jiān)控的實(shí)現(xiàn)
這篇文章主要介紹了python可視化篇之流式數(shù)據(jù)監(jiān)控的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08pycharm中選中一個(gè)單詞替換所有重復(fù)單詞的實(shí)現(xiàn)方法
這篇文章主要介紹了pycharm中選中一個(gè)單詞替換所有重復(fù)單詞的實(shí)現(xiàn)方法,類似于sublime 里的ctrl+D功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-11-11