適合初學者的Python爬取鏈家網教程

前言

文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。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
相關文章
相關標籤/搜索