Python爬蟲系列-小豬短租
2.獲得城市列表
3.在城市列表循環,爬取城市數目4.寫入excel表。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__:
在我的原稿中就是get_city_room_num(city_code),最先報錯也是這裡。大概最嚴重的錯誤也是這裡。(比起上次連個json都看不懂,這時候感覺已經進步了...)
```city_number = get_city_room_num(city_code)
然後就運行出來了!拿到結果一看,很多很奇怪的數據,比如興安這個我都搞不懂在哪個省的地方,居然有3000+房源。然後也有很多城市的數據是空白的。再嘗試了幾下,原來雖然城市列表的拼音縮略和實際找房的url不一樣。
比如xa在城市列表中是興安,但http://xa.xiaozhu.com就代表了西安,所以房源才那麼多。寫程序的人思路系這樣:你搜索「杭州」,城市列表指向hz,但是實際的url可以是http://hz.xiaozhu.com,也可以是http://hangzhou.xiaozhu.com。然後還有些例外,比如興安/西安這個。又試了一下,用城市全拼也是可以找到鏈接的,比如http://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 |