以上海旅游景点数据为例

参考网址:上海旅游景点

爬虫逻辑:【分页网页url采集】-【数据采集】

还是按照爬虫逻辑二进行获取数据

函数1:get_urls(city,n) → 【分页网页url采集】
         city:城市对应的编码
         n:页数参数
         结果:得到一个分页网页的list

函数2:get_data(ui,d_h,d_c) → 【数据采集】
         ui:数据信息网页
         d_h:user-agent信息
         d_c:cookies信息
         结果:得到数据的list,每条数据用dict存储

采集字段

景点名称、评分、排名、简介、攻略提到数量、点评数量、多少比例驴友来过、经纬度

要求

采集200条数据

20页【分页网页url采集】- 每页10条数据
         结果保存为dataframe,并做基本数据清洗
         经度、纬度、攻略提到数量、点评数量 → 数据格式转换
         评分
         排名
         多少比例驴友来过

查找url规律

去哪儿网上海旅游景点前2-4页的url如下

u2 = https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-2
u3 = https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-3
u4 = https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-4
......

由上可以推知,url规律是将网址最后面的数值进行修改,查看每页的数据,可知一个url里面包含了10条数据,因此就可以构建前20页全部url,第一页的规律一般默认是数字从0开始的(但是这里的是从1开始的)

urllst = []for i in range(20):ui = "https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-{}".format(i+1)urllst.append(ui)

由此,前20个url的信息就已经全部构造完成

导入相关库和封装第一个函数

import requests
from bs4 import BeautifulSoup
import pandas as pddef get_url(n):'''【分页网址url采集】函数n:页数参数结果:得到一个分页网页的list'''lst = []for i in range(n):ui = "https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-{}".format(i+1)lst.append(ui)return lstprint(get_url(10))

输出的结果为:

设置headers和cookies

由于不是在爬豆瓣的数据(cookies改变了),需要登录一下去哪儿网,没有用户的可以注册一下,然后按照之前的步骤获取headers和cookies

将headers和cookies以字典的方式存储

dic_heders = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
dic_cookies = {}
cookies = 'QN1=dXrgj14+tmYQhFxKE9ekAg==; QN205=organic; QN277=organic; QN269=506F28C14A7611EAA0BEFA163E244083; _i=RBTKSRDqFhTQT5KRlx-P1H78agxx; fid=7cc3c3d9-3f6c-45e1-8cef-3384cd5da577; Hm_lvt_c56a2b5278263aa647778d304009eafc=1581168271,1581220912; viewpoi=7564992|709275; viewdist=299878-7; uld=1-299878-8-1581221233|1-1062172-1-1581168529; QN267=1679639433d5aedfc8; Hm_lpvt_c56a2b5278263aa647778d304009eafc=1581221236; QN25=cb06bfbd-d687-4072-98c5-73266b637a6a-9f992f90; QN42=nvxp8441; _q=U.qunar_lbs_428305502; _t=26463150; csrfToken=oXYBnhSoGAGxggRkzmAjbxxGrpgsjUqQ; _s=s_ZBWFJO3EEGZISWS35EBIS5NQYA; _v=YTRjW_H5L47nGNVabvTLt1mlh7j8R7t4UNDVRrJUz0wScfLMWgSvkwQbzMLHlFbsvTU-2kJrBK74NUyOi3MX_3obY94Hhhugt8bv8ILxwsWDv4s_ANNiM8qRdg6HlBrrCEnGYr8lxS9uv78zDCNKz9pFbN8JPYy-AKJP6xILIsT7; _vi=4ONQzvfOOhwJECN5R-4rfWZDzlQ5-qv2xi_jsp1INPEpy9iKHa5gV0gHc35fDfTDe3TjcKteU7ZWk1vd6MsIqTfXYyUh3gTwZJ_9z3PEpkXZReeeIjaVE4HwLTkOATLIzIxg92s-QCWKE1RdNlaZsxPnfN7NHPGAZz5rsmxvpNDY; QN44=qunar_lbs_428305502; QN48=tc_a7fe4861b2d918df_17028369fc8_67ab; QN271=1749d44a-1a11-4886-be27-c3e3bfdadb0c'
cookies_lst = cookies.split("; ")
for i in cookies_lst:dic_cookies[i.split("=")[0]] = i.split("=")[1]

请求网页信息和网页解析

urllst_1 = get_url(10)
u1 = urllst_1[0]r1 = requests.get(u1, headers= dic_heders, cookies = dic_cookies)
print(r1)

输出的结果为:

