前言

 最近由于学校的项目需要用到旅游相关的数据集,而与这方面相关的又必要少,于是就想到通过python爬虫自己去爬取。
 由于我也是初次接触爬虫,很多知识点还不会,方式可能有点粗暴,但终归还是爬取了,可能就是慢了点,和自己要时刻手操下(づ ̄ 3 ̄)づ
长话短说,现在开始吧<( ̄︶ ̄)↗[GO!]

正文

第一步
首先要获取城市的id,这个需要从(http://travel.qunar.com/place/)获取

这个页面可以就直接右键查看代码,然而根据相应信息进行提取,这里我保存为city.csv文件,代码如下:

from bs4 import BeautifulSoup
import pandas as pd
import requestsdef get_static_url_content(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}req=requests.get(url,headers=headers)content=req.textbsObj=BeautifulSoup(content,'lxml')return bsObjdef get_city_id():url = 'http://travel.qunar.com/place/'bsObj=get_static_url_content(url)cat_url = []cat_name = []bs=bsObj.find_all('div',attrs={'class':'sub_list'})for i in range(0,len(bs)):xxx = bs[i].find_all('a')for j in range(0,len(xxx)):cat_name.append(xxx[j].text)cat_url.append(xxx[j].attrs['href'])return cat_name,cat_urlcity_name_list,city_url_list=get_city_id()
city=pd.DataFrame({'city_name':city_name_list,'city_code':city_url_list})
city.to_csv('city.csv',encoding='utf_8_sig')

运行完,你将得到csv文件,打开得到

到这里已经获取某个城市id,将为第二步做准备

第二步
爬取具体某个城市景点id,这里以杭州举例http://travel.qunar.com/p-cs300195-hangzhou

爬取http://travel.qunar.com/p-cs300195-hangzhou-jingdian中的景点id,代码如下:

from bs4 import BeautifulSoup
import pandas as pd
import requestsdef get_static_url_content(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}req=requests.get(url,headers=headers)content=req.textbsObj=BeautifulSoup(content,'lxml')return bsObjdef get_jd_url(url):#该城市最大景点数maxnum = get_static_url_content(url+'-jingdian').find('p',{'class':'nav_result'}).find('span').text#提取数字maxnum=int(''.join([x for x in maxnum if x.isdigit()]))url=url+'-jingdian-1-'cat_url = []cat_name = []# 这里取top100景点 每页10条 page从1开始page=11# 判断是否超过范围if (page-1)*10>maxnum :page=int(((maxnum+10)/10)+1)for i in range(1,page):url1=url+str(i)bsObj=get_static_url_content(url1)bs=bsObj.find_all('a',attrs={'data-beacon':'poi','target':'_blank'})for j in range(0, len(bs)):if(bs[j].text!=''):cat_name.append(bs[j].text)cat_url.append(bs[j].attrs['href'])print(cat_name,cat_url)print(len(cat_name))print(len(cat_url))return cat_name, cat_url#杭州举例
url='http://travel.qunar.com/p-cs300195-hangzhou'
city_name_list,city_url_list=get_jd_url(url)
city=pd.DataFrame({'city_name':city_name_list,'city_code':city_url_list})
city.to_csv('hangzhou-jd-top100.csv',encoding='utf_8_sig')

结果是

第三步
这里将以西湖http://travel.qunar.com/p-oi708952-xihu为例,爬取评论数据
注意,这里的评论都是动态加载的(注意到不管点第几页浏览器的地址栏都是不变的),我们随意点一页看一下,比如第二页:

所以通过chrome F12检测数据传输,发现每次点击下一页,都会发生回复json请求,在Network-XHR出现新的请求,双击打开可以发现我们要的数据
例如http://travel.qunar.com/place/api/html/comments/poi/708952?poiList=true&sortField=1&rank=0&pageSize=10&page=2

我们能很容易从这里找到规律,poi后的数字就是景点id,pageSize就是一次请求回复多少评论,通过查看文件,可以知道最大设为50,page为页数,当超过页数时,则没有信息,代码如下:

from bs4 import BeautifulSoup
import pandas as pd
import json
import requests
import timedef get_static_url_content(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}req = requests.get(url, headers=headers)content = req.textbsObj = BeautifulSoup(content, 'lxml')return bsObjdef get_jd_comment(url):# 该景点最大评论数maxnum = get_static_url_content(url).find('span', {'class': 'e_nav_comet_num'}).textmaxnum = int(maxnum)poi = ''.join([x for x in url if x.isdigit()])cat_user_id = []cat_user_name= []cat_jd_poi = []cat_score = []cat_user_comment = []cat_comment_time = []url = 'http://travel.qunar.com/place/api/html/comments/poi/' + poi + '?poiList=true&sortField=1&rank=0&pageSize=50&page='#这里页数暂时设为101,取的pageSize=50,即爬取100*50条评论page = 101if (page - 1) * 50 > maxnum:page = int(((maxnum + 50) / 50)+1)for i in range(1, page):url1 = url + str(i)json_str = requests.get(url1, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}).textjson_data=json.loads(json_str)['data']#print(json_data)bsObj = BeautifulSoup(json_data, 'lxml')bs=bsObj.find_all('li',{'class':'e_comment_item clrfix'})for j in range(0,len(bs)):try:user=bs[j].find('div', {'class': 'e_comment_usr_name'}).find('a')cat_user_id.append(''.join([x for x in user.attrs['href'] if x.isdigit()]))cat_user_name.append(user.text)cat_jd_poi.append(poi)score=''.join([x for x in str(bs[j].find('span',{'class':'total_star'}).find('span')) if x.isdigit()])cat_score.append(score)a=bs[j].find('div',{'class':'e_comment_content'}).find_all('p')cat_user_comment.append(''.join(x.text for x in a))cat_comment_time.append(bs[j].find('div',{'class':'e_comment_add_info'}).find('li').text)except:print('i=',i,'j=',j,'有问题')print('已完成poi=',poi,' ',i,'/',page-1)time.sleep(0.2)return cat_user_id,cat_user_name,cat_jd_poi,cat_score,cat_comment_time,cat_user_comment# 西湖举例
url = 'http://travel.qunar.com/p-oi708952-xihu'
cat_user_id,cat_user_name,cat_jd_poi,cat_score,cat_comment_time,cat_user_comment=get_jd_comment(url)
city=pd.DataFrame({'user_id':cat_user_id,'user_name':cat_user_name,'jd_poi':cat_jd_poi,'score':cat_score,'time':cat_comment_time,'comment':cat_user_comment})
city.to_csv('xihu-jd-comment.csv',encoding='utf_8_sig')

爬取结果为:

 第三步爬取时,有时会因为ip大量访问而被暂时禁止,需要登陆该正在被爬取景点地址,输入验证码才解禁,如果通过动态代理,可能可以避免此现象。

旅游网-去哪儿网景点评论爬取相关推荐

  1. 爬虫:网易云热门歌曲所有评论爬取(详细)

    1.我的目的 爬取热歌榜中所有歌曲的所有评论,并存入mysql数据库 2.分析过程 1.首先可以看到每首歌曲都在tbody下的一个tr标签中 即提取热门歌曲中tbody下所有的tr标签就可以得到所有热 ...

  2. python爬取网易云音乐_Python 从零开始爬虫(七)——实战:网易云音乐评论爬取(附加密算法)...

    前言 某宝评论区已经成功爬取了,jd的也是差不多的方法,说实话也没什么好玩的,我是看上它们分析简单,又没加密才拿来试手的.如果真的要看些有趣的评论的话,我会选择网易云音乐,里面汇聚了哲学家,小说家,s ...

  3. python处理json数据——网易云评论爬取

    python处理json数据--网易云评论爬取 准备 代码 准备 1.python 3.7 2.需要安装的库: requests jsonpath pandas time fake_useragent ...

  4. php 爬取一个人的网易云评论,网易云音乐评论爬取

    # coding=gbk import requests import json c='网易云爬虫实战一' print(c) music_url = 'https://music.163.com/#/ ...

  5. python爬虫爬当当网_爬虫实战一:爬取当当网所有 Python 书籍

    本文转载自微信公众号[ 极客猴 ],作者知乎主页 此前错误标注来源导致侵权,在此表示歉意. 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实 ...

  6. python二手房价格预测_Python爬取赶集网北京二手房数据R对爬取的二手房房价做线性回归分析...

    前言:本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的二手房房价做线性回归分析.文章思路清晰,代码详细,特别适合刚刚接触Python&R的同学学习参考. Part1 ...

  7. 大数据信息资料采集:公众号武志红文章评论爬取八爪鱼采集器规则

    大数据信息资料采集:公众号武志红文章评论爬取八爪鱼采集器规则 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所 ...

  8. 大数据信息资料采集:文化公众号槽边往事历史文章搜集评论爬取

    大数据信息资料采集:文化公众号槽边往事历史文章搜集评论爬取 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所有 ...

  9. 大数据信息资料采集:情感公号风茕子历史文章评论爬取八爪鱼采集

    大数据信息资料采集:情感公号风茕子历史文章评论爬取八爪鱼采集 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所 ...

最新文章

  1. MYSQL的初级使用
  2. 【软件工程】第一次结对编程_作业
  3. linux elf 文件查看工具 readelf
  4. mysql之 mysql 5.6不停机主主搭建(活跃双主基于日志点复制)
  5. 二叉树的建立和遍历的各种问题
  6. 最新Visual Studio 2010 下载及学习资料
  7. 「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)
  8. 使用MVCPager做AJAX分页所需要注意的地方
  9. docker遇到问题归纳
  10. linux系统基本使用教程,Linux系统的基本使用入门
  11. sort,uniq命令
  12. fopen()及相关函数使用
  13. web developer tips (47):脚本远程调试需关闭IE增强安全配置
  14. Git 基础 —— 配置与日志信息
  15. Biztalk中Host Instance线程控制
  16. 包装模式就是这么简单啦
  17. 教你破资深加密工具lockdir.exe加密后的文件
  18. js将阿拉伯数字转换成大写金额
  19. 与朋友分享的生活日记
  20. warning: control reaches end of non-void function [-Wreturn-type]

热门文章

  1. 根据心电信号计算心率的matlab代码
  2. Latex常用公式写法(一)
  3. [1304]求圆的周长和面积(Java)
  4. tensorflow学习:定义变量
  5. element-ui 上传图片,图片404
  6. 开关电源的EMC干扰不知道是怎么产生的?(开关电源EMC探析)
  7. Windows 上6款卸载软件值得推荐
  8. IGMP基础原理与实验
  9. office卸载重新安装,并安装mathtype7数学编辑公式
  10. 卸载完mathtype后,word加载项中还是有mathtype的解决方法