应对反爬:使用Selenium模拟浏览器抓取12306动态旅游产品

小白学大数据
• 阅读 18

在当今数据驱动的时代,网络爬虫已成为获取互联网信息的重要手段。然而,许多网站如12306都实施了严格的反爬虫机制,特别是对于动态加载的内容。本文将详细介绍如何使用Selenium模拟真实浏览器行为,有效绕过这些限制,成功抓取12306旅游产品数据。 12306反爬机制分析 12306作为中国铁路官方售票平台,对其旅游产品数据实施了多层次防护: 动态内容加载:大量使用JavaScript异步加载数据,传统爬虫无法获取 验证码系统:复杂图片验证码和滑动验证码阻止自动化访问 请求头检测:验证User-Agent、Referer等头部信息 行为分析:检测鼠标移动、点击模式等人类特征 IP限制:频繁请求会导致IP地址被暂时封锁 Selenium技术简介 Selenium是一个自动化Web测试工具,但其浏览器自动化能力使其成为应对反爬策略的利器: 真实浏览器环境:完全模拟用户操作,生成合法流量模式 JavaScript执行:能够处理动态加载内容 元素交互:可以模拟点击、输入等用户行为 跨平台支持:支持Chrome、Firefox、Edge等主流浏览器 环境准备与配置 所需工具和库安装 首先确保安装以下Python库: bash pip install selenium beautifulsoup4 pandas webdriver-manager WebDriver管理 Selenium需要对应浏览器的驱动程序。推荐使用webdriver-manager自动管理驱动: 爬虫设计与实现 页面分析与等待策略 12306旅游产品页面(https://kyfw.12306.cn/otn/product/index.html)采用动态加载方式,需要合理设置等待时间: 处理验证码挑战 当遇到验证码时,我们需要人工干预或使用OCR服务: 数据提取实现 提取旅游产品信息的完整实现: 完整爬虫流程 整合以上功能的完整实现:


            # 提取价格信息
            price_elem = item.find('div', class_='product-price')
            price_text = price_elem.text.strip() if price_elem else "0"
            price = re.search(r'(\d+)', price_text.replace(',', ''))
            price = int(price.group(1)) if price else 0

            # 提取出发地/目的地
            route_elem = item.find('div', class_='product-route')
            route = route_elem.text.strip() if route_elem else ""

            # 提取产品详情链接
            link_elem = item.find('a', href=True)
            link = "https://kyfw.12306.cn" + link_elem['href'] if link_elem else ""

            # 提取产品图片
            img_elem = item.find('img', src=True)
            img_url = img_elem['src'] if img_elem else ""

            products.append({
                'name': name,
                'price': price,
                'route': route,
                'link': link,
                'image_url': img_url,
                'crawled_time': pd.Timestamp.now()
            })

        except Exception as e:
            print(f"提取产品信息时出错: {e}")
            continue

    return products

def crawl_12306_tours():
    """爬取12306旅游产品的完整流程"""
    print("启动浏览器(使用代理服务器)...")
    print(f"代理服务器: {proxyHost}:{proxyPort}")

    driver = setup_driver()

    try:
        # 访问12306旅游产品页面
        print("访问12306旅游产品页面...")
        driver.get("https://kyfw.12306.cn/otn/product/index.html")

        # 等待页面加载
        time.sleep(3)

        # 检查并处理验证码
        if handle_verification(driver):
            # 验证码处理后重新等待页面加载
            time.sleep(3)

        # 提取产品信息
        print("正在提取旅游产品信息...")
        products = extract_tour_products(driver)

        # 保存数据
        if products:
            df = pd.DataFrame(products)
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            filename = f"12306_tours_{timestamp}.csv"
            df.to_csv(filename, index=False, encoding='utf-8-sig')
            print(f"成功提取 {len(products)} 个旅游产品,已保存到 {filename}")

            # 同时保存JSON格式
            json_filename = f"12306_tours_{timestamp}.json"
            with open(json_filename, 'w', encoding='utf-8') as f:
                json.dump(products, f, ensure_ascii=False, indent=2)
            print(f"JSON数据已保存到 {json_filename}")
        else:
            print("未找到旅游产品信息")

        return products

    except Exception as e:
        print(f"爬取过程中发生错误: {e}")
        return []

    finally:
        # 关闭浏览器
        driver.quit()
        print("浏览器已关闭")

# 执行爬虫
if __name__ == "__main__":
    crawl_12306_tours()

道德与法律考量 在使用Selenium爬取12306数据时,必须注意以下道德和法律问题: 遵守robots.txt:检查目标网站的爬虫政策 控制请求频率:避免对服务器造成过大压力 数据使用限制:仅将数据用于个人学习和研究目的 用户隐私保护:不收集、存储或分享任何用户个人信息 版权尊重:遵守12306网站上内容的版权声明

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Irene181 Irene181
4年前
别去送死了。Selenium 与 Puppeteer 能被网站探测的几十个特征
摄影:产品经理味道很好的毛血旺很多人喜欢使用Selenium或者Puppeteer(Pyppeteer)通过模拟浏览器来编写爬虫,自以为这样可以不被网站检测到,想爬什么数据就爬什么数据。但实际上,Selenium启动的浏览器,有几十个特征可以被网站通过JavaScript探测到。Puppeteer启动的浏览器,也有很多特征能够被网站探测。
Stella981 Stella981
3年前
Nginx反爬虫: 禁止某些User Agent抓取网站
一、概述网站反爬虫的原因不遵守规范的爬虫会影响网站的正常使用网站上的数据是公司的重要资产爬虫对网站的爬取会造成网站统计数据的污染常见反爬虫手段1\.根据IP访问频率封禁IP2\.设置账号登陆时长,账号访问过多封禁设置账号的登录限制,只有登录才能展现内容
Stella981 Stella981
3年前
Selenium使用代理出现弹窗验证如何处理
部分商业网站对爬虫程序限制较多,在数据采集的过程中对爬虫请求进行了多种验证,导致爬虫程序需要深入分析目标网站的反爬策略,定期更新和维护爬虫程序,增加了研发的时间和投入成本。这种情况下,使用无头浏览器例如Selenium,模拟用户的请求进行数据采集是更加方便快捷的方式。同时为了避免目标网站出现IP限制,配合爬虫代理,实现每次请求自动切换IP,能够保证长期稳定
小白学大数据 小白学大数据
6个月前
使用 User-Agent 模拟浏览器行为的技巧
在现代网络爬虫和自动化测试中,模拟浏览器行为是一个至关重要的技术。通过模拟浏览器行为,爬虫可以伪装成真实用户,从而绕过网站的反爬虫机制,获取所需的数据。而UserAgent是实现这一目标的关键技术之一。一、UserAgent的作用UserAgent是HTT
小白学大数据 小白学大数据
5个月前
Scrapy结合Selenium实现滚动翻页数据采集
引言在当今的互联网数据采集领域,许多网站采用动态加载技术(如AJAX、无限滚动)来优化用户体验。传统的基于Requests或Scrapy的爬虫难以直接获取动态渲染的数据,而Selenium可以模拟浏览器行为,实现滚动翻页和动态内容加载。本文将介绍如何结合S
小白学大数据 小白学大数据
3个月前
动态网页爬取:Python如何获取JS加载的数据?
在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段。许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取方法难以奏效。然而,对于数据分析师、研究人员以及开发者来说,获取这些动态加载的数据仍然是一个重要的需求。本文
深度解析Python爬虫中的隧道HTTP技术
前言网络爬虫在数据采集和信息搜索中扮演着重要的角色,然而,随着网站反爬虫的不断升级,爬虫机制程序面临着越来越多的挑战。隧道HTTP技术作为应对反爬虫机制的重要性手段,为爬虫程序提供了更为灵活和隐蔽的数据采集方式。本文将探讨Python爬虫中的隧道HTTP技
如何使用pholcus库进行多线程网页标题抓取以提高效率?
在当今信息爆炸的时代,数据抓取已成为获取信息的重要手段。Go语言因其高效的并发处理能力而成为编写爬虫的首选语言之一。pholcus库,作为一个强大的Go语言爬虫框架,提供了多线程抓取的能力,可以显著提高数据抓取的效率。本文将介绍如何使用pholcus库进行
小白学大数据 小白学大数据
8个月前
Python爬虫:爱奇艺榜单数据的实时监控
实时监控榜单数据对于内容推荐、市场分析和用户行为研究至关重要。本文将介绍如何使用Python编写爬虫程序,以实时监控爱奇艺榜单数据,并提供相应的代码实现过程,包括如何在代码中添加代理信息以应对反爬虫机制。爬虫技术概述爬虫(WebCrawler),也称为网络
小白学大数据
小白学大数据
Lv1
男 · 亿牛云 · python技术
宁为代码类弯腰,不为bug点提交!
文章
117
粉丝
5
获赞
18