说明网址可以正常访问,下面就进行网页的解析,在浏览器中该页面右键点击检查,可以发现,整个旅游景点的信息都包含在【ul class=“list_item clrfix”】的标签里面,其中每条数据都在【li】标签下,而且每条标签上还有这个景点的经纬度信息(data-lat=“31.146751”,data-lng=“121.669396”)

因此,可以选择获取某一个旅游景点数据进行试错(一般是选取第一个元素)

urllst_1 = get_url(10)
u1 = urllst_1[0]r1 = requests.get(u1, headers= dic_heders, cookies = dic_cookies)
soup_i = BeautifulSoup(r1.text,'lxml')
ul = soup_i.find("ul",class_="list_item clrfix")
lis = ul.find_all('li')
li_0 = lis[0]print(li_0)

输出的结果如下:(可以正常的获取该标签下的旅游景点的信息,下一步就是解析具体标签获取相应的数据)

已经可以获取每个旅游景点的对应标签的全部数据,那么接下来就可以有针对性的获取我们所需要的数据,依次找到各个数据对应的标签

1)景点名称

2)攻略数量

3)评分

4)简介

5)排名

6)经纬度

7)点评数量

8)多少驴友来过

至此所需数据所对应的标签全部找到,但是需要注意,在获取‘排名’和‘多少驴友来过’这两个标签信息时候,不能直接定位到最后一级的标签(也就是【‘span’,class_=“sum”】),因为这两个数据对应的最后一级标签是一样的,所以要先找到它们的上一级标签,在获取相应的数据

获取所有数据的代码如下:(注意‘排名’数据的获取,有部分是空值,所以直接进行母标签的获取,不能进行子标签的获取)

dic = {}
dic['景点名称'] = li_0.find('span',class_="cn_tit").text
dic['攻略数量'] = li_0.find('div',class_="strategy_sum").text
dic['评分'] = li_0.find('span',class_="total_star").span['style']
dic['简介'] = li_0.find('div',class_="desbox").text
dic['排名'] = li_0.find('span',class_="ranking_sum").text
dic['经度'] = li_0['data-lng']
dic['纬度'] = li_0['data-lat']
dic['点评数量'] = li_0.find('div',class_="comment_sum").text
dic['多少驴友来过'] = li_0.find('span',class_="comment_sum").span.textprint(dic)

输出的结果为:

核对一下,首页的第一条旅游数据和输出的结果数据,可以发现结果是一致的

封装第二个函数

第一条旅游景点数据试错完成后就可以进行遍历数据输出,并封装成为函数,方便调用

def get_data(ui,d_h,d_c):  '''【数据采集】ui:数据信息网页d_h:user-agent信息d_c:cookies信息结果:得到数据的list,每条数据用dict存储'''ri = requests.get(ui, headers= dic_heders, cookies = dic_cookies)soup_i = BeautifulSoup(ri.text,'lxml')ul = soup_i.find("ul",class_="list_item clrfix")lis = ul.find_all('li')lst = []for li in lis:dic = {}dic['景点名称'] = li.find('span',class_="cn_tit").textdic['攻略数量'] = li.find('div',class_="strategy_sum").textdic['评分'] = li.find('span',class_="total_star").span['style']dic['简介'] = li.find('div',class_="desbox").textdic['排名'] = li.find('span',class_="ranking_sum").textdic['经度'] = li['data-lng']dic['纬度'] = li['data-lat']dic['点评数量'] = li.find('div',class_="comment_sum").textdic['多少驴友来过'] = li.find('span',class_="comment_sum").span.textlst.append(dic)return lsturllst_1 = get_url(10)
u1 = urllst_1[0]
print(get_data(u1,dic_heders,dic_cookies))

输出的结果为:

对应这两个旅游景点的原页面如下:(可以看出最终获取的数据是和原网页的数据是匹配的)


接着就是进行全部数据的输出与存储,再此过程中,还要进行错误异常的处理

datalst = []
errorlst =[]
for u in get_url(20):try:datalst.extend(get_data(u,dic_heders,dic_cookies))print('数据采集成功,共采集数据{}条'.format(len(datalst)))except:errorlst.append(u)print('数据采集失败,网址为:',u)

输出的结果为:

数据清洗

数据清洗在spyder里面进行,避免爬虫代码的反复运行

df = pd.DataFrame(datalst)
df['经度'] = df['经度'].astype('float')
df['纬度'] = df['纬度'].astype('float')
df['点评数量'] = df['点评数量'].astype('int')
df['攻略数量'] = df['攻略数量'].astype('int')
df['评分'] = df['评分'].str.split(":").str[-1].str.replace("%","").astype("float")
df['多少驴友来过'] = df['多少驴友来过'].str.replace("%","").astype('float')/100
df['排名'] = df[df['排名']!=""]['排名'].str.split("第").str[-1].astype('int')df.to_excel('去哪儿网数据爬取.xlsx',index = False)

