Python爬虫系列-途家

途家网不算很难爬,虽然它在同类网站中被我放到了最后。房间数用bs不算难取,而且城市列表也是用js很快就找到了。


Python爬虫系列-途家_第1张图片
1.png

这里就把新学到的两个知识点写一下:

2.png

首先是途家的js包有点怪,类似天气网的包,所以要用切片或者截取字符串的形式摘取字典。它的前面不但有var...等字符,最后还有一个分号,所以前后都要摘取。
这里我开始写的切片不对,请教yaung大神后应该是以下几种格式:
字符串格式,用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]

我原来也是这种格式,但我犯了傻,一个个数字符,其实用len函数就好了嘛,而且也没有用‘-1’去把后面的分号去掉,所以改来改去都不对。

我是继续犯傻的分界线


然后把城市名调入网页url的格式,也还是没有掌握好,
一种是

city_id='sanya'
url='http://www.baidu.com?{}.html'.format(city_id)
print city_url 

这里我光是套入了{},忘了写format(明明以前的代码有示范),所以死活读不出来。
另外一个格式是用%s,这个书里有学,但还是不会活用。


city_id='sanya'
url='http://www.baidu.com?%s.html'
city_url=url % city_id

打印url是为了:一般构造完以后,测试时候先把构造的url打印一下,再请求。如果url都没有构造对,封装函数也是解析不出数据的。-by程工

按理说 requests.get(url).content 方法是返回的byte型源码,可以不用decode('utf-8'),但我这里就会报错,不知道是不是跟后面的犯傻有关。

附上部分代码,其他请求头那些就不再写了。

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']

今天其实还犯了第三件傻事,把一个很重要的json encoding文件删掉了。重装python以后也没找回来,pip安装都报错,最后装了anacoda搞掂。

希望明天人品好,不要在json上给我捣乱了,不然真的好花时间。
又学到了新的东西,还是挺高兴的~

你可能感兴趣的:(Python爬虫系列-途家)