文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。css
做者: TinaLYweb
PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取api
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef網絡
網上不少爬取教程,可是通常存在兩個問題:app
一是:本身調試會遇到不少bug,通常沒法直接使用,對於調試代碼有難度的來講比較抓狂;函數
學習
此次是根據本身的經驗,提供小批量爬取的數據,能拆開的代碼儘可能拆開。測試
用的爬取結構,主要是selenium,網頁會接二連三地打開。ui
以濟南市爲例,爲了小規模測試,針對單個行政區分別獲取,代碼熟悉以後可將區改成循環。url
關鍵包:
1 from selenium import webdriver 2 from urllib import request,parse 3 from selenium.common.exceptions import NoSuchElementException
定義參數(前三行是高德API獲取座標用獲得,第四行是爬取的城市,通常網頁連接接中會有):
1 amap_web_key = '你的key' 2 poi_search_url = "http://restapi.amap.com/v3/place/text" 3 poi_boundary_url = "https://ditu.amap.com/detail/get/detail" 4 city ='jinan'
關鍵代碼:
1 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36'} 2 driver1 = webdriver.Chrome() 3 pageid = 1 4 while(pageid <='頁碼數')://此處頁碼數是指進入某個區以後顯示的頁碼數量 5 allarray = [] 6 print('pageid =',pageid) 7 url ='https://jn.lianjia.com/xiaoqu/pingyin/pg'+str(pageid) 8 driver1.get(url) 9 driver1.implicitly_wait(5) 10 house_list =driver1.find_elements_by_class_name('img') 11 for i in range(house_list.__len__()): 12 time.sleep(2) 13 temparray =[] 14 detailurl = house_list[i].get_attribute('href') 15 print(i,'detailurl',detailurl) 16 driver = webdriver.Chrome() 17 driver.get(detailurl) 18 try: 19 housename =driver.find_element_by_class_name('detailTitle').text 20 price = driver.find_element_by_class_name('xiaoquUnitPrice').text 21 xiaoquinfo = driver.find_elements_by_class_name('xiaoquInfoContent') 22 # [佔地面積,建築面積,容積率,綠化率,停車位,樓棟總數,總戶數,物業公司,物業費,物業描述,樓層情況] 23 xiaoquage = xiaoquinfo[0].text #建築年代 24 jianzhuleixing = xiaoquinfo[1].text # 建築類型 25 wuyefei = xiaoquinfo[2].text # 物業費用 26 dongshu = xiaoquinfo[5].text # 樓棟總數 27 hushu = xiaoquinfo[6].text #房屋總數 28 temparray.append(housename) 29 temparray.append(price) 30 temparray.append(jianzhuleixing) # 戶數 31 temparray.append(wuyefei) # 物業費 32 temparray.append(dongshu) # 容積率 33 temparray.append(hushu) # 綠化率 34 # location = getpoi_page(temparray[0])//調用利用高德API獲取座標的函數 35 # 經過高德查詢經緯度 36 //得到小區的最終目的要落到地圖上,因此須要得到座標點,高德開源API能夠得到,可是 37 //因爲一個key的查詢數量有限,爲了防止中間出錯,建議先把全部房屋數據創建起來以後, 38 //統一查座標,對於初學者,一切以簡單易實現爲主! 39 temparray.append('0') 40 temparray.append('0') 41 # if (location == ''): 42 # temparray.append('0') 43 # temparray.append('0') 44 # else: 45 # temparray.append(location[0]) 46 # temparray.append(location[1]) 47 # break 48 # print(temparray) 49 except NoSuchElementException as msg: 50 //異常拋出函數很是很是重要,雖然諸如淘寶、阿里巴巴等頁面都有統一的HTML標籤格式, 51 //可是有經驗的童鞋應該知道,總會有那麼一兩個不按常規出牌的,若是異常拋出機制寫 52 //很差,常常容易前功盡棄 53 # print("第",i,"個小區查找元素失敗") 54 try: 55 housename = driver.find_element_by_class_name('detailTitle').text 56 price = driver.find_element_by_css_selector("[class='xiaoquPrice clear']").text 57 //對比上面的price能夠看出,異常拋出是由於對於price屬性出現了兩種標籤 58 xiaoquinfo = driver.find_elements_by_class_name('xiaoquInfoContent') 59 # [佔地面積,建築面積,容積率,綠化率,停車位,樓棟總數,總戶數,物業公司,物業費,物業描述,樓層情況] 60 xiaoquage = xiaoquinfo[0].text # 建築年代 61 jianzhuleixing = xiaoquinfo[1].text # 建築類型 62 wuyefei = xiaoquinfo[2].text # 物業費用 63 dongshu = xiaoquinfo[5].text # 樓棟總數 64 hushu = xiaoquinfo[6].text # 房屋總數 65 temparray.append(housename) 66 temparray.append(price) 67 temparray.append(jianzhuleixing) # 戶數 68 temparray.append(wuyefei) # 物業費 69 temparray.append(dongshu) # 容積率 70 temparray.append(hushu) # 綠化率 71 temparray.append('0') 72 temparray.append('0') 73 except NoSuchElementException as msg: 74 print("兩種狀況均查不到") 75 allarray.append(temparray) 76 driver.close() 77 text_save(allarray, 'lianjia_fangwu.txt') 78 pageid += 1