至此去哪儿网景点数据采集项目的全过程就已经解析完毕了,下面是全部的代码和输出结果

全部代码和输出结果

import requests
from bs4 import BeautifulSoup
import pandas as pddef get_url(n):'''【分页网址url采集】函数n:页数参数结果:得到一个分页网页的list'''lst = []for i in range(n):ui = "https://travel.qunar.com/p-cs299878-shanghai-jingdian-1-{}".format(i+1)lst.append(ui)return lstdef get_data(ui,d_h,d_c):  '''【数据采集】ui:数据信息网页d_h:user-agent信息d_c:cookies信息结果:得到数据的list,每条数据用dict存储'''ri = requests.get(ui, headers= dic_heders, cookies = dic_cookies)soup_i = BeautifulSoup(ri.text,'lxml')ul = soup_i.find("ul",class_="list_item clrfix")lis = ul.find_all('li')lst = []for li in lis:dic = {}dic['景点名称'] = li.find('span',class_="cn_tit").textdic['攻略数量'] = li.find('div',class_="strategy_sum").textdic['评分'] = li.find('span',class_="total_star").span['style']dic['简介'] = li.find('div',class_="desbox").textdic['排名'] = li.find('span',class_="ranking_sum").textdic['经度'] = li['data-lng']dic['纬度'] = li['data-lat']dic['点评数量'] = li.find('div',class_="comment_sum").textdic['多少驴友来过'] = li.find('span',class_="comment_sum").span.textlst.append(dic)return lstif __name__ == "__main__":dic_heders = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}dic_cookies = {}cookies = 'QN1=dXrgj14+tmYQhFxKE9ekAg==; QN205=organic; QN277=organic; QN269=506F28C14A7611EAA0BEFA163E244083; _i=RBTKSRDqFhTQT5KRlx-P1H78agxx; fid=7cc3c3d9-3f6c-45e1-8cef-3384cd5da577; Hm_lvt_c56a2b5278263aa647778d304009eafc=1581168271,1581220912; viewpoi=7564992|709275; viewdist=299878-7; uld=1-299878-8-1581221233|1-1062172-1-1581168529; QN267=1679639433d5aedfc8; Hm_lpvt_c56a2b5278263aa647778d304009eafc=1581221236; QN25=cb06bfbd-d687-4072-98c5-73266b637a6a-9f992f90; QN42=nvxp8441; _q=U.qunar_lbs_428305502; _t=26463150; csrfToken=oXYBnhSoGAGxggRkzmAjbxxGrpgsjUqQ; _s=s_ZBWFJO3EEGZISWS35EBIS5NQYA; _v=YTRjW_H5L47nGNVabvTLt1mlh7j8R7t4UNDVRrJUz0wScfLMWgSvkwQbzMLHlFbsvTU-2kJrBK74NUyOi3MX_3obY94Hhhugt8bv8ILxwsWDv4s_ANNiM8qRdg6HlBrrCEnGYr8lxS9uv78zDCNKz9pFbN8JPYy-AKJP6xILIsT7; _vi=4ONQzvfOOhwJECN5R-4rfWZDzlQ5-qv2xi_jsp1INPEpy9iKHa5gV0gHc35fDfTDe3TjcKteU7ZWk1vd6MsIqTfXYyUh3gTwZJ_9z3PEpkXZReeeIjaVE4HwLTkOATLIzIxg92s-QCWKE1RdNlaZsxPnfN7NHPGAZz5rsmxvpNDY; QN44=qunar_lbs_428305502; QN48=tc_a7fe4861b2d918df_17028369fc8_67ab; QN271=1749d44a-1a11-4886-be27-c3e3bfdadb0c'cookies_lst = cookies.split("; ")for i in cookies_lst:dic_cookies[i.split("=")[0]] = i.split("=")[1]    datalst = []errorlst =[]for u in get_url(20):try:datalst.extend(get_data(u,dic_heders,dic_cookies))print('数据采集成功,共采集数据{}条'.format(len(datalst)))except:errorlst.append(u)print('数据采集失败,网址为:',u)df = pd.DataFrame(datalst)df['经度'] = df['经度'].astype('float')df['纬度'] = df['纬度'].astype('float')df['点评数量'] = df['点评数量'].astype('int')df['攻略数量'] = df['攻略数量'].astype('int')df['评分'] = df['评分'].str.split(":").str[-1].str.replace("%","").astype("float")df['多少驴友来过'] = df['多少驴友来过'].str.replace("%","").astype('float')/100df['排名'] = df[df['排名']!=""]['排名'].str.split("第").str[-1].astype('int')df.to_excel('去哪儿网数据爬取.xlsx',index = False)

