高性能爬取携程网景区评论数据
昨天花了一天时间写的,改来改去,不断提升性能,终于可以把代码放出来了,如果发现服务域名无效,只需要更改Origin为http形式就行。
import csvimport requests
from bs4 import BeautifulSoup as bs
from multiprocessing import Pool
import gevent,timeclass Comment(object):#请求头headers = {"Cookie":"_abtest_userid=dc18ac38-f25f-488b-8535-e709964f2257; gad_city=a4f35f7b1b0a14c597bf3a50fb024f55; MKT_Pagesource=PC; _ga=GA1.2.7662667.1551412569; _gid=GA1.2.815726266.1551412569; _RSG=Wd46GhfGxU6uCJw.ghACmB; _RDG=2808fbf74f24dd23c52c70ca0da70efd1f; _RGUID=67bb429a-d018-49e0-bc0c-2ababee93338; appFloatCnt=25; manualclose=1; TicketSiteID=SiteID=1006; StartCity_Pkg=PkgStartCity=1; Session=smartlinkcode=U130026&smartlinklanguage=zh&SmartLinkKeyWord=&SmartLinkQuary=&SmartLinkHost=; Union=AllianceID=4897&SID=130026&OUID=&Expires=1552049736787; ASP.NET_SessionSvc=MTAuOC4xODkuNjJ8OTA5MHxqaW5xaWFvfGRlZmF1bHR8MTU1MDU2ODM3MDEyOQ; _gat=1; Mkt_UnionRecord=%5B%7B%22aid%22%3A%224897%22%2C%22timestamp%22%3A1551490732614%7D%5D; _RF1=125.88.24.39; _jzqco=%7C%7C%7C%7C%7C1.89900671.1551412570377.1551490727886.1551490732641.1551490727886.1551490732641.0.0.0.187.187; __zpspc=9.12.1551487431.1551490732.14%232%7Cwww.baidu.com%7C%7C%7C%7C%23; _bfi=p1%3D290510%26p2%3D290510%26v1%3D228%26v2%3D226; _bfa=1.1551412564624.2kwvv2.1.1551451759831.1551487429617.7.229; _bfs=1.25","Host": "you.ctrip.com","Origin": "https://you.ctrip.com","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}def __init__(self,url):self.url =urldef request(self,poiID,districtEName,Filename):data = {"poiID": poiID,"districtEName": districtEName,"districtId": 152,"pagenow": 1,"order": 3.0,"star": 0.0,"tourist": 0.0,"resourceId": 6766,"resourcetype": 2}response = requests.post(url=self.url,headers=Comment.headers,data=data)print(response.status_code)if response.status_code == 404:print(Filename+"Nodone!")returnsoup = bs(response.text,"lxml")self.WriteScore(soup,Filename)pagenum = self.getPageNum(soup)pagenum = int(pagenum.get_text())print(Filename+"正在采集...")try:gevent.joinall([gevent.spawn(self.writeCommentInformation,j,poiID, districtEName,Filename) for j in range(pagenum)])except Exception as e:print(e)print("error--------")#获取数据def getCommentInformation(self,page,poiID,districtEName):#请求数据包data = {"poiID": poiID, #景区id"districtEName": districtEName, #区域名字"districtId": 152,"pagenow": page,"order": 3.0,"star": 0.0,"tourist": 0.0,"resourceId": 6766,"resourcetype": 2}response = requests.post(url=self.url,headers=Comment.headers,data=data)soup = bs(response.text, "lxml")#返回作者,日期,评论return [author.get_text() for author in soup.find_all(name="a",attrs={"itemprop":"author"})],\[ date.get_text() for date in soup.find_all(name="em", attrs={"itemprop": "datePublished"})],\[ comment.get_text() for comment in soup.find_all(name="span", attrs={"class": "heightbox"})]# 获取综合,景色 趣味 性价比分数def getSocre(self,soup):return [score.get_text() for score in soup.find_all(name="span",attrs={"class":"score"})]#写入数据def writeCommentInformation(self,i, poiID, districtEName,FileName):author,date,comment=self.getCommentInformation(i, poiID, districtEName)print(FileName+str(i)+"页采集完毕--"+str(len(author)))if len(author)==0:returnwith open("/Volumes/Tigo/Data/"+FileName+".csv","a+",encoding="utf-8") as f:w = csv.writer(f)w.writerows(list(zip(author,date,comment)))def getPageNum(self,soup):return soup.find(name="b",attrs={"class":"numpage"})#写入景区评分def WriteScore(self,soup,Filename):filewriteScore = open("/Volumes/Tigo/Data/" + Filename+"评分" + ".csv", "a+", encoding="utf-8")writeFile = csv.writer(filewriteScore)l = []l.append(Filename)l.extend(self.getSocre(soup))writeFile.writerow(l)filewriteScore.close()if __name__=="__main__":url = "http://you.ctrip.com/destinationsite/TTDSecond/SharedView/AsynCommentView" #数据请求地址---固定不变的,只需要改变请求数据包就行c = Comment(url)pool = Pool(5)with open("/Volumes/Tigo/RequestsData.csv","r") as f: #从文件中读取景区id和区域名r = csv.reader(f)for i in r:pool.apply_async(func=c.request,args=(i[2],i[4],i[0],))pool.close()pool.join()
数据集在这里:
https://github.com/LianZS/SpyderPro/blob/master/RequestsData.xlsx
高性能爬取携程网景区评论数据相关推荐
- python爬取抖音用户评论_python实现模拟器爬取抖音评论数据的示例代码
目标: 由于之前和朋友聊到抖音评论的爬虫,demo做出来之后一直没整理,最近时间充裕后,在这里做个笔记. 提示:大体思路 通过fiddle + app模拟器进行抖音抓包,使用python进行数据整理 ...
- python爬淘宝app数据_一篇文章教会你用Python爬取淘宝评论数据(写在记事本)
[一.项目简介] 本文主要目标是采集淘宝的评价,找出客户所需要的功能.统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等. [二.项目准备工作] 准备Pycharm,下载安装等,可以参考这篇文章 ...
- Python爬取京东商品评论数据
一.前言 本文将承接笔者的上篇文章Python爬取京东商品数据,使用京东商品唯一id字段"sku"拼接url,得到真实的京东商品评论网址,进而解释数据并保存到文件中,所爬取到的数据 ...
- python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- python动态页面元素爬取_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...
由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...
由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...
- (2020)使用Airtest来爬取某宝评论数据
本帖子背景:本帖子,是一个学习的过程.一个爬取某宝评论的小单子,促使我前来学习简单的.不用掉头发的.不用爆肝的(再说,我也没那能力去硬干它啊)教程 昨天晚上,大学四年的舍友微信问我"说还搞爬 ...
- Python爬取豆瓣电影评论数据(通用模板代码)----以《中国医生》为例
中国医生豆瓣电影评论获取 1 前言 2 数据源分析 3数据爬取(代码实现) 4 结果展示 1 前言 豆瓣是影迷评分.非视频网站,也非购票平台,能长期专门使用豆瓣标记.评价电影的,相对来说是属于影迷 ...
- 如何写一个python程序浏览淘宝_一篇文章教会你用Python爬取淘宝评论数据(写在记事本)...
[一.项目简介] 本文主要目标是采集淘宝的评价,找出客户所需要的功能.统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等. [二.项目准备工作] 1. 准备Pycharm,下载安装等,可以参考这 ...
最新文章
- Define in the var of function
- 自己动手制作笔记本SP2系统安装光盘
- vim循环下表复制_Vim求生手册,让你离“Vim党”更近一步!
- icp点云匹配迭代最近邻算法
- ES5、ES6、ES7、ES8
- 编辑器js获取浏览器高度和宽度值(转)
- 《MySQL——主备一致性六问六答》
- 编程不仅是写代码!?
- Uva 10305 - Ordering Tasks
- pythonrequests库使用方法_python三方库之requests-快速上手
- java中逗号分隔的字符串和List相互转换
- 简述与oracle相关的程序组,oracle数据库复习程序.doc
- 将阿拉伯数字转换为语文汉字数字
- 数据库原理 | 第2章 关系运算习题
- P3369 普通平衡树模板 treap
- python实现1分钟内股价波动邮件提示
- 酒精传感器与单片机的衔接
- JAVA练习题库/JAVA面试题库
- logback出现大量XXX_IS_UNDEFINED日志文件的问题
- 高德地图手机端定位偏移问题