一,嘗試用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標籤的方式會更高效,好比檢測上述數據所在表格最後一行最後一格已經載入就能夠開始抓取數據。