爬完木鳥短租后開始攻克小豬。小豬的網(wǎng)頁結(jié)構和木鳥很像膘流,我寫的爬取
計劃和學習點是:
1.城市數(shù)目封裝函數(shù)
2.獲得城市列表
3.在城市列表循環(huán),爬取城市數(shù)目
4.寫入excel表。
第一步進行的很順利店溢,按部就班的用chrome在小豬這里找到單個城市的房源數(shù),copy xpath得到鏈接委乌。小豬的房源數(shù)沒有木鳥的準確床牧,不過也算數(shù)吧。
但在城市列表這里就遇到坑了遭贸。小豬的城市列表不算難找(前提是你知道在JS找的話)戈咳,但是xz.citys就是一個list,還真不知道怎么用json取壕吹。
yaung說直接copy過來著蛙,然后調(diào)用就好了。我覺得這樣很搬磚耳贬,但是大神說踏堡,請求加解析也是很耗費資源的。
好吧咒劲,然后程序里就有了一百多行的一個list表顷蟆。貢獻了整個程序體積的3/4。當然這里可以寫成一個模塊調(diào)用缎患,不過我還沒有練習慕的。
然后每一行是一個城市也是一個循環(huán),在循環(huán)里直接a=city[x]這樣調(diào)用就好了挤渔。
到了這步終于把整個代碼寫好了肮街,但是運行報錯。我看了又看覺得問題還是在于函數(shù)不熟判导,前面定義的函數(shù)后面調(diào)用的不對嫉父。雖然知道錯在哪里但是改來改去,連全局變量global都用上了眼刃。
自己又垂死掙扎了了大半個小時后讓yaung看看绕辖,大神用了8分鐘就改完了,真是小淚心酸啊~拿到之后對比一下擂红,還好仪际,主要就是改了三個地方:
- 定義鏈接這里,沒有寫format,表達不完整树碱。
url = 'http://{city_temp}.xiaozhu.com/?startDate=2017-06-06&endDate=2017-06-08'.format(city_temp=city_temp)
- 因為有運用模塊(我的理解是前面的函數(shù))肯适,所以要加上這個語句,先寫下這個條件語句再開始城市列表循環(huán)成榜。
if __name__ == '__main__':
3.將先前定義的函數(shù)框舔,所取得的城市房間數(shù) 賦予新的變量city_number,
在我的原稿中就是get_city_room_num(city_code)赎婚,最先報錯也是這里刘绣。大概最嚴重的錯誤也是這里。(比起上次連個json都看不懂挣输,這時候感覺已經(jīng)進步了...)
city_number = get_city_room_num(city_code)
然后就運行出來了纬凤!拿到結(jié)果一看,很多很奇怪的數(shù)據(jù)撩嚼,比如興安這個我都搞不懂在哪個省的地方移斩,居然有3000+房源。然后也有很多城市的數(shù)據(jù)是空白的绢馍。再嘗試了幾下,原來雖然城市列表的拼音縮略和實際找房的url不一樣肠套。
比如xa在城市列表中是興安舰涌,但xa.xiaozhu.com就代表了西安,所以房源才那么多你稚。
寫程序的人思路系這樣:你搜索“杭州”瓷耙,城市列表指向hz,但是實際的url可以是hz.xiaozhu.com刁赖,也可以是hangzhou.xiaozhu.com搁痛。然后還有些例外,比如興安/西安這個宇弛。
又試了一下鸡典,用城市全拼也是可以找到鏈接的,比如xian.xiaozhu.com就肯定不會錯枪芒。
所以在城市循環(huán)中彻况,把city_code從city[0]改為[2],再帶入url中舅踪,爬到的數(shù)據(jù)就正確多了纽甘。
完整代碼如下:
# coding:utf-8
import random
import requests
from lxml import etree
def getReqHeaders(): # 功能:隨機獲取HTTP_User_Agent
user_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_headers
def 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()).content
selector = etree.HTML(html)
return selector.xpath('//*[@id="searchTotal"]/text()')
#copy city_list
city_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_code
item['city_name'] = city_name
item['number'] = city_number
# item['province']=province
city_dict.append(item)
print(item)