前言:
Python对于本人来讲也是一个在逐渐学习掌握的过程,这次的内容就从旅游开始讲起,进入正文前首先附(fang)上(du)最令我垂涎欲滴的海鲜盛宴。
数据爬取:
最近几天朋友圈被大家的旅行足迹刷屏了,惊叹于那些把全国所有省基本走遍的朋友。与此同时,也萌生了写一篇旅行相关的内容,本次数据来源于一个对于爬虫十分友好的旅行攻略类网站:蚂蜂窝
PART1:获得城市编号
蚂蜂窝中的所有城市、景点以及其他的一些信息都有一个专属的5位数字编号,我们第一步要做的就是获取城市(直辖市+地级市)的编号,进行后续的进一步分析。
以上两个页面就是我们的城市编码来源,需要首先从目的地页面获得各省编码,之后进入各省城市列表获得编码。过程中需要Selenium进行动态数据爬取,部分代码如下:
deffind_cat_url(url):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req=request.Request(url,headers=headers)
html=urlopen(req)
bsObj=BeautifulSoup(html.read(),"html.parser")
bs=bsObj.find('div',attrs={'class':'hot-list clearfix'}).find_all('dt')
cat_url=[]
cat_name=[]
foriinrange(0,len(bs)):
forjinrange(0,len(bs[i].find_all('a'))):
cat_url.append(bs[i].find_all('a')[j].attrs['href'])
cat_name.append(bs[i].find_all('a')[j].text)
cat_url=['http://www.mafengwo.cn'+cat_url[i]foriinrange(0,len(cat_url))]
returncat_url
deffind_city_url(url_list):
city_name_list=[]
city_url_list=[]
foriinrange(0,len(url_list)):
driver=webdriver.Chrome()
driver.maximize_window()
url=url_list[i].replace('travel-scenic-spot/mafengwo','mdd/citylist')
driver.get(url)
whileTrue:
try:
time.sleep(2)
bs=BeautifulSoup(driver.page_source,'html.parser')
url_set=bs.find_all('a',attrs={'data-type':'目的地'})
city_name_list=city_name_list+[url_set[i].text.replace('n','').split()[0]foriinrange(0,len(url_set))]
city_url_list=city_url_list+[url_set[i].attrs['data-id']foriinrange(0,len(url_set))]
js="var q=document.documentElement.scrollTop=800"
driver.execute_script(js)
time.sleep(2)
driver.find_element_by_class_name('pg-next').click()
except:
break
driver.close()
returncity_name_list,city_url_list
url='http://www.mafengwo.cn/mdd/'
url_list=find_cat_url(url)
city_name_list,city_url_list=find_city_url(url_list)
city=pd.DataFrame({'city':city_name_list,'id':city_url_list})
PART2:获得城市信息
城市数据分别从以下几个页面获取:
(a)小吃页面
(b)景点页面
(c)标签页面
我们将每个城市获取数据的过程封装成函数,每次传入之前获得的城市编码,部分代码如下:
复制编辑
defget_city_info(city_name,city_code):
this_city_base=get_city_base(city_name,city_code)
this_city_jd=get_city_jd(city_name,city_code)
this_city_jd['city_name']=city_name
this_city_jd['total_city_yj']=this_city_base['total_city_yj']
try:
this_city_food=get_city_food(city_name,city_code)
this_city_food['city_name']=city_name
this_city_food['total_city_yj']=this_city_base['total_city_yj']
except:
this_city_food=pd.DataFrame()
returnthis_city_base,this_city_food,this_city_jd
defget_city_base(city_name,city_code):
url='http://www.mafengwo.cn/xc/'+str(city_code)+'/'
bsObj=get_static_url_content(url)
node=bsObj.find('div',{'class':'m-tags'}).find('div',{'class':'bd'}).find_all('a')
tag=[node[i].text.split()[0]foriinrange版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/bf02jgtrs00xktcx/article/details/81024314
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。