基于selenium爬取去哪儿酒店信息

这篇具有很好参考价值的文章主要介绍了基于selenium爬取去哪儿酒店信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

去哪儿网站中,要爬取旅游的酒店信息,我们用通常的requests库进行爬取的时候发现,当我们要翻页的时候网址未出现变化,返回的网页源码信息始终只有第一页的内容,那么有没有一种方式可以使得能够翻页爬取呢?这时候我们要用爬虫常用的selenium框架进行爬取了,下面就让我们来一起学习下,这篇关于用selenium怎么来爬取去哪儿网站的酒店信息,希望大家在阅读完之后有所收获。

下载selenium第三方库:

这里我们使用命令 pip install selenium进行安装,这里可能安装的过程会有点慢,我们可以加一个镜像进行安装,命令如下:

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

安装浏览器驱动:

我们首先需要确定我们浏览器的版本,这里我使用的是谷歌浏览器

基于selenium爬取去哪儿酒店信息,selenium,python,爬虫

下载驱动的网址有以下几个:

谷歌浏览器

https://chromedriver.storage.googleapis.com/index.html

火狐浏览器

https://github.com/mozilla/geckodriver/releases

Edge浏览器

Microsoft Edge WebDriver - Microsoft Edge Developer

下载完成之后,把驱动导入python的安装目录里面:

基于selenium爬取去哪儿酒店信息,selenium,python,爬虫

 这样我们的selenium安装所需的步骤就完成了,下面我们对网站进行爬取

导入所需要的库:

from selenium import webdriver
from lxml import html
import time
import re
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions
import json

分析网页:

我们先明确我们要提取的信息,这里我要的到的内容为如下:

 

基于selenium爬取去哪儿酒店信息,selenium,python,爬虫

当我们访问网址

https://hotel.qunar.com/cn/fuzhou_fujian?fromDate=2023-05-20&toDate=2023-05-21&cityName=%E7%A6%8F%E5%B7%9E

会发现要获取网页的信息,我们需要提前登录才能查看,如图所示:

基于selenium爬取去哪儿酒店信息,selenium,python,爬虫

因此我们如何要使用selenium爬取的时候,需要进行模拟登录的操作,才能获取完整的网页源码信息

步骤一:

我们需要模拟登录网页,这里我采用的获取登录后的cookie信息,然后进行模拟登录的操作

代码如下:

option = ChromeOptions()
# 配置浏览器的相关设置,把浏览器设置系统不可检测
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# 设置编码集
option.add_argument('lang=zh_CN.UTF-8')
browser = webdriver.Chrome(options=option)

browser.get('https://hotel.qunar.com/cn/fuzhou_fujian?fromDate=2023-04-15&toDate=2023-04-16&cityName=%E7%A6%8F%E5%B7%9E')

time.sleep(30)
dictCookies = browser.get_cookies()  # 获取list的cookies
jsonCookies = json.dumps(dictCookies)  # 转换成字符串保存

with open('cookie.txt', 'w') as f:
    f.write(jsonCookies)
print('cookies保存成功!')

 这里我们在selenium模拟打开网页的时候,我们设置30s等待时间,将我们的登录信息填写完毕,再获取我们的cookie信息,保存在文件“cookie.txt”中

步骤二:

获取cookie信息之后,接下来我们就正式开始爬取信息,首先我们要先要用上一步采集的cookie信息来进行模拟登录的操作,代码如下:

def crack_permissions(browser):
    # 休眠,避免浏览器加载过慢
    time.sleep(5)

    # 读取cookie文件,拿到用户的登录cookie信息
    with open('cookie.txt', 'r', encoding='utf8') as f:
        listCookies = json.loads(f.read())

    # 往browser里添加cookies
    for cookie in listCookies:
        cookie_dict = {
            'domain': '.qunar.com',
            'name': cookie.get('name'),
            'value': cookie.get('value'),
            "expires": '',
            'path': '/',
            'httpOnly': False,
            'HostOnly': False,
            'Secure': False
        }
        browser.add_cookie(cookie_dict)
    # 刷新浏览器信息
    browser.refresh()
    time.sleep(2)

步骤三:

登录后我们就可以开始抓取网页的源码信息了,这里我们需要设置要爬取的页面数量,这里我设置的120页,值得注意的是我们每次翻页的时候,需要进行一个下滑网页的操作,加载网页的内容,等待网页渲染,否则不能得到完整的网页信息,下滑代码如下:

# 模拟下滑到底部操作
        for j in range(1, 4):
            browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(1)

步骤四:

