Selenium爬虫实践之爬取携程网北京旅游景点数据

昨天我发布了一篇名为Selenium在爬虫中的应用的文章,今天补充一下Selenium爬虫实践,话不多说直接上代码。

1.导包

首先导入所需要的库:

import html
import time
from lxml import html
from selenium import webdriver
from selenium.webdriver.common.by import By

 2.获取浏览器驱动

紧接着定义一个函数来获取浏览器驱动:

#获取浏览器驱动
def get_driver():
    option = webdriver.ChromeOptions()
    # 设置编码集
    option.add_argument('lang=zh_CN.UTF-8')
    driver = webdriver.Chrome(options=option)
    return driver

 3.自动登录的实现

接下来用Selenium实现自动化登录操作,这里提前把用户名和密码设置好,在网页对应的表单中通过element.send_keys("xxxxxx")方法输入用户名和密码。

这里定义一个实现自动登录操作的函数login,后续过程通过调用该函数可实现自动登录,通过find_element(By.XPATH)的方法定位到输入框,输入完账号密码后还需点击同意政策服务的选项按钮,这里的思想是一样的,操作完成后点击登录按钮即可登录。

def login(driver):
    driver.maximize_window()#最大化窗口
    #定位到登录按钮
    login_button = driver.find_element(By.XPATH, "/html/body/div[2]/div[1]/div/div/div/div/div[2]/ul/li[1]/div/button")
    login_button.click()

    username = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[2]/div[2]/div/div/div[1]/div[1]/form/dl[1]/dd/input")
    username.send_keys("用户名")
    password = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[2]/div[2]/div/div/div[1]/div[1]/form/dl[2]/dd/input")
    password.send_keys("密码")

    agree_btn = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[2]/div[2]/div/div/div[1]/div[4]/div/div[1]/label")
    agree_btn.click()

    log_btn = driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/div[2]/div[2]/div/div/div[1]/div[1]/form/dl[3]/dd/input")
    log_btn.click()

 4.数据爬取与存储

 登录成功后就开始我们的核心程序的编写,同样定义一个开始任务的函数start_task()。

通过driver.page_source的方法获取到网页信息后再用xpath进行数据解析,定义一个字典用来存储爬取到的数据,当然如果有需要可以自己定义一个存储数据的函数来将数据存储到数据库中。

这里我爬取的内容主要有四个分别是景点名称name、景区热度hotnumber、景区位置location和景点评分score,也可以根据自己需要进行增加和删除。

#元素定位与爬取数据
def start_task(driver):
    for i in range(1,5):
        #模拟下滑到底部操作
        for j in range(1,13):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(1)


        # 获取网页信息
        resp = driver.page_source
        # 加载xpath,用于数据解析
        etree = html.etree
        xml = etree.HTML(resp)
        #定义字典存储数据
        data_dict = {}
        for k in range(1,13):
            #name:景点名称
            name = xml.xpath(f'//*[@class="list_mod2"]/div[{k}]/div[2]/dl/dt/a/text()')
            if len(name) > 0:
                mess_dict['name'] = name[0]
            else:
                mess_dict['name'] = ' '

            #hotnumber:景区热度
            hotnumber = xml.xpath(f'//*[@class="list_mod2"]/div[{k}]/div[2]/dl/dt/a/b[2]/text()')
            if len(hotnumber) > 0:
                try:
                    mess_dict['hotnumber'] = float(hotnumber[0])
                except:
                    mess_dict['hotnumber'] = '0.0'
                else:
                    mess_dict['hotnumber'] = 0.0


            #location:景区位置
            location = xml.xpath(f'//*[@class="list_mod2"]/div[{k}]/div[2]/dl/dd/text()')
            if len(location) > 0:
                mess_dict['location'] = location[0]
            else:
                mess_dict['location'] = ' '


            #score:景点评分
            score = xml.xpath(f'//*[@class="list_mod2"]/div[{k}]/div[2]/ul/li/a/text()')
            if len(score) > 0:
                try:
                    mess_dict['score'] = float(score[0])
                except:
                    mess_dict['score'] = '0.0'
            else:
                mess_dict['score'] = 0.0
        #进行翻页操作
        next_page_btn = driver.find_element(By.XPATH, "/html/body/div[2]/div[2]/div[4]/div/div[2]/div/div[3]/div[12]/div/a[7]")
        next_page_btn.click()
        time.sleep(1)
    driver.quit()

 5.运行程序

 最后就是调用定义的函数了!!!

#加载浏览器驱动
driver = get_driver()
#指定url
url = "https://you.ctrip.com/sight/beijing1.html"
#进入页面
driver.get(url)
#登录
login(driver=driver)
#开始任务
start_task(driver=driver)

以上内容为Selenium在爬虫应用中通用的基本流程,可根据需求自己扩展添加。

  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会爬虫的闲鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值