Python爬虫实战:爬取【某旅游交通出行类网站中国内热门景点】的评论数据,使用Re、BeautifulSoup与Xpath三种方式解析数据,代码完整

一、分析爬取网页:

1、网址

https://travel.qunar.com/

2、 打开网站,找到要爬取的网页

https://travel.qunar.com/p-cs299979-chongqing

在这里插入图片描述

进来之后,找到评论界面,如下所示:在这里我选择驴友点评数据爬取

在这里插入图片描述

点击【驴友点评】,进入最终爬取的网址:https://travel.qunar.com/p-cs299979-chongqing-gaikuang-2-1-1#lydp

在这里插入图片描述

3、 进入开发者模型(F12),分析网页,找到数据接口

(1)点击网络
在这里插入图片描述
(2)点击左边网页中的第二、第三、第四…页,观察右边的变化:发现右边有一地址带有页数和每页数据量,因此点击该地址在网页中打开发现带有json格式的数据并且数据对应就是该页的内容,如下所示:

接口地址:https://travel.qunar.com/place/api/html/comments/dist/299979?sortField=1&pageSize=10&page=1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

并且只要变换接口地址后面的page就可以获取不同页数的数据。同理,我们发现【热门攻略】也是如此,因此将其顺带也爬取出来,数据接口地址:https://travel.qunar.com/place/api/html/books/dist/299979?sortField=0&pageSize=10&page=2

在这里插入图片描述

三、请求网页数据并将数据进行保存