接下来我们对网页源码进行清洗,这里我使用的是xpath进行清洗,代码如下:

 # 获取网页信息
 resp = browser.page_source

 # 加载xpath,用于数据解析
 etree = html.etree
 xml = etree.HTML(resp)

然后对每一栏信息进行提取,代码如下:

for k in range(1, 21):
            # name: 酒店名称
            name = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[1]/a/text()')
            if len(name) > 0:
                mess_dict['name'] = name[0]
            else:
                mess_dict['name'] = ''

            # 酒店价格
            price = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[2]/p[1]/a/text()')
            if len(price) > 0:
                try:
                    mess_dict['price'] = int(price[0])
                except:
                    mess_dict['price'] = 0
            else:
                mess_dict['price'] = 0

            # 类型,例如:舒适型、高档型等
            dangciText = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[1]/span[2]/text()')
            if len(dangciText) > 0:
                mess_dict['dangciText'] = dangciText[0]
            else:
                mess_dict['dangciText'] = ''

            # 酒店评分
            score = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[2]/span[1]/text()')
            if len(score) > 0:
                try:
                    mess_dict['score'] = float(score[0])
                except:
                    mess_dict['score'] = 0.0
            else:
                mess_dict['score'] = 0.0

            # 酒店整体评价
            commentDesc = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[2]/span[2]/text()')
            if len(commentDesc) > 0:
                '''
                    这里需要加入一个判断逻辑,
                    在标签上有时候会与评论数相重叠,
                    这里需要判断提取信息是否为评论数
                '''
                tmp = re.findall('共(.*?)条评论', commentDesc[0])
                if len(tmp) > 0:
                    mess_dict['commentDesc'] = ''
                else:
                    mess_dict['commentDesc'] = commentDesc[0]
            else:
                mess_dict['commentDesc'] = ''

            # 酒店评论数
            commentCount = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[2]/span[3]/text()')
            if len(commentCount) == 0:
                commentCount = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[2]/span[2]/text()')

            if len(commentCount) > 0:
                tmp = re.findall('共(.*?)条评论', commentCount[0])
                if len(tmp) > 0:
                    try:
                        mess_dict['commentCount'] = int(tmp[0])
                    except:
                        mess_dict['commentCount'] = 0
                else:
                    mess_dict['commentCount'] = 0
            else:
                mess_dict['commentCount'] = 0

            # 酒店大致位置
            locationInfo = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[3]/text()')
            if len(locationInfo) > 0:
                mess_dict['locationInfo'] = locationInfo[0]
            else:
                mess_dict['locationInfo'] = ''

步骤五:

经过以上步骤,我们得到了我们想要的信息内容,这里我们要把数据存储在一个地方,我采用的是数据库存储:

def Connect_Sql(data_name: str):
    db = pymysql.connect(
        host='localhost',
        user='root',
        password='root',
        db=data_name,
        port=3306
    )
    return db


def save_data_sql(data):
    try:
        conn = Connect_Sql('ptu')
        cursor = conn.cursor()
        try:
            sql = "insert into hotel_mess values (%s,%s,%s,%s,%s,%s,%s,%s)"
            cursor.execute(sql, data)
        except:
            print("缺失")
        conn.commit()
        cursor.close()
        conn.close()
    except:
        print("失败!")

最后得到的酒店信息的大致内容如下:

基于selenium爬取去哪儿酒店信息,selenium,python,爬虫

完整的代码如下:

获取cookie:

from selenium import webdriver
from lxml import html
import time
import re
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions
import json
from save_data import save_data_sql
import datetime


option = ChromeOptions()
# 配置浏览器的相关设置,把浏览器设置系统不可检测
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# 设置编码集
option.add_argument('lang=zh_CN.UTF-8')
browser = webdriver.Chrome(options=option)

browser.get('https://hotel.qunar.com/cn/fuzhou_fujian?fromDate=2023-04-15&toDate=2023-04-16&cityName=%E7%A6%8F%E5%B7%9E')

time.sleep(30)
dictCookies = browser.get_cookies()  # 获取list的cookies
jsonCookies = json.dumps(dictCookies)  # 转换成字符串保存

with open('cookie2.txt', 'w') as f:
    f.write(jsonCookies)
print('cookies保存成功!')

爬取酒店信息:

from selenium import webdriver
from lxml import html
import time
import re
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions
import json
from save_data import save_data_sql


# 获取浏览器驱动
def get_driver():
    option = ChromeOptions()
    # 配置浏览器的相关设置,把浏览器设置系统不可检测
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 设置编码集
    option.add_argument('lang=zh_CN.UTF-8')
    browser = webdriver.Chrome(options=option)
    return browser