输出的结果为:

去哪儿网数据爬取.xlsx文件中的内容如下:(可以看出最后将数字数据全都转变成了数值型,而非文本型)

【python爬虫专项(10)】去哪儿网景点数据采集相关推荐

  1. Python爬虫抓取去哪儿网景点信息告诉你国庆哪儿最堵

    摘要 本文主要介绍了使用Python抓取去哪儿网站的景点信息并使用BeautifulSoup解析内容获取景点名称.票销售量.景点星级.热度等数据,然后使用xlrd.xlwt.xlutils等库来处理E ...

  2. python爬虫去哪儿网_用python爬虫爬取去哪儿4500个热门景点,看看国庆不能去哪儿...

    引用 那么问题来了,去哪儿玩呢?百度输了个"国庆",出来的第一条居然是"去哪里旅游人少"--emmmmmmm,因缺思厅. 于是我萌生了通过旅游网站的景点销量来判 ...

  3. 用python爬虫爬取去哪儿4500个热门景点,看看国庆不能去哪儿

    前言:本文建议有一定Python基础和前端(html,js)基础的盆友阅读. 金秋九月,丹桂飘香,在这秋高气爽,阳光灿烂的收获季节里,我们送走了一个个暑假余额耗尽哭着走向校园的孩籽们,又即将迎来一年一 ...

  4. 【pyecharts数据可视化】python爬取去哪儿网景点数据,做交互式数据可视化

    写在前面 在网易云课堂看到城市数据团大鹏老师讲的<Python数据可视化利器:Pyecharts!>[传送门],于是把前一篇南京的景点数据做一个可视化. 1.还是去哪儿网景点爬取 具体可以 ...

  5. python selenium爬取去哪儿网的酒店信息——详细步骤及代码实现

    目录 准备工作 一.webdriver部分 二.定位到新页面 三.提取酒店信息 ??这里要注意?? 四.输出结果 五.全部代码 准备工作 1.pip install selenium 2.配置浏览器驱 ...

  6. python爬虫图片实例-Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  7. python selenium 爬取去哪儿网的数据

    python selenium 爬取去哪儿网的数据 完整代码下载:https://github.com/tanjunchen/SpiderProject/tree/master/selenium+qu ...

  8. Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  9. 【python爬虫专项(31)】链家二手房源数据采集4(噪声数据处理)

    清洗数据来源 数据是来自于python爬虫专项(28)和(29)里面采集的分页信息和深度信息,如下 1) data_1表格下面获取的分页信息 2) data_2表格下面获取的深度信息 清洗逻辑:[函数 ...

最新文章

  1. 使用JFreeChart绘制散点图
  2. MySQL-proxy实现读写分离详细步骤
  3. SQL优化之列裁剪和投影消除
  4. 一段成功通过SAP云平台IDP SAML验证的响应字段分析
  5. 乔治敦大学计算机专业排名,2020USNEWS数据科学与分析专业综合排名(上)
  6. ​【文末有福利】揭秘阿里中台!一文看懂阿里推荐业务的两项利器
  7. ngnix 作用(通俗易懂)【转载】
  8. linux搭建web服务器原理,【LINUX】linux搭建web服务器
  9. [Android]利用run-as命令在不root情况下读取data下面的数据
  10. Java汽车租赁系统[源码+数据库]
  11. 基于51单片机的火焰报警器
  12. 《古月ROS探索总结》学习笔记2
  13. ElasticSearch快速入门(一)
  14. Python学习笔记:好玩的图形Python代码
  15. matlab中ind2vec函数,ELM报错错误使用 ind2vec和出错elmtrain T = ind2vec(T)
  16. R语言快速跳转代码,分割代码块语法
  17. 精美企业公司官网小程序源码 自带十几款模板 一键生成 全开源版
  18. java实现两人对战的五子棋游戏
  19. 迁移学习——Scatter Component Analysis
  20. Karaf教程之Config Admin服务的使用

热门文章

  1. DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
  2. 4月8日--Date的使用方法
  3. matlab在高等代数,Matlab数学软件包在向量代数-空间解析几何中的应用
  4. wps2016 对于doc文档 不识别<![CDATA[]]>bug
  5. 基于内容的电影推荐:物品画像
  6. SSM整合redis
  7. python 斗地主(1)
  8. USB转RS232不稳定
  9. gSoap编译生成onvif框架代码
  10. robomongo_备忘