对携程酒店用户评价爬取

                                                                                                                                  对携程酒店用户评价爬取

(1)直接贴代码,后面逐步分析

            

!pip install beautifulsoup4
!pip install xlwt


import re
import urllib.request,urllib.error
import  xlwt
import sqlite3
from bs4 import BeautifulSoup

def main():
    BaseUrl="https://m.ctrip.com/webapp/hotel/hoteldetail/dianping/65822792.html?&fr=detail&atime=20210519&days=1"
    #1.爬取网页
    datalist=getDate(BaseUrl)
    savaPath="D:/XieCheng.xls"
   #2.保存数据
    SavaPath(datalist,savaPath)
    
#用户名
findTitle=re.compile(r'<span>(.*?)</span>')
#等级
findLevel=re.compile(r'<span class="user-level-base user-level-1>(.*?)</span>',re.S)
#入住时间
findTime=re.compile(r'<span class="checkin-line">(.*?)</span>')
#入住类型
findType=re.compile(r'<em class="item hotel-border">(.*?)</em>')
#入住房间
findHotel=re.compile(r' <span class="hotel-arr" data-ubt-key="c_hotel_comment_baseroom" style="color:#4289ff;">(.*?)</span>')
#评价
findAssess=re.compile(r'<p class="tree-ellips-line6 comment-swarp">(.*?)</p>',re.S)
#回复
findResponse=re.compile(r' <li style="display:none;">(.*?)</li>',re.S)
  #获取网页  
def  getDate(BaseUrl):
    datalist=[]
    html=AskURL(BaseUrl)
    soup=BeautifulSoup(html,"html.parser")
    #逐一解析
    for item in soup.find_all('div',class_="dn hotel-t-b-border"):
        
        data=[]#此列表用于保存一条评价的全部信息
        item=str(item)
        Title=re.findall(findTitle,item)
        data.append(Title)
        Level=re.findall(findLevel,item)
        data.append(Level)
        Time=re.findall(findTime,item)
        data.append(Time)
        Type=re.findall(findType,item)
        data.append(Type)
        Hotel=re.findall(findHotel,item)
        data.append(Hotel)
        Assess=re.findall(findAssess,item)
        data.append(Assess)
        Responseaa=re.findall(findResponse,item)
        data.append(Responseaa)
        datalist.append(data)   
    return datalist
    
 #获得一个指定的url网页内容
def  AskURL(url):
              #模拟浏览器头部,像豆瓣发送请求
     head={"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Mobile Safari/537.36 Edg/90.0.818.62"}
     #用户代理,告诉服务器,我们是什么类型的机器,浏览器(本质是让它返回可以接受的文件内容)
     request=urllib.request.Request(url,headers=head)
     html=""
     try:
        response=urllib.request.urlopen(request)
        html=response.read().decode("utf-8")
      #  print(html)
     except urllib.error.URLError  as e:
            if hasattr(e,"code"):
                print(e.code)
            if hasattr(e,"reason"):
                print(e.reason)
                
     return html
        
        
  #3.保存数据
def  SavaPath(datalist,savaPath):
        print("save....")
        book=xlwt.Workbook(encoding="utf-8",style_compression=0)#创建Workbook对象
        sheet=book.add_sheet('携程酒店评价',cell_overwrite_ok=True)#创建工作表
        col=("用户名","等级","入住时间","入住类型","入住房间","评价","回复")
        for i in range(0,7):
             sheet.write(0,i,col[i])
        for i in range(0,len(datalist)):
             print("第%d条"%(i+1))
             data=datalist[i]
             for j in range(0,7):
                 sheet.write(i+1,j,data[j])
            
        book.save(savaPath)
        
#main()       
        
if __name__ == '__main__':#当程序执行时,调用函数
    main()

 

(2)如果直接爬取携程官网是没有评价的,评价是后来载入的

点开这个网页,就是我想要的评价了。

 

(3)代码分析

#获得一个指定的url网页内容
def  AskURL(url):
              #模拟浏览器头部,像豆瓣发送请求
     head={"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Mobile Safari/537.36 Edg/90.0.818.62"}
     #用户代理,告诉服务器,我们是什么类型的机器,浏览器(本质是让它返回可以接受的文件内容)
     request=urllib.request.Request(url,headers=head)
     html=""
     try:
        response=urllib.request.urlopen(request)
        html=response.read().decode("utf-8")
      #  print(html)
     except urllib.error.URLError  as e:
            if hasattr(e,"code"):
                print(e.code)
            if hasattr(e,"reason"):
                print(e.reason)
                
     return html

 

这是获得网页,会获取到网页,这时候就要用正则表达式了

#用户名
findTitle=re.compile(r'<span>(.*?)</span>')
#等级
findLevel=re.compile(r'<span class="user-level-base user-level-1>(.*?)</span>',re.S)
#入住时间
findTime=re.compile(r'<span class="checkin-line">(.*?)</span>')
#入住类型
findType=re.compile(r'<em class="item hotel-border">(.*?)</em>')
#入住房间
findHotel=re.compile(r' <span class="hotel-arr" data-ubt-key="c_hotel_comment_baseroom" style="color:#4289ff;">(.*?)</span>')
#评价
findAssess=re.compile(r'<p class="tree-ellips-line6 comment-swarp">(.*?)</p>',re.S)
#回复
findResponse=re.compile(r' <li style="display:none;">(.*?)</li>',re.S)

 

获取到的网页我是保存在excel表格里面的。

保存的excel
标题

 

(4)由于携程是动态载入,所以一次只能爬取10条。关于动态爬取我放在下一篇。
        

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值