Python爬取加载js的页面

本文介绍使用Python结合selenium和phantomjs爬取便民查询网上飞机场详细信息的过程。通过分析网页结构,提取机场链接,并深入机场详情页获取机场信息。文章分享了如何处理js动态加载内容,确保数据准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python爬取便民查询网的飞机场信息

思路:查看网页源码可以看出,289个页面按钮的的URL的规律很明显

页码按钮的链接


可以将这些URL写入一个test.txt文件。对于每一页面根据HTML可以看出,找到table标签下的table标签,该table标签下的所有a标签就是机场详细信息的链接

页面上机场详细信息的链接


进入机场的详细信息页面,查看源码,发现规律也很强,在table的table下的tbody有机场的详细信息。tr下的两个td有对应信息的属性和值,很容易取出。

机场详细信息页面


总体思路就是:将所有页码链接的URL存入test.txt文件,每次读取一个页面的URL(一行)访问,将该页面上的机场链接提取出来存入列表,分别访问列表中的机场详细信息URL,从中提取出机场详细信息

由于某些机场的详细信息页面源码提供的信息并不正确,需要执行js脚本后才能得到正确的信息。因此选择selenium+phantomjs组合爬取页面(selenium是一个测试工具,phantomjs是一个无界面浏览器,selenium通过打开phantomjs.exe加载phantomjs浏览器),可以获取加载js后的HTML页面


代码如下

import requests  # 发请求的库
from bs4 import BeautifulSoup  # 解析HTML的库
import json
import time
from selenium import webdriver  # 加载浏览器的库

airportInfoList = []  # 保存所有机场详细信息的列表,元素是字典

siteURL = "https://airportcode.51240.com"  # 网站资源URL的共同前缀


def getAirportInfo(PageURL, page):  # 获取每个页面的机场列表

    try:  # 设置异常处理可以在爬取异常时,将已经爬取的内容写入文件
        browser = webdriver.PhantomJS(executable_path=r'C:\phantomjs\bin\phantomjs')  # 加载浏览器

        response = requests.get(PageURL)  # requests请求网页,这个只是获取机场的URL列表,不需要加载js,直接requests请求
        response.raise_for_status()  # 出错抛异常
        response.encoding = response.apparent_encoding
        html = response.text
        soup = BeautifulSoup(html, 'html.parser')  # 解析html文件
        tag_as = soup.table.table.find_all('a')
        length = str(len(tag_as))
        i = 1
        for tag_a in tag_as:
            airportDetailURL = siteURL + tag_a.attrs['href']
            print("第:" + str(page) + "/298 个页面的第:" + str(i) + "/" + length + "个机场")
            getAirportDetailInfo(airportDetailURL, browser)  # 爬取一个机场的详细信息
            i = i + 1

        # 关闭浏览器,浏览器每爬取一个页面上的所有机场后重启一次
        # 这是因为如果不关闭浏览器,连续访问页面,会导致内存占用增加(虽然只是在一个标签页里请求资源)
        # 我尝试过打开新的标签页,删除旧的标签,在新的标签页里请求资源,但内存还是会增加,只是增加的速度慢了
        # 把浏览器关了重启是最稳妥的方法了
        # 总共有8662个页面,如果连续爬取,会把内存撑爆的
        browser.quit()
    except:
        print("从 " + PageURL + "获取数据失败")
        browser.quit()
        return 0


def getAirportDetailInfo(airportDetailURL, browser):  # 从获取的机场列表中获取每个机场的详细信息

    try:
        time.sleep(3)  # 间隔3秒访问一次,访问服务器速度太快会被禁的,设置为1秒或2秒会在访问100多个页面后被禁
        browser.get(airportDetailURL)  # 浏览器请求页面
        html = browser.page_source
        soup = BeautifulSoup(html, 'html.parser')
        tag_trs = soup.table.table.find_all('tr')
        airportInfoDict = {}
        for tr in tag_trs:
            airportInfoDict[tr.td.string] = tr.td.next_sibling.next_sibling.span.string

        airportInfoList.append(airportInfoDict)
    except:
        print("从 " + airportDetailURL + "获取数据失败")
        return 0


def writeInfoToFile(infoFilepath):

    with open(infoFilepath, 'w+', encoding='utf-8') as infoFile:
        infoFile.write(json.dumps(airportInfoList, ensure_ascii=False))


def main():  # 读取机场URL文件,获取机场列表
    infoFilePath = "test.json"
    page = 1  # 打印爬取进度用,爬取程序很漫长的,没有提示信息很恐怖的

    with open("test.txt", 'r') as AirportFile:
        for PageURL in AirportFile:
            print("第:" + str(page) + "/298 个页面")
            getAirportInfo(PageURL, page)  # 获取一个页面中所有机场详细信息
            page = page + 1

    writeInfoToFile(infoFilePath)  # 将机场详细信息列表里的数据写入json文件


if __name__ == '__main__':
    main()

转载于:https://www.cnblogs.com/DismalSnail/p/11394952.html

### 使用 Python 爬取动态加载网页内容的方法 对于通过 JavaScript 动态加载的内容,`Selenium` 提供了一种有效的方式来进行抓取。由于 `Selenium` 可以模拟真实的浏览器环境并执行页面上的 JavaScript 代码,这使得处理 AJAX 请求或其他形式的异步更新变得简单。 #### 安装 Selenium 库 为了开始使用 `Selenium` 进行爬虫开发,首先需要安装该库以及对应的 WebDriver 驱动程序: ```bash pip install selenium ``` 接着根据目标浏览器下载相应的驱动器版本,并将其路径加入系统的 PATH 中[^2]。 #### 实现一个简单的例子来获取动态加载的数据 下面展示了一个利用 `Selenium` 抓取由 JavaScript 渲染后的 HTML 页面的例子: ```python from selenium import webdriver from selenium.webdriver.common.by import By import time # 初始化 Chrome 浏览器实例 (也可以选择其他类型的浏览器) driver = webdriver.Chrome() try: # 打开指定 URL 地址的目标网站 driver.get('https://example.com') # 给予一定时间等待页面完全渲染完成 time.sleep(5) # 查找特定元素, 假设这里我们要找到 id="content" 的 div 标签内的所有 p 标签 elements = driver.find_elements(By.CSS_SELECTOR, '#content p') for element in elements: print(element.text) finally: # 关闭浏览器窗口 driver.quit() ``` 这段脚本会启动一个新的 Chrome 浏览器实例访问给定网址,在适当延迟之后读取所需的信息再关闭浏览器。注意这里的 `time.sleep()` 方法用来暂停执行一段时间让页面有足够的时间去加载所有的资源;实际应用中建议采用更优雅的方式来判断页面是否已经准备好,比如显式等待或隐式等待机制[^1]。 除了 `Selenium` 外,还有另一种较为轻量级的选择叫做 `requests-html`,它可以解析静态HTML文档的同时也能运行其中嵌入式的JavaScript片段从而达到类似的效果。不过相比之下,当涉及到复杂的交互逻辑时,还是推荐优先考虑 `Selenium` 方案因为它的稳定性和广泛的支持范围[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值