旅游网-去哪儿网景点评论爬取
前言
最近由于学校的项目需要用到旅游相关的数据集,而与这方面相关的又必要少,于是就想到通过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.我的目的 爬取热歌榜中所有歌曲的所有评论,并存入mysql数据库 2.分析过程 1.首先可以看到每首歌曲都在tbody下的一个tr标签中 即提取热门歌曲中tbody下所有的tr标签就可以得到所有热 ...
- python爬取网易云音乐_Python 从零开始爬虫(七)——实战:网易云音乐评论爬取(附加密算法)...
前言 某宝评论区已经成功爬取了,jd的也是差不多的方法,说实话也没什么好玩的,我是看上它们分析简单,又没加密才拿来试手的.如果真的要看些有趣的评论的话,我会选择网易云音乐,里面汇聚了哲学家,小说家,s ...
- python处理json数据——网易云评论爬取
python处理json数据--网易云评论爬取 准备 代码 准备 1.python 3.7 2.需要安装的库: requests jsonpath pandas time fake_useragent ...
- php 爬取一个人的网易云评论,网易云音乐评论爬取
# coding=gbk import requests import json c='网易云爬虫实战一' print(c) music_url = 'https://music.163.com/#/ ...
- python爬虫爬当当网_爬虫实战一:爬取当当网所有 Python 书籍
本文转载自微信公众号[ 极客猴 ],作者知乎主页 此前错误标注来源导致侵权,在此表示歉意. 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实 ...
- python二手房价格预测_Python爬取赶集网北京二手房数据R对爬取的二手房房价做线性回归分析...
前言:本文主要分为两部分:Python爬取赶集网北京二手房数据&R对爬取的二手房房价做线性回归分析.文章思路清晰,代码详细,特别适合刚刚接触Python&R的同学学习参考. Part1 ...
- 大数据信息资料采集:公众号武志红文章评论爬取八爪鱼采集器规则
大数据信息资料采集:公众号武志红文章评论爬取八爪鱼采集器规则 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所 ...
- 大数据信息资料采集:文化公众号槽边往事历史文章搜集评论爬取
大数据信息资料采集:文化公众号槽边往事历史文章搜集评论爬取 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所有 ...
- 大数据信息资料采集:情感公号风茕子历史文章评论爬取八爪鱼采集
大数据信息资料采集:情感公号风茕子历史文章评论爬取八爪鱼采集 大数据信息资料采集 公众号历史文章采集 公众号评论爬取 微信公众号历史文章导出 抓取微信公众号所有文章. 公众号文章抓取工具 抓取公众号所 ...
最新文章
- MYSQL的初级使用
- 【软件工程】第一次结对编程_作业
- linux elf 文件查看工具 readelf
- mysql之 mysql 5.6不停机主主搭建(活跃双主基于日志点复制)
- 二叉树的建立和遍历的各种问题
- 最新Visual Studio 2010 下载及学习资料
- 「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)
- 使用MVCPager做AJAX分页所需要注意的地方
- docker遇到问题归纳
- linux系统基本使用教程,Linux系统的基本使用入门
- sort,uniq命令
- fopen()及相关函数使用
- web developer tips (47):脚本远程调试需关闭IE增强安全配置
- Git 基础 —— 配置与日志信息
- Biztalk中Host Instance线程控制
- 包装模式就是这么简单啦
- 教你破资深加密工具lockdir.exe加密后的文件
- js将阿拉伯数字转换成大写金额
- 与朋友分享的生活日记
- warning: control reaches end of non-void function [-Wreturn-type]