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

news2025/4/8 12:27:32

一、分析爬取网页:

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()

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】 人工智能和机器学习辅助决策在空战中的未来选择

&#x1f680;传送门 &#x1f680;文章引言&#x1f512;技术层面&#x1f4d5;作战结构&#x1f308;替代决策选项&#x1f3ac;选项 1&#xff1a;超级战争&#xff08;Hyperwar&#xff09;&#x1f320;选项 2&#xff1a;超越OODA&#x1f302;选项 3&#xff1a;阻止其他…

Linux 认识与学习Bash——3

在Linux bash中&#xff0c;数据流重定向是指将命令的输出从默认的标准输出&#xff08;通常是终端&#xff09;重定向到其他位置&#xff0c;如文件或另一个命令的输入。这是通过使用特定的符号来实现的。例如&#xff0c;>用于将输出重定向到文件&#xff0c;而<用于将…

使用 AI Assistant for Observability 和组织的运行手册增强 SRE 故障排除

作者&#xff1a;Almudena Sanz Oliv, Katrin Freihofner, Tom Grabowski 通过本指南&#xff0c;你的 SRE 团队可以实现增强的警报修复和事件管理。 可观测性 AI 助手可帮助用户使用自然语言界面探索和分析可观测性数据&#xff0c;利用自动函数调用来请求、分析和可视化数据…

【35分钟掌握金融风控策略18】贷前风控策略详解-3

目录 ​编辑 贷前风控数据源 第三方数据 贷前风控数据源 第三方数据 在金融风控过程中&#xff0c;金融机构通常会引入一些第三方的风控数据&#xff08;或第三方金融技术&#xff09;来辅助识别贷款个人或贷款企业的风险状况&#xff0c;帮助金融机构进行风控决策&#x…

MySQL·表的内外连接

目录 表的内连和外连 内连接 案例1&#xff1a;显示SMITH的名字和部门名 外连接 左外连接 案例2&#xff1a; 查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 右外连接 案例3&#xff1a;对stu表和exam表联合查询&#…

【话题】你用过最好用的AI工具有那些

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景一、C知道二、CSDN工具集三、AI工具的普及与受欢迎程度四、AI工具的实际应用与影响五、总结与展望文章推荐 背景 探讨人们在使用AI工具时&#xff0c;最喜欢的和认…

栈和队列初级题目(包含四个题)

目录 一、原题链接&#xff1a; 二、有效的括号&#xff1a; ​编辑代码实现&#xff1a; 三、用队列实现栈&#xff1a; 四、用栈实现队列&#xff1a; 五、设计循环队列&#xff1a; 六、读书分享&#xff1a; 一、原题链接&#xff1a; 20. 有效的括号 225. 用队列实…

Linux 进程信号【信号产生】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 信号概念 1. 生活角度的信号 2…

线性代数的一些理解(更新中)

以前学的时候都是囫囵吞枣&#xff0c;能搞过就得了。现在有了点时间可以静下来看看。。 还是分成点来看吧。 1 小车运行 一个车匀速在一维坐标前行&#xff0c;速度是2米每秒&#xff0c;起始点是0。如何描述 设 &#x1d465;(&#x1d461;) 表示车辆在时间 &#x1d461…

为什么要进行金融类软件测试

金融类软件测试是确保金融软件质量、安全性和稳定性的关键步骤。随着金融行业信息化和数字化的深入发展&#xff0c;金融软件的应用范围日益广泛&#xff0c;涉及资金交易、客户信息管理、风险控制等多个方面。 因此&#xff0c;进行金融类软件测试显得尤为重要&#xff0c;以…

力扣HOT100 - 155. 最小栈

解题思路&#xff1a; 辅助栈 class MinStack {private Stack<Integer> stack;private Stack<Integer> min_stack;public MinStack() {stack new Stack<>();min_stack new Stack<>();}public void push(int val) {stack.push(val);if (min_stack.i…

24数维杯ABC题思路已更新!!!!

24数维杯A题保姆级思路&#xff0b;配套代码&#xff0b;后续参考论文 简单麦麦https://www.jdmm.cc/file/2710639/ 24数维杯B题保姆级思路&#xff0b;可执行代码&#xff0b;后续参考论文 简单麦麦https://www.jdmm.cc/file/2710640/ 24数维杯C题保姆级思路&#xff0b;可执…

[AutoSar]BSW_Com021单帧 首帧 流控帧 连续帧 详解

目录 关键词平台说明一、N_PDU和N_PCI二、单帧三、首帧四、流控帧五、连续帧六、case 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagnostic 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (…

2024全新小狐狸AI免授权源码

源码安装说明&#xff1a; 下 载 地 址 &#xff1a; runruncode.com/php/19757.html 1. 在宝塔新建一个站点&#xff0c;选择 PHP 版本为 7.2、7.3 或 7.4。将压缩包上传到站点的根目录&#xff0c;并设置运行目录为 /public。 2. 导入数据库文件&#xff0c;该文件位于 …

【JVM】从三种认知角度重识JVM

目录 JVM概述 JVM主要功能 虚拟机是Java平台无关的保障 JVM概述 JVM&#xff1a;Java Virtual Machine,也就是Java虚拟机。 虚拟机&#xff1a;通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统&#xff08;物理上不存在&#xff09;。 JVM通…

求一个B站屏蔽竖屏视频的脚本

求一个B站屏蔽竖屏视频的脚本 现在B站竖屏竖屏越来越多了&#xff0c;手机还好点给我一个按钮&#xff0c;选择不喜欢&#xff0c;但是我一般都用网页版看视屏&#xff0c;网页版不给我选择不喜欢的按钮&#xff0c;目测大概1/4到1/3的视频都是竖屏视频。 目前网页版唯一的进…

【数据库】数据库指令

一。数据库打开 1.命令行 2.进入mysql mysql -uroot -p密码 3.退出 exit&#xff1b; 二。针对数据库的操作 1.创建数据库&#xff08;有分号&#xff09; create database student; 2.使用数据库 use student 3.删除数据库&#xff08;有分号&#xff09; drop database…

回归预测 | Matlab实现SMA-GPR黏菌算法优化高斯过程回归多变量回归预测

回归预测 | Matlab实现SMA-GPR黏菌算法优化高斯过程回归多变量回归预测 目录 回归预测 | Matlab实现SMA-GPR黏菌算法优化高斯过程回归多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现SMA-GPR黏菌算法优化高斯过程回归多变量回归预测 1.Matlab实现…

【Redis】用户登录校验

对于用 redis 对用户进行登录校验&#xff0c;大致可分为以下六步&#xff1a; 首先通过查询数据库来查找具有提供的用户名、密码和delFlag值为0的用户。如果未找到用户&#xff0c;则抛出一个带有消息"用户不存在"的ClientException&#xff08;用户不存在&#xf…

能远程一起观看电影和直播的SyncTV

什么是 SyncTV &#xff1f; SyncTV 是一个允许您远程一起观看电影和直播的程序。它提供了同步观看、剧院和代理功能。使用 SyncTV&#xff0c;您可以与朋友和家人一起观看视频和直播&#xff0c;无论他们在哪里。SyncTV 的同步观看功能确保所有观看视频的人都在同一点上。这意…