元旦快要来了就意味着假期快要来了。有没有计划好元旦去哪里散心呢?
今天就用爬虫带你分析以下国内最热门城市哪些值得你去~
首先我们的目标网站是穷游网。
https://place.qyer.com/china/citylist-0-0-1/
我们要抓取的数据是这些热门城市的名称、排行榜、旅游人次和旅游景点。
老规矩,爬虫四部曲:
1.找爬虫所在url地址(系统性的网页分析)
2.发送网络请求
3.数据解析(我们所需数据)
4.保存数据
1.找爬虫所在url地址(系统性的网页分析)
首先我们来分析网页属于动态加载还是静态加载。教你一招最简单的办法。
如上图找到浏览器设置,禁止javascript加载,如果网页还如先前一般正常显示。即说明该网页属于静态加载。
2.咱们今天要分析的网站就属于一个静态加载。所以目标url就可以确定下来,即浏览器导航栏地址
url= https://place.qyer.com/china/citylist-0-0-1/
3.伪装成浏览器发送请求。为了防止网站反爬,我们需要对爬虫代码进行伪装,打开浏览器开发者模式可以看到网站发送请求时会携带这么多的参数。这里我们只需refer、user-agent(浏览器身份)进行伪装即可。
4.发送网络请求,需要数据请求模块requests模拟浏览器发送网络请求。
#m模拟浏览器发送网络请求
resp = requests.get(url, headers = headers)html_data = resp.textprint(html_data)
返回的结果其实和我们在浏览器里面看到的其实是一样的。
5.数据的解析,打开浏览器的开发者模式发现这些城市的信息都位于一个个li元素标签中。也就是说一个li元素内就是一个城市的信息。而所有的li元素又都在一个叫做ul的父标签之内。
所以我们首先要提取到ul这个父标签的位置。
6.我们可以看到ul所在位置有一个class = 'plcCitylist'的属性。
lis= selector.xpath('//ul[@class = "plcCitylist"]/li')
7.获取到了所有li的位置之后我们就可以循环获取li标签里面的城市信息了。
forliinlis:city_name = li.xpath('h3/a/text()').get()
#城市名称print(city_name)#
香港 澳门 台北 台湾 北京 上海 成都 广州 南京 杭州 厦门 深圳 重庆 三亚 珠海
8.同样方法我们可以获取到城市名称、旅游人数、热门景点、城市图片和城市详情等情况。
travel_name = li.xpath('h3/a/text()').get()#城市名称
travel_no = li.xpath('p[2]/text()').get()#旅游人数
travel_hot = li.xpath('.//p[@class = "pois"]/a/text()').getall()#热门城市
travel_hot = [hot.strip()forhotintravel_hot]
travel_hot ='、'.join(travel_hot)#join()合并列表对象
travel_url = li.xpath('h3/a/@href').get()#城市详情页面地址
travel_img = li.xpath('p/a/img/@src').get()#城市封面图片
结果打印如下:
香港 | 338157人去过 | 香港海洋公园、星光大道、维多利亚港、太平山、尖沙咀、金紫荆广场、香港迪士尼乐园、中环、弥敦道、兰桂坊、中银大厦、香港杜莎夫人蜡像馆、中环至半山自动扶梯、旺角、湾仔、黄大仙祠、铜锣湾、庙街、凌霄阁、重庆大厦 | //place.qyer.com/hong-kong/ | https://pic.qyer.com/album/user/213/10/Q0hWQxoGYg/index/cover
澳门| 199621人去过 |澳门大三巴牌坊、大炮台、议事亭前地、玫瑰堂、官也街、妈阁庙、氹仔岛、澳门渔人码头、民政总署大楼、澳门威尼斯人、大三巴街、澳门博物馆、金莲花广场、岗顶前地、玛嘉烈蛋挞店、澳门旅游塔、龙环葡韵住宅式博物馆、东望洋炮台、圣若瑟修院及圣堂、黑沙海滩| //place.qyer.com/macau/ |https://pic.qyer.com/album/user/1015/77/QElURx0AZE8/index/cover
9.最后一步就是我们的数据保存了,我们需要导入python自带csv模块。然后将所有我们获取到的数据保存在 '穷游网数据.csv' 文件中
withopen('穷游网数据.csv',mode='a',encoding='utf-8',newline='')asf:
csv_write = csv.writer(f)
csv_write.writerow([travel_name,travel_no,travel_hot, travel_url, travel_img])
来看打印结果:
穷游网数据.csv:
10.第一页的数据我们现在已经完美地保存下来了,接下来我们要获取剩下的170页数据。我们先来查看地址栏url规律
第1页:https://place.qyer.com/china/citylist-0-0-1/
第2页:https://place.qyer.com/china/citylist-0-0-2/
第3页:https://place.qyer.com/china/citylist-0-0-5/
第171页:https://place.qyer.com/china/citylist-0-0-171/
发现只有地址栏末尾的数字随着页数在变化。所以我们加上一个简单的循环即可。
for in range(171):# 1.找爬虫所在url地址(系统性的网页分析)
url ='https://place.qyer.com/china/citylist-0-0-{}/'.format(i)
好了到此为止所有爬虫部分已经完成,为了更友好的人际互动,我们再优化一下提示信息。
page = 0foriinrange(171): page+=1print('--------正在爬取第{}页--------'.format(page))
还有为了方式ip被封,所以我们要给爬虫设置一个休眠时间,休眠时间取得是随机数。
time.sleep(random.random()*5)
运行结果如下(此处选取部分截图)
完整代码已经整理好,有需要的小伙伴公众号'印象python'内回复'旅游代码'即可获取!
网友评论