Python(9):利用selenium操作网页并抓取内容

因为项目原因,需要获取中国所有铁路线路及车次信息,但是并没有任何网站或文章直接将所有信息整合在一起提供出来,因此只能自己从页面上扒。

这里利用到了python的selenium模块,自动定位操作网页,然后通过其他方式获取页面信息,以达到数据搜索整合的目的。

我使用的是pycharm工具作为环境运行代码的,直接在setting中安装就可以,各位也可以用pip命令安装,很方便,这里不赘述

安装过后需要chrome浏览器的支持,尤其需要chromedriver驱动,否则无法进行网页的打开以及自动操作

关于chrome和chromedriver的安装不是本文重点,有不理解的小伙伴可以百度搜索安装一下

这里是一个简单的小例子,也是网上可以搜到的,需要了解的是里面的操作

from selenium import webdriver
from time import sleep


if __name__ == '__main__':

    driver = webdriver.Chrome()
    driver.get("http://www.baidu.com")
    driver.maximize_window()
    driver.find_element_by_id("kw").send_keys("Python")
    sleep(3)
    driver.find_element_by_id("su").click()
    # driver.quit()

第一步指定chrom浏览器

第二步设置网址

第三步设置窗口大小,这步可以跳过,会采用默认值

第四步是选择输入栏并输入字符串‘Python’,注意,百度页面的输入框的id对应的就是‘kw’,

第五步点击‘百度一下’按钮进行搜索,同理,这里的‘百度一下’对应的id就是‘su

第四第五步尤为重要,不同的页面因为网页源码不同,每个按钮或者模块的id都基本不同,需要自己查看源码搜索

下面是我近期应用到的代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import re



if __name__ == '__main__':
    # 先设置浏览器
    chrome_options = Options()
    # chrome_options.add_argument('--headless')  # 无窗口模式
    chrome_options.add_argument('--disable-gpu')

    driver = webdriver.Chrome(chrome_options=chrome_options)

    # 进入网页
    driver.get("https://trains.ctrip.com/trainbooking/TrainSchedule/")

    # 点击按钮选择车次查询功能
    driver.find_element_by_id('ctl00_MainContentPlaceHolder_ucSearch_rbTrainNumber').click()

    typelist = ['K', 'Z', 'T', 'D', 'G']
    for type in typelist:
        for num in range(1, 9999):
            train = type + str(num)    # 组合成车次号
            # id="tn"是搜索输入框,输入车次号
            driver.find_element_by_id('tn').send_keys(train)

            # id="base_btns3"是搜索按钮,click()是模拟点击
            driver.find_element_by_class_name('base_btns3').click()

            # 获取网页渲染后的源代码
            html = driver.page_source
            # 对结果进行判断,因为输入的车次可能无效
            # 通过查询成功的页面源代码才会出现的字符串进行判断
            if html.count('hyDepartureStationName') != 0:  # 查询到了列车
                station = (re.findall('<a id="ctl00_MainContentPlaceHolder_rptStopOverStation_ctl.*?" href=".*?">(.+?)</a>', html))
                arrtime = (re.findall('\d{2}:\d{2}', html))
                print(station)
                print(arrtime)
                print(train, "查询成功")

            # 清空输入框内容
            driver.find_element_by_id('tn').clear()

代码主要实现的就是自动查询列车车次,并获取站点信息,时间信息等,由于不需要看着窗口,因此加入了Options模块进行无窗口设置,这里的代码我把注释掉了,如果有需要的可以取消注释,那么就没有窗口弹出来了。


猜你喜欢

转载自blog.csdn.net/Leo_csdn_/article/details/89018925
今日推荐