当我们确定了真实数据的URL后,这里便可以用requests的get或post方法进行请求网页数据。关于requests库的更多使用方式,大家可以前往(https://requests.readthedocs.io/zh_CN/latest/ 或 https://www.cnblogs.com/aaronthon/p/9332757.html)查看。

1、分析爬取的json数据,为提取数据做准备,如下图所示:json数据里提取的data数据是我们所需要的数据,而data数据就是html形式的字符串,打开网页与其对比,发现最后需要获取的数据在li标签里面,因此我们选择对其进行提取:采用正则与Beautiful Soup、xpath来解析数据

在这里插入图片描述
在这里插入图片描述

2、正则re提取数据,完整代码如下:

# coding:utf-8
import requests,time,os,openpyxl,re
from openpyxl import Workbook
import mysql.connector

class RenrenLogin(object):
    def __init__(self):
        # 设置存储数据文件路径
        self.excellj = ''
        self.excellj1 = r"C:\XXXXXXXXXXXX\qne1.xlsx"
        self.excellj2 = r"C:\XXXXXXXXXXXX\qne2.xlsx"

    def get_html(self, url,names):
        # 因此f12查看时,数据为json格式
        data1 = requests.get(url=url).json()
        self.parse_html(data1,names)

    def parse_html(self, data,names):
        L1,L2,L3,L4,L5,L6,L7,L8 = [],[],[],[],[],[],[],[]
        if(names == "热门攻略"):
            userurl = re.findall(r'<a rel="nofollow" class="face" target="_blank" href="(.*?)".*?</a>', data["data"],re.S)                     # 用户url地址
            userpicture = re.findall(r'<img class="imgf" width="50" height="50" src="(.*?)"', data["data"], re.S)                              # 用户头像
            usertitle = re.findall(r'<img class="imgf".*?title="(.*?)"', data["data"], re.S)                                                   # 用户昵称
            L1 = re.findall(r'<h3 class="tit"><a data-beacon="travelbook" target="_blank" href=".*?">(.*?)</h3>',data["data"], re.S)           # 用户发表标题
            for i in L1:
                L2.append(''.join(re.findall('[\u4e00-\u9fa5]', i)))
            usersubject = L2

            userinfourl =  re.findall(r'<a data-beacon="travelbook" target="_blank" href="(.*?)"', data["data"], re.S)                         # 用户详情
            L3 =  re.findall(r'<p class="places">(.*?)<span class="colOrange">(.*?)</span></p><p class="places">',data["data"], re.S)          # 用户途径
            for i in L3:
                L4.append(i[1])
            useraddress = L4
            L5 = re.findall(r'<p class="places">途经:(.*?)</p><ul class="pics">', data["data"], re.S)                                          # 用户行程
            for i in L5:
                L6.append(''.join(re.findall('[\u4e00-\u9fa5: ]',i)))
            userstroke = L6
            L7 = re.findall(r'<ul class="pics">(.*?)</li></ul>', data["data"], re.S)                                                           # 用户发表图片
            for i in L7:
                L8.append(re.findall(r'src="(.*?)"', i, re.S))
            userimages = L8
            userdz = re.findall(r'<i class="iconfont">&#xe09d;</i><span>(.*?)</span>', data["data"], re.S)                                     # 用户点赞数量
            userpl = re.findall(r'<i class="iconfont">&#xf04f;</i><span>(.*?)</span>', data["data"], re.S)                                     # 用户评论数量
            for i in range(len(usertitle)):
                alldata = []
                alldata.append(usertitle[i])
                alldata.append(usersubject[i])
                alldata.append(useraddress[i])
                alldata.append(userstroke[i])
                alldata.append(userdz[i])
                alldata.append(userpl[i])
                alldata.append(userpicture[i])
                alldata.append(userurl[i])
                alldata.append(userinfourl[i])
                alldata.append(str(userimages[i]))
                self.parse_excel(alldata,names)
        else:
            usertitle = re.findall(r'<div class="e_comment_usr_name"><a rel="nofollow" href=".*?" target="_blank">(.*?)</a></div>',data["data"], re.S)
            userurl = re.findall(r'<div class="e_comment_usr_name"><a rel="nofollow" href="(.*?)" target="_blank">.*?</a></div>',data["data"], re.S)
            usercomtit = re.findall(r'<a data-beacon="comment_title" href=".*?" target="_blank">(.*?)</a><span class="icon_gold_camel">',data["data"], re.S)
            L1 = re.findall(r'<div class="e_comment_content">(.*?)阅读全部</a></div>', data["data"], re.S)
            for i in L1:
                L2.append(''.join(re.findall('[\u4e00-\u9fa5 ]',i)))
            usercomment = L2
            L3 = re.findall(r'<ul class="base_fl" ><li><a rel="nofollow" data-beacon="comment_pic" href=".*?" target="_blank">.*?张》',data["data"], re.S)
            for i in L3:
                L4.append(re.findall(r'src="(.*?)"', i, re.S))
            if(len(L4) < 10 ):
                for i in range(10-len(L4)):
                    L4.append('空')
                userimages = L4
            else:
                userimages = L4
            userpicture = re.findall(r'<div class="e_comment_usr_pic"><a rel="nofollow" href=".*?" target="_blank"><img .*? src="(.*?)" /></a></div>',data["data"], re.S)
            for i in range(len(usertitle)):
                alldata = []
                alldata.append(usertitle[i])
                alldata.append(usercomtit[i])
                alldata.append(usercomment[i])
                alldata.append(userurl[i])
                alldata.append(str(userimages[i]))
                alldata.append(userpicture[i])
                self.parse_excel(alldata, names)
        return True

    def parse_excel(self, alldata,names):
        if(names == "热门攻略"):
            self.excellj = self.excellj1
            filetitle = ["用户昵称","用户发表主题","用户途径","用户路径","用户点赞数","用户评论数","用户头像","用户主页地址","用户详情地址","用户发布图片"]
        else:
            self.excellj = self.excellj2
            filetitle = ["用户昵称","用户发表主题","用户评论","用户主页地址","用户发布图片","用户头像"]
        if not os.path.exists(self.excellj):
            workbook = Workbook()
            workbook.save(self.excellj)
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(filetitle)
            wa.append(alldata)
            wb.save(self.excellj)
        else:
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(alldata)
            wb.save(self.excellj)
        return True

    def main(self, ):
        UrlList = ["https://travel.qunar.com/place/api/html/books/dist/299979?sortField=0&pageSize=10&page=","https://travel.qunar.com/place/api/html/comments/dist/299979?sortField=1&pageSize=10&page="]
        names = ["热门攻略","驴友点评"]
        for i in range(len(UrlList)):
            for j in range(1,3):
                url = UrlList[i] + str(j)
                self.get_html(url,names[i])
                print(f"重庆地区【{names[i]}】第{j}页数据爬取结束!!!")
                time.sleep(10)

if __name__ == '__main__':
    spider = RenrenLogin()
    spider.main()

结果如下所示:
【热门攻略】:
在这里插入图片描述
【驴友点评】:
在这里插入图片描述

3、BeautifulSoup提取数据,完整代码如下:这里只爬取了驴友点评,热门攻略也是一样方法

# coding:utf-8
import requests,time,os,openpyxl,re
from openpyxl import Workbook
from bs4 import BeautifulSoup

class RenrenLogin(object):
    def __init__(self):
        self.excellj = r"C:\XXXXXXXXXXXX\qne1.xlsx"

    def get_html(self, url):
        data1 = requests.get(url=url).json()
        self.parse_html(data1)

    def parse_html(self, data):
        soup = BeautifulSoup(data["data"], 'lxml')
        L1,L2,L3,L4,L5,L6,L7,L8 = [],[],[],[],[],[],[],[]
        sellList1 = soup.find_all('div',class_="e_comment_usr_name")
        for i in sellList1:
            soup1 = BeautifulSoup(str(i), 'lxml')
            div_tag = soup1.find('div')
            a_tags = div_tag.find('a')
            userhref = a_tags.get('href')
            L1.append(userhref)
            L2.append(a_tags.text)
        usertitle = L2
        userurl = L1
        sellList2 = soup.find_all('div',class_="e_comment_title")
        for i in sellList2:
            soup1 = BeautifulSoup(str(i), 'lxml')
            div_tag = soup1.find('div')
            a_tags = div_tag.find('a')
            L3.append(a_tags.text)
        usercomtit = L3
        sellList3 = soup.find_all('div',class_="e_comment_content")
        for i in sellList3:
            str1 = ''
            soup1 = BeautifulSoup(str(i), 'lxml')
            div_tag = soup1.find('div')
            a_tags = div_tag.find_all('p')
            for tag in a_tags:
                str1 = str1 + tag.text +' '
            L4.append(str1)
        usercomment = L4
        sellList4 = soup.find_all('div', class_="e_comment_imgs clrfix")
        L1 = []
        for i in sellList4:
            str1 = ''
            soup1 = BeautifulSoup(str(i), 'lxml')
            div_tag = soup1.find('div')
            a_tags = div_tag.find_all('img')
            for j in a_tags:
                str1 = str1 + j.get("src") + ' , '
            L5.append(str1)
        if (len(L5) < 10):
            for i in range(10 - len(L4)):
                L5.append('空')
            userimages = L5
        else:
            userimages = L5
        sellList5 = soup.find_all('div',class_="e_comment_usr_pic")
        for i in sellList5:
            soup1 = BeautifulSoup(str(i), 'lxml')
            div_tag = soup1.find('div')
            a_tags = div_tag.find('a')
            userhref = a_tags.get('href')
            L6.append(userhref)
        userpicture = L6
        for i in range(len(usertitle)):
            alldata = []
            alldata.append(usertitle[i])
            alldata.append(usercomtit[i])
            alldata.append(usercomment[i])
            alldata.append(userurl[i])
            alldata.append(str(userimages[i]))
            alldata.append(userpicture[i])
            self.parse_excel(alldata)
        return True

    def parse_excel(self, alldata):
        filetitle = ["用户昵称","用户发表主题","用户评论","用户主页地址","用户发布图片","用户头像"]
        if not os.path.exists(self.excellj):
            workbook = Workbook()
            workbook.save(self.excellj)
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(filetitle)
            wa.append(alldata)
            wb.save(self.excellj)
        else:
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(alldata)
            wb.save(self.excellj)
        return True

    def main(self, ):
        UrlList = ["https://travel.qunar.com/place/api/html/comments/dist/299979?sortField=1&pageSize=10&page="]
        names = ["驴友点评"]
        for i in range(len(UrlList)):
            for j in range(1,3):
                url = UrlList[i] + str(j)
                self.get_html(url)
                print(f"重庆地区【{names[i]}】第{j}页数据爬取结束!!!")
                time.sleep(10)

if __name__ == '__main__':
    spider = RenrenLogin()
    spider.main()

【驴友点评】:
在这里插入图片描述

4、Xpath提取数据,完整代码如下:这里只爬取了热门攻略,驴友点评也是一样方法

# coding:utf-8
import requests,time,os,openpyxl,re
from openpyxl import Workbook
from lxml import etree

class RenrenLogin(object):
    def __init__(self):
        self.excellj = r"C:\XXXXXXXXXX\qne1.xlsx"

    def get_html(self, url):
        data1 = requests.get(url=url).json()
        self.parse_html(data1)

    def parse_html(self, data):
        L1,L2,L3,L4,L6 = [],[],[],[],[]
        html = etree.HTML(data["data"])
        usertitle = html.xpath('//span[@class="user_name"]/a/text()')
        userurl = html.xpath('//span[@class="user_name"]/a/@href')
        userpicture = html.xpath('//img[@class="imgf"]/@src')
        for i in range(10):
            userzt1 = html.xpath('//h3[@class="tit"]')[i]
            userzt2 = userzt1.xpath('./a/text()')
            str1 = ''
            for j in range(len(userzt2)):
                str1 = str1 + userzt2[j]
            L1.append(str1)
        usersubject = L1
        for i in range(10):
            useraddres1 = html.xpath('//li[@class="list_item"]')[i]
            useraddres2 = useraddres1.xpath('p/text()')[0]
            useraddres3 = html.xpath('//span[@class="colOrange"]')[i]
            useraddres4 = useraddres3.xpath('./text()')[0]
            L2.append(useraddres2 + useraddres4)
        useraddress = L2
        for i in range(10):
            userstroke1 = html.xpath('//li[@class="list_item"]')[i]
            userstroke2 = userstroke1.xpath('p[4]/text()')
            L3.append(userstroke2)
        userstroke = L3
        for i in range(10):
            userimages = html.xpath('//ul[@class="pics"]')[i]
            L5 = []
            for j in range(1, len(userimages) + 1):
                L5.append(userimages.xpath(f'li[{j}]/a/img/@src'))
            L4.append(L5)
        userimages = L4
        userdz = html.xpath('//span[@class="icon_view"]/span/text()')
        userpl = html.xpath('//span[@class="icon_love"]/span/text()')
        for i in range(len(usertitle)):
            alldata = []
            alldata.append(usertitle[i])
            alldata.append(usersubject[i])
            alldata.append(useraddress[i])
            alldata.append(str(userstroke[i]))
            alldata.append(userdz[i])
            alldata.append(userpl[i])
            alldata.append(userpicture[i])
            alldata.append(userurl[i])
            alldata.append(str(userimages[i]))
            self.parse_excel(alldata)
        return True

    def parse_excel(self, alldata):
        filetitle = ["用户昵称","用户发表主题","用户途径","用户路径","用户点赞数","用户评论数","用户头像","用户主页地址","用户发布图片"]
        if not os.path.exists(self.excellj):
            workbook = Workbook()
            workbook.save(self.excellj)
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(filetitle)
            wa.append(alldata)
            wb.save(self.excellj)
        else:
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(alldata)
            wb.save(self.excellj)
        return True

    def main(self, ):
        UrlList = ["https://travel.qunar.com/place/api/html/books/dist/299979?sortField=0&pageSize=10&page="]
        names = ["热门攻略"]
        for i in range(len(UrlList)):
            for j in range(1,3):
                url = UrlList[i] + str(j)
                self.get_html(url)
                print(f"重庆地区【{names[i]}】第{j}页数据爬取结束!!!")
                time.sleep(10)

if __name__ == '__main__':
    spider = RenrenLogin()
    spider.main()

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/618173.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

天下大爱唯母爱

岁月轮转&#xff0c;人生寻常&#xff0c;又逢一年母亲节。作为子女&#xff0c;这是所有人都参与节日&#xff0c;也是每一位母亲在繁忙日常中&#xff0c;一个短暂的休息&#xff0c;停下手中的忙碌&#xff0c;听孩子的一声祝福&#xff1a;妈妈辛苦了&#xff0c;母亲节快…

树莓派4B-搭建一个本地车牌识别服务器

实现目标&#xff1a; 一、设备自启后能够获得服务的ip与端口号&#xff0c;用于计算机连接设备&#xff1b; 二、计算机可以通过服务ip与端口访问设备服务&#xff1b; 三、上传需要处理的数据&#xff0c;返回结果反馈给用户&#xff1b; 四、上传到服务器的数据不会导致设备…

车载测试系列:CAPL脚本语法

HFP测试内容与测试方法 2.3 接听来电&#xff1a;测试手机来电时&#xff0c;能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件&#xff1a;待测手机与车载车载设备处于连接状态 2、测试步骤&#xff1a; 1&#xff09;用辅助测试机拨打待测手机&…

本地电脑hosts强制解析指定IP的方法

网站接入CDN后&#xff0c;很多时候需要本地强制解析回源查看状态&#xff0c;比如查看是不是源服务器故障&#xff0c;网站修改是否正确&#xff0c;网站更新是否及时&#xff0c;故障查看是CDN问题还是源服务器问题&#xff0c;都需要hosts回源。 今天云加速教大家如何本地电…

AI工具摸索-关于写作(1)

虽然人工智能工具非常多,但是如果想要成为生产力,能达标的工具仍然非常少,除了最常用的chatgpt,其他的工具真的能达标吗,这篇文章主要就是对比市面上的一些工具&#xff0c; 但我这个人非常执拗,我认为作为生产力工具的功能必然是可以真正帮助我们的,而不是说作为一个写作工具结…

docker部署springboot+Vue项目

项目介绍&#xff1a;后台springboot项目&#xff0c;该项目环境mysql、redis 。前台Vue&#xff1a;使用nginx反向代理 方法一&#xff1a;docker run 手动逐个启动容器 1.docker配置nginx代理 将vue项目打包上传到服务器上。创建文件夹存储数据卷&#xff0c;html存放打包…

【Dash】开始学习dash

安装Dash 网上很多安装dash的教程&#xff0c;不再赘述 开始Dash 一个dash页面的基本写法 # dash 的基本写法 import dash from dash import html,dcc,callback,Input,Output# 创建一个 dash 应用 app dash.Dash()# 定义布局&#xff0c;定义一个输入框和一个输出框 app.l…

NIOS II实现LED流水灯以及串口输出(DE2-115开发板)

NIOS II实现LED流水灯以及串口输出&#xff08;DE2-115开发板&#xff09; 前言什么是Qsys?什么是NIOSII?注意事项1、管脚配置2、配置NIOSII时的连接3、注意中断配置好后是这样的4、注意名称的配置5、设置双功能引脚 NIOS II的报错代码以及效果演示流水灯输出到电脑串口助手 …

【020】基于JavaWeb实现的批报管理系统

项目介绍 基于jspservlet实现的批报管理系统采用B/S架构,该项目设计了一个角色管理员&#xff0c;管理员实现了我的案件、查询统计、项目维护等三大功能模块 技术栈 开发工具&#xff1a;Idea2020.3 运行环境&#xff1a;jdk1.8tomcat9.0mysql5.7 服务端技术&#xff1a;j…

【机器学习数据可视化-04】Pyecharts数据可视化宝典

一、引言 在大数据和信息爆炸的时代&#xff0c;数据可视化成为了信息传递和展示的关键手段。通过直观的图表和图形&#xff0c;我们能够更好地理解数据&#xff0c;挖掘其背后的信息。Pyecharts&#xff0c;作为一款基于Python的数据可视化库&#xff0c;凭借其丰富的图表类型…

获取Linux上的Redis的用户名、密码、端口、host等信息

目录 进入redis-cli的目录 启动./redis-cli服务 查询密码 查询用户名 查询端口 查询host 参考文章&#xff1a;解决redis-cli连接时出现Could not connect to Redis at 127.0.0.1:6379: Connection refused-阿里云开发者社区 (aliyun.com) linux查看redis用户和密码_mo…

Java构造方法详解

在Java方法内部定义一个局部变量时&#xff0c;必须要初始化&#xff0c;否则就会编译失败&#xff0c;如下&#xff1a; 要让上述代码通过编译&#xff0c;只需在使用a之前给a赋一个初始值即可 如果是对象&#xff1a;下面用一个日期类演示 我们没有给年月日赋值&#xff0c;…

纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例

介绍 本示例主要介绍了利用position和onTouch来实现首页下拉进入二楼、二楼上划进入首页的效果场景&#xff0c;利用translate和opacity实现动效的移动和缩放&#xff0c;并将界面沉浸式&#xff08;全屏&#xff09;显示。 效果图预览 使用说明 向下滑动首页页面超过触发距…

实验室纳新宣讲会(java后端)

前言 2024-5-12 22:00:39 这是陈旧已久的草稿 2021-09-16 15:41:38 发布一下 当时我进入实验室&#xff0c;也是大二了&#xff0c;实验室纳新需要宣讲&#xff0c; 但是当时有疫情&#xff0c;又没宣讲成。 实验室纳新宣讲会&#xff08;java后端&#xff09; 首先&#x…

【计算机网络】物理层 通信基础、奈氏准则、香农公式 习题2

下列说法中正确的是( )。 A. 信道与通信电路类似&#xff0c;一条可通信的电路往往包含一个信道 B.调制是指把模拟数据转换为数字信号的过程 C. 信息传输速率是指通信信道上每秒传输的码元数 D.在数值上&#xff0c;波特率等于比特率与每符号所含的比特数的比值 信息传输速率&a…

【进程通信】了解信号以及信号的产生

文章目录 0.前言1.信号的基本概念1.1中断1.1.1 软中断1.1.2硬中断 1.2异步1.2.1异步和同步的比较 2.信号的主要用途3.信号的特点4.查看信号4.1Core和Term的区别4.2生成Core文件 5.初识捕捉信号5.1signal函数 6.产生信号的方式6.1.通过终端按键产生信号6.2.调用系统函数向进程发…

浅谈如何做好软件项目

如何做好软件项目&#xff0c;这是摆在软件实施团队每个人面前的关键问题。笔者在此提出一些浅见&#xff0c;供大家参考。欢迎在评论区交流&#xff01; 目录 【摘要】 【正文】 一、树立正确的需求调研理念 二、谋定而后动的开发工作 三、大道至简的系统设计 四、专注项…

hcip实验6:BGP综合实验

实验拓扑&#xff1a; 实验配置&#xff1a; ip地址配置&#xff1a; #R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [R1-GigabitEthernet0/0/0]int l0 [R1-LoopBack0]ip add 172.16.0.1 32 [R1-LoopBack0]int l1 [R1-LoopBack1]ip add 192.168.1.1 24#R2…

算法笔记——数位DP

一、前置知识 1.DP小知识 D P DP DP 是一种算法思想&#xff0c;用递推方程的方式解决问题。但是使用它要满足如下性质&#xff1a; 最优子结构&#xff1a; 子结构优秀&#xff0c;整个就优秀。无后效性&#xff1a;当前决策不会影响后面。 2.DP实现方法 众所周知&#xf…

环境变量(全)

概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可以链接成功&#xff0c;生成可执…