途家網(wǎng)不算很難爬,雖然它在同類網(wǎng)站中被我放到了最后。房間數(shù)用bs不算難取,而且城市列表也是用js很快就找到了。

這里就把新學(xué)到的兩個(gè)知識點(diǎn)寫一下:

首先是途家的js包有點(diǎn)怪,類似天氣網(wǎng)的包,所以要用切片或者截取字符串的形式摘取字典。它的前面不但有var...等字符,最后還有一個(gè)分號,所以前后都要摘取。
這里我開始寫的切片不對,請教yaung大神后應(yīng)該是以下幾種格式:
字符串格式,用replace語句
city_data=requests.get(url='https://www.tujia.com/Common/CityInfo/').content.decode('utf-8')
city_data=str(city_data).replace('var cityInfo = ','').replace(';', '')
print(city_data)
city_info=json.loads(city_data)
print(city_info['hotgroup'])
我后來改對的,用strip語句
city_data=str(city_data).lstrip('var cityInfo = ').rstrip(';')
切片格式:
city_data = str(city_data)[len('var cityInfo = '):-1]
我原來也是這種格式,但我犯了傻,一個(gè)個(gè)數(shù)字符,其實(shí)用len函數(shù)就好了嘛,而且也沒有用‘-1’去把后面的分號去掉,所以改來改去都不對。
我是繼續(xù)犯傻的分界線
然后把城市名調(diào)入網(wǎng)頁url的格式,也還是沒有掌握好,
一種是
city_id='sanya'
url='http://www.baidu.com?{}.html'.format(city_id)
print city_url
這里我光是套入了{(lán)},忘了寫format(明明以前的代碼有示范),所以死活讀不出來。
另外一個(gè)格式是用%s,這個(gè)書里有學(xué),但還是不會活用。
city_id='sanya'
url='http://www.baidu.com?%s.html'
city_url=url % city_id
打印url是為了:一般構(gòu)造完以后,測試時(shí)候先把構(gòu)造的url打印一下,再請求。如果url都沒有構(gòu)造對,封裝函數(shù)也是解析不出數(shù)據(jù)的。-by程工
按理說 requests.get(url).content 方法是返回的byte型源碼,可以不用decode('utf-8'),但我這里就會報(bào)錯(cuò),不知道是不是跟后面的犯傻有關(guān)。
附上部分代碼,其他請求頭那些就不再寫了。
def get_city_room_num(city_temp):
url = 'https://www.tujia.com/{city_temp}_gongyu/'.format(city_temp)
html = requests.get(url, headers=get_headers()).content
soup=BeautifulSoup(html,'html.parser')
number = soup.find('div',attrs={'class': 'total-house-amount'})
return number
url2 = 'https://www.tujia.com/***'
html=requests.get(url2,headers=get_headers()).content.decode('utf-8')
html=str(html).lstrip('var cityInfo = ').rstrip(';')
infos1=json.loads(html)
infos=infos1['citys']
今天其實(shí)還犯了第三件傻事,把一個(gè)很重要的json encoding文件刪掉了。重裝python以后也沒找回來,pip安裝都報(bào)錯(cuò),最后裝了anacoda搞掂。
希望明天人品好,不要在json上給我搗亂了,不然真的好花時(shí)間。
又學(xué)到了新的東西,還是挺高興的~