# 破解权限,拿到浏览器的cookie,进行模拟登录,绕开登录反爬
def crack_permissions(browser):
    # 休眠,避免浏览器加载过慢
    time.sleep(5)

    # 读取cookie文件,拿到用户的登录cookie信息
    with open('cookie2.txt', 'r', encoding='utf8') as f:
        listCookies = json.loads(f.read())

    # 往browser里添加cookies
    for cookie in listCookies:
        cookie_dict = {
            'domain': '.qunar.com',
            'name': cookie.get('name'),
            'value': cookie.get('value'),
            "expires": '',
            'path': '/',
            'httpOnly': False,
            'HostOnly': False,
            'Secure': False
        }
        browser.add_cookie(cookie_dict)
    # 刷新浏览器信息
    browser.refresh()
    time.sleep(2)


# 启动任务
def start_task(browser):
    for i in range(120):
        # 模拟下滑到底部操作
        for j in range(1, 4):
            browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(1)

        # 获取网页信息
        resp = browser.page_source

        # 加载xpath,用于数据解析
        etree = html.etree
        xml = etree.HTML(resp)

        # 指定日期
        date_time = '2023-05-20'
        mess_dict = {}
        for k in range(1, 21):
            # name: 酒店名称
            name = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[1]/a/text()')
            if len(name) > 0:
                mess_dict['name'] = name[0]
            else:
                mess_dict['name'] = ''

            # 酒店价格
            price = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[2]/p[1]/a/text()')
            if len(price) > 0:
                try:
                    mess_dict['price'] = int(price[0])
                except:
                    mess_dict['price'] = 0
            else:
                mess_dict['price'] = 0

            # 类型,例如:舒适型、高档型等
            dangciText = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[1]/span[2]/text()')
            if len(dangciText) > 0:
                mess_dict['dangciText'] = dangciText[0]
            else:
                mess_dict['dangciText'] = ''

            # 酒店评分
            score = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[2]/span[1]/text()')
            if len(score) > 0:
                try:
                    mess_dict['score'] = float(score[0])
                except:
                    mess_dict['score'] = 0.0
            else:
                mess_dict['score'] = 0.0

            # 酒店整体评价
            commentDesc = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[2]/span[2]/text()')
            if len(commentDesc) > 0:
                '''
                    这里需要加入一个判断逻辑,
                    在标签上有时候会与评论数相重叠,
                    这里需要判断提取信息是否为评论数
                '''
                tmp = re.findall('共(.*?)条评论', commentDesc[0])
                if len(tmp) > 0:
                    mess_dict['commentDesc'] = ''
                else:
                    mess_dict['commentDesc'] = commentDesc[0]
            else:
                mess_dict['commentDesc'] = ''

            # 酒店评论数
            commentCount = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[2]/span[3]/text()')
            if len(commentCount) == 0:
                commentCount = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[2]/span[2]/text()')

            if len(commentCount) > 0:
                tmp = re.findall('共(.*?)条评论', commentCount[0])
                if len(tmp) > 0:
                    try:
                        mess_dict['commentCount'] = int(tmp[0])
                    except:
                        mess_dict['commentCount'] = 0
                else:
                    mess_dict['commentCount'] = 0
            else:
                mess_dict['commentCount'] = 0

            # 酒店大致位置
            locationInfo = xml.xpath(f'//*[@id="hotel_lst_body"]/li[{k}]/div/div[3]/p[3]/text()')
            if len(locationInfo) > 0:
                mess_dict['locationInfo'] = locationInfo[0]
            else:
                mess_dict['locationInfo'] = ''

            # 读入数据库
            save_data_sql((mess_dict['name'], mess_dict['price'], mess_dict['dangciText'], mess_dict['score'],
                           mess_dict['commentDesc'], mess_dict['commentCount'], mess_dict['locationInfo'], date_time))

            print(mess_dict)

        time.sleep(1)
        browser.find_element(By.XPATH, '//*[@id="root"]/div/section/section[1]/aside[1]/div[7]/p[1]').click()
        time.sleep(1)


# 加载浏览器驱动
browser = get_driver()
# 进入网页
browser.get(
    'https://hotel.qunar.com/cn/fuzhou_fujian?fromDate=2023-05-20&toDate=2023-05-21&cityName=%E7%A6%8F%E5%B7%9E')
# 破解权限
crack_permissions(browser=browser)
# 启动任务
start_task(browser=browser)

总结

爬取酒店信息的重难点主要在于模拟的登录的过程,需要注意的坑是每次我们翻页的时候要下拉下滑网页,等待网页加载,加载完毕之后才能获取网页信息,再来就是网页信息的清洗,这里值得注意的是可能存在标签错位的情况,这里我们就要特殊情况,特殊处理。文章来源地址https://www.toymoban.com/news/detail-707787.html

