selenium自动化爬取携程酒店信息

本文记录了使用selenium进行携程酒店信息爬取的过程,包括遇到的登录问题、页面跳转、数据获取速度慢以及封IP风险。目前能获取酒店详细信息,但存在效率低和代码组织问题。已开始将数据存储到mysql,但仍有待优化,同时分享了在学习过程中遇到的错误和解决方法。

重要提醒!!!!
携程反爬太强了,用自动化爬取,其他的数据都正确。唯独价格不正确!!!价格是携程随机生成的,不是正确的价格!

当前进度:

已完成搜索目的地,但无法解决携程需要登录才能查看酒店价格,即无法绕过登陆 想办法解决中 2021/2/5
还是无法绕过登陆,只能手动扫码登陆,并且在点击酒店详情后会跳出新的界面,要将driver定位到新的界面上,酒店详情还不能全部获取,后续要想办法将所有的酒店详情全部获取到 2021/2/16
可以获取各个酒店的详细信息,但是目前打开酒店的数量不确定,后面要解决打开酒店数量的问题。最重要的打开酒店的速度太慢了,打开一个酒店大概需要40多秒,也就是说如果爬取30个酒店,那么就需要近20分钟,效率太低,但爬的快了又会有被封ip的风险。 后面还要把代码分块处理,写到一块太乱了,不便于管理。还要把数据储存到mysql中,但这个我不会,要现学,可能会时间长一些。LOL代币才肝了1600个,太少了,至臻佐伊再不换下次就不知道啥时候了,熬夜淦!2021/2/17
解决了网页加载等待过长的问题 2021/2/17
家中有事,请假10天,果然在家学习效率太低了。
可以将爬下来的数据添加到mysql数据库中了,但是现在效率还是太低,而且有封ip的危险,所以还要解决一下。代码没有分块,接下来把代码分块,美观且方便管理,不会用scrapy,不然更方便。开学了,加油!2021/3/1
出现了奇奇怪怪的问题,不知道为啥,比如复制粘贴到新的py中就无法运行,显示AttributeError: ‘NoneType’ object has no attribute ‘send_keys’,只好自己重新将send_keys重新打一边,然后就可以运行了,还有其他奇奇怪怪的问题,我太难了,在bug中改代码。加入了数组,一次可以查一个省了2021/3/2

代码


# -*- coding = utf-8 -*-
# @Time : 2021/3/3 13:54
# @Author : DLT
# @File : xiecheng1.py
# @Software : PyCharm

import pymysql as pymysql
from selenium import webdriver
from time import sleep
import re
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver.common.keys import Keys
if __name__ == '__main__':
    desired_capabilities = DesiredCapabilities.CHROME
    desired_capabilities["pageLoadStrategy"] = "none"
    driver = webdriver.Chrome(executable_path='chromedriver.exe')  # 打开浏览器
    driver.get('https://www.ctrip.com/')  # 打开网站
    sleep(3)
    # driver.refresh() #刷新浏览器
    '''进入携程主页'''
    #首先登陆
    '''需要手机扫码登陆,手动登录也可以,但是速度太慢'''
    sign_in = driver.find_element_by_class_name("set-text").click()
    sleep(13)  # 8秒时间扫码
    sleep(1)
    #登陆成功后,页面跳转到搜索页面
    # hotel = driver.find_element_by_id("nav_hotel")  # 寻找酒店搜索
    # hotel.click()  # 点击
    # sleep(2)
    '''进入到酒店搜索页面之后'''
    hotel = driver.find_element_by_id("nav_hotel").click()  # 寻找酒店搜索
    # 1、输入目的地
    province = "河南"  # 省级

    citys= ["郑州", "开封", "洛阳", "平顶山", "安阳市", "鹤壁", "新乡", "焦作", "濮阳", "许昌", "漯河", "三门峡", "商丘", "周口", "驻马店", "南阳", "信阳"]
    countys = [
        ["中原区", "二七区", "金水区", "惠济区", "管城区", "上街区", "巩义市", "新郑市", "登封市", "荥阳市", "新密市", "中牟县"],
        ["龙亭区", "鼓楼区", "禹王台区", "顺河区", "祥符区", "兰考县", "通许县", "杞县", "尉氏县"
### 如何使用 Python 爬取携程酒店评论数据 要完成携程酒店评论的数据爬取任务,可以按照以下方法实现。此过程涉及动态请求参数构造、伪造请求头以及处理 Cookies 的技巧。 #### 使用 Requests 和 ExecJS 库构建基础框架 为了模拟浏览器行为并绕过反爬机制,需要设置合适的 User-Agent 并引入必要的 JavaScript 解析工具来生成动态签名或其他加密字段。以下是具体代码示例: ```python import requests from execjs import compile # 设置请求头部信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 'Referer': 'https://hotels.ctrip.com/' } # 动态生成签名函数(假设存在 JS 加密逻辑) with open('signature.js', 'r') as f: js_code = f.read() ctx = compile(js_code) def get_signature(): """调用 JS 函数生成签名""" return ctx.call("generateSignature") url = "https://api.hotels.ctrip.com/reviews" params = { "hotelId": "12345", # 替换为目标酒店 ID "page": "1", "pageSize": "10", "sig": get_signature() # 调用动态生成的签名 } response = requests.get(url, headers=headers, params=params) data = response.json() if data['status'] == 'success': reviews = data['reviews'] for review in reviews: print(f"用户名: {review['username']} | 评分: {review['rating']} | 内容: {review['content']}") else: print("未能成功获取评论数据") ``` 以上代码展示了如何利用 `requests` 发送 GET 请求,并通过自定义的 JavaScript 文件生成所需的签名字符串[^1]。注意实际应用中可能还需要调整 URL 参数或者进一步分析目标页面的具体 API 接口结构。 #### 遵守法律法规与道德规范 在执行任何类型的 Web 数据抓取操作之前,请务必确认已阅读并理解相关服务条款及隐私政策等内容。非法访问他人服务器或滥用其资源均属于违法行为,在某些国家和地区可能会受到严厉处罚[^1]。 #### 处理更高级别的防护措施 如果遇到更加严格的保护手段,则需考虑采用 Selenium 或 Playwright 这样的自动化测试框架代替传统 HTTP 客户端;它们能够加载完整的网页环境从而更好地模仿真实用户的交互动作。不过这通常会增加程序复杂度及时延开销。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值