python網絡爬蟲抓取ajax動態網頁數據:以抓取KFC門店地址爲例

一,嘗試用BeautifulSoup抓取css

先打開KFC網站門店列表頁面:http://www.kfc.com.cn/kfccda/storelist/index.aspxhtml

能夠看到門店列表以下圖:python

打開Chrome Developer Tools觀察頁面結構,找到標籤以下:web

發現要的數據位於id='listhtml'的表裏,門店地址數據位於第二個tr開始的行裏,嘗試用bs抓取:ajax

url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'  
html = urllib.urlopen(url).read().decode('utf-8')  
bsObj = BeautifulSoup(html, "html.parser")  
print bsObj.find('tbody', {'id':'listhtml'})

輸出:shell

<tbody id="listhtml">  
</tbody>

表格不包含任何內容,可見數據由ajax動態生成,抓取失敗。服務器

二,用selenium + PhantomJS抓取網站

url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'  
# html = urllib.urlopen(url).read().decode('utf-8')  
# bsObj = BeautifulSoup(html, "html.parser")  
# print bsObj.find('tbody', {'id':'listhtml'})  
driver = webdriver.PhantomJS(executable_path='/home/guowei/bin/phantomjs/bin/phantomjs')  
driver.get(url)  
print driver.find_element_by_id('listhtml')

輸出結果:url

<selenium.webdriver.remote.webelement.WebElement object at 0xb6823a8c>

有抓取到對象,但不能肯定是不是包含須要的數據,再分析網頁結構,抓出第一家門店地址看看:spa

print driver.find_element_by_id('listhtml').find_element_by_xpath('//tr[2]/td[1]').text

輸出結果:

茂名餐廳

說明已經成功抓取動態網頁的數據!

3、抓取KFC門店數據

觀察門店數據表格,所需數據從第二行開始,每行前2列表格數據有用,所以抓取代碼以下:

#!/usr/bin/env python  
# -*- coding: utf-8 -*-  
from selenium import webdriver  
import time  
  
url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'  
driver = webdriver.PhantomJS(executable_path='/home/guowei/bin/phantomjs/bin/phantomjs')  
driver.get(url)  
  
time.sleep(2)  
  
for i in range(1,11):  
    shopName_xpath = '//tr[' + str(i + 1) + ']/td[1]'  
    shopAddress_xpath = '//tr[' + str(i + 1) + ']/td[2]'  
    shopName = driver.find_element_by_css_selector('#listhtml').find_element_by_xpath(shopName_xpath).text  
    shopAddress = driver.find_element_by_css_selector('#listhtml').find_element_by_xpath(shopAddress_xpath).text  
    print shopName  
    print shopAddress

輸出結果:

茂名餐廳
吳江路269號2層
翔川餐廳
妙鏡路1118號E號商鋪
動力南廣場餐廳
石龍路750-3號上海南站地下商場南館
江蘇餐廳
江蘇路398號一、2層
威寧餐廳
天山路352號101和201
思賢餐廳
思賢路778--180號
惠樂餐廳
人民西路955號
柳州餐廳
滬閔路9001號上海南站站廳層
真北餐廳
桃浦路328號
馬陸弘基餐廳
馬陸鎮滬宜公路2398/2400號

4、總結

time.sleep()很是重要,若是網速太慢有時候ajax程序還未從服務器取得數據,固然用檢測一個特定HTML標籤的方式會更高效,好比檢測上述數據所在表格最後一行最後一格已經載入就能夠開始抓取數據。

相關文章
相關標籤/搜索