到了这里,关于基于selenium爬取去哪儿酒店信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python网络爬虫(三):Selenium--以携程酒店为例

            Selenium是一个用于网站应用程序自动化的工具,它可以直接运行在浏览器中,就像真正的用户在操作一样。它相当于一个机器人,可以模拟人类在浏览器上的一些行为,比如输入文本、点击、回车等。Selenium支持多种浏览器,本文以Chrome浏览器为例。chromedriver是一个驱

    2024年04月23日
    浏览(52)
  • 爬虫与数据分析项目实战2.1 Selenium爬取Boss招聘信息

    完成: 1.爬取信息 2.基于爬取结果筛选符合条件的信息    岗位名称、薪资、岗位要求、地区、公司名称、公司规模、细节链接 3.筛选base杭州的岗位保存到csv文件中 But容易出现网络不稳定造成的无法定位元素所在位置的情况,小范围爬取可以 4.基于csv分析后续

    2024年02月08日
    浏览(48)
  • 【python爬虫】——历史天气信息爬取

    在2345天气信息网2345天气网 依据 地点 和 时间 对相关城市的历史天气信息进行爬取。 网页使用get方式发送请求,所需参数包括areaInfo[areaId]、areaInfo[areaType]、date[year]、date[month],分别为城市id、城市类型,年、月。

    2024年02月07日
    浏览(55)
  • 网络爬虫丨基于scrapy+mysql爬取博客信息

    本期内容 :基于scrapy+mysql爬取博客信息并保存到数据库中 实验需求 anaconda丨pycharm python3.11.4 scrapy mysql 项目下载地址:https://download.csdn.net/download/m0_68111267/88740730 本次实验实现了:使用Scrapy框架爬取博客专栏的目录信息并保存到MySQL数据库中,实验主要涉及到Python的爬虫技术以

    2024年03月18日
    浏览(56)
  • 爬虫项目实战:利用基于selenium框架的爬虫模板爬取豆瓣电影Top250

    👋 Hi, I’m @货又星 👀 I’m interested in … 🌱 I’m currently learning … 💞 I’m looking to collaborate on … 📫 How to reach me … README 目录(持续更新中) 各种错误处理、爬虫实战及模板、百度智能云人脸识别、计算机视觉深度学习CNN图像识别与分类、PaddlePaddle自然语言处理知识图谱、

    2024年02月04日
    浏览(49)
  • Python爬虫|使用Selenium轻松爬取网页数据

    1. 什么是selenium? Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏览器包括IE,Firefox,Safari,Chrome等。 Selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用

    2024年02月04日
    浏览(58)
  • python爬虫实战 scrapy+selenium爬取动态网页

    最近学习了scrapy爬虫框架,想要找个目标练练手。由于现在很多网页都是动态的,因此还需要配合selenium爬取。本文旨在记录这次学习经历,如有疑问或不当之处,可以在评论区指出,一起学习。 对scrapy不了解的同学可以阅读这篇文章 爬虫框架 Scrapy 详解,对scrapy框架介绍的

    2024年02月07日
    浏览(83)
  • 【爬虫系列】Python爬虫实战--招聘网站的职位信息爬取

    1. 需求分析 从网上找工作,大家一般都会通过各种招聘网站去检索相关信息,今天利用爬虫采集招聘网站的职位信息,比如岗位名称,岗位要求,薪资,公司名称,公司规模,公司位置,福利待遇等最为关心的内容。在采集和解析完成后,使用 Excel 或 csv 文件保存。 2. 目标

    2024年02月02日
    浏览(52)
  • Python爬虫实战:selenium爬取电商平台商品数据(1)

    def index_page(page): “”\\\" 抓取索引页 :param page: 页码 “”\\\" print(‘正在爬取第’, str(page), ‘页数据’) try: url = ‘https://search.jd.com/Search?keyword=iPhoneev=exbrand_Apple’ driver.get(url) if page 1: input = driver.find_element_by_xpath(‘//*[@id=“J_bottomPage”]/span[2]/input’) button = driver.find_element_by_xpath(‘

    2024年04月28日
    浏览(45)
  • Python爬虫入门系列之Selenium实现动态页面爬取

    在前一篇博客中,我们学习了如何使用多线程优化爬虫程序。但是,如果要爬取的网页是动态生成的或者包含大量JavaScript代码,单纯的静态页面爬取就不足够了。为了解决这个问题,我们可以使用Selenium库来模拟真实的浏览器行为,从而实现动态页面的爬取。 Selenium是一个用

    2024年02月11日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包