標籤:

Python爬蟲系列-小豬短租

爬完木鳥短租後開始攻克小豬。小豬的網頁結構和木鳥很像,我寫的爬取

計劃和學習點是:

>1.城市數目封裝函數

2.獲得城市列表

3.在城市列表循環,爬取城市數目

4.寫入excel表。

第一步進行的很順利,按部就班的用chrome在小豬這裡找到單個城市的房源數,copy xpath得到鏈接。小豬的房源數沒有木鳥的準確,不過也算數吧。

但在城市列表這裡就遇到坑了。小豬的城市列表不算難找(前提是你知道在JS找的話),但是xz.citys就是一個list,還真不知道怎麼用json取。

yaung說直接copy過來,然後調用就好了。我覺得這樣很搬磚,但是大神說,請求加解析也是很耗費資源的。

好吧,然後程序里就有了一百多行的一個list表。貢獻了整個程序體積的3/4。當然這裡可以寫成一個模塊調用,不過我還沒有練習。

然後每一行是一個城市也是一個循環,在循環里直接a=city[x]這樣調用就好了。

到了這步終於把整個代碼寫好了,但是運行報錯。我看了又看覺得問題還是在於函數不熟,前面定義的函數後面調用的不對。雖然知道錯在哪裡但是改來改去,連全局變數global都用上了。

自己又垂死掙扎了了大半個小時後讓yaung看看,大神用了8分鐘就改完了,真是小淚心酸啊~拿到之後對比一下,還好,主要就是改了三個地方:

1. 定義鏈接這裡,沒有寫format,表達不完整。

```url = http://{city_temp}.xiaozhu.com/?startDate=2017-06-06&endDate=2017-06-08.format(city_temp=city_temp)

2. 因為有運用模塊(我的理解是前面的函數),所以要加上這個語句,先寫下這個條件語句再開始城市列表循環。

```if __name__ == __main__:

3.將先前定義的函數,所取得的城市房間數 賦予新的變數city_number,

在我的原稿中就是get_city_room_num(city_code),最先報錯也是這裡。大概最嚴重的錯誤也是這裡。(比起上次連個json都看不懂,這時候感覺已經進步了...)

```city_number = get_city_room_num(city_code)

然後就運行出來了!拿到結果一看,很多很奇怪的數據,比如興安這個我都搞不懂在哪個省的地方,居然有3000+房源。然後也有很多城市的數據是空白的。再嘗試了幾下,原來雖然城市列表的拼音縮略和實際找房的url不一樣。

比如xa在城市列表中是興安,但xa.xiaozhu.com就代表了西安,所以房源才那麼多。

寫程序的人思路系這樣:你搜索「杭州」,城市列表指向hz,但是實際的url可以是hz.xiaozhu.com,也可以是hangzhou.xiaozhu.com。然後還有些例外,比如興安/西安這個。

又試了一下,用城市全拼也是可以找到鏈接的,比如xian.xiaozhu.com就肯定不會錯。

所以在城市循環中,把city_code從city[0]改為[2],再帶入url中,爬到的數據就正確多了。

完整代碼如下:

```# coding:utf-8import randomimport requestsfrom lxml import etreedef getReqHeaders(): # 功能:隨機獲取HTTP_User_Agentuser_agents = ["Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"]user_agent = random.choice(user_agents)req_headers = {User-Agent: user_agent}return req_headersdef get_city_room_num(city_temp):url = http://{city_temp}.xiaozhu.com/?startDate=2017-06-06&endDate=2017-06-08.format(city_temp=city_temp)html = requests.get(url, headers=getReqHeaders()).contentselector = etree.HTML(html)return selector.xpath(//*[@id="searchTotal"]/text())#copy city_listcity_list = [["bj", "北京", "beijing", "bj", "2079", "beijing", "北京", "", "", 12],["sh", "上海", "shanghai", "sh", "910", "shanghai", "上海", "", "", 13]]#以下略city_dict = []if __name__ == __main__:for city in city_list:item = {}city_code = city[2]city_name = city[1]city_number = get_city_room_num(city_code)item[city] = city_codeitem[city_name] = city_nameitem[number] = city_number# item[province]=provincecity_dict.append(item)print(item)

推薦閱讀:

為什麼使用BeautifulSoup時,把解析器換成lxml就出錯?
給妹子講python--17函數的基本特徵
機器學習導論——Day4、5
Python實踐31-用virtualenv構建Python2和Python3的運行環境
VisPy 中文文檔:基礎內容

TAG:Python |