用BeautifulSoup + selenium 写简单的爬虫编程

我们以抓取选股宝网页里面的利好以及利空对应的股票名称为例子

1、创建项目

        打开PyCharm



2、新建py文件



3、编程

    3.1 创建文件函数

# 创建文件函数 (文件路径,文件名)
def establish_file(file_path, file_name):
    # 文件路径
    path = file_path + file_name
    # 判断文件是否存在
    if os.path.exists(path):
        print(file_name + "文件已存在,正在删除...")
        # 删除原有文件
        os.remove(path)
        print("原有文件已经删除,正在重新创建文件...")
    # 创建文件(文件路径,打开方式'w'只写,编码格式)
    f = io.open(path, 'w', encoding='utf-8')
    # 关闭文件
    f.close()
    print("文件创建成功!")

    3.2 数据写入文件

# 将获取数据写入文件中(文件路径,文件名,数据)
def write_data(file_path, file_name, data):
    # 文件路径
    path = file_path + file_name
    # 打开创建文件(文件路径,打开方式'a'追加,编码格式)
    f = io.open(path, 'a', encoding='utf-8')
    print("正在写入" + file_name + "...")
    # 数据写入文件
    f.write(data)
    print("写入成功")
    # 关闭文件
    f.close()

    3.3 爬虫函数

        3.3.1 爬虫自动打开Chrome浏览器,并多次点击加载更多

            话不多说,代码伺候

    Chrome_driver = webdriver.Chrome()     # 打开浏览器
    Chrome_driver.maximize_window()        # 最大化浏览器
    Chrome_driver.get(url)                 # 打开选股宝网站
    for i in range(0, n):                  # n次点击加载更多
        Chrome_driver.find_element_by_class_name("home-news-footer").click()  # 点击加载更多
        time.sleep(2)                      # 延时两秒
    html = Chrome_driver.page_source       # 获取网页源代码
    bsoup = BeautifulSoup(html, "lxml")    # 使用BeautifulSoup创建html代码的BeautifulSoup实例
    Chrome_driver.close()                  # 关闭浏览器

为什么要点击加载更多呢?因为如果没点击的话,网页显示的数据太少,如果只是获取这么少量的数据,那爬虫就失去它存在的意义了,爬虫就是为了代替人,去获取海量数据而存在的一个工具。

为什么要延时两秒呢?因为如果你没延时两秒的话,你点击加载更多的速度就很快了喔,因为是以计算机的运算速度以及你当前网速的综合速度去点击加载更多的,而选股宝这个网站检测到你点击速度过快,它会停止你的访问,因为它已经检测到异常了。因此我们加上延时就能解决这个问题。

当你写的爬虫越来越复杂的时候,它也就越来越牛逼了,等你境界到了,甚至可以爬到你意想不到的东西哟~

        3.3.2 打开Chrome浏览器,进行所需内容在网页代码中的分析

            效果如下:


        3.3.3 获取所需内容的实例

           鼠标移至网页代码中的<ul class="home-news-container" data-v-6e961e75="">,可以观察到左边窗口蓝色区域是包含了我们要的内容的最小区域,它是由每一个标题及其内容组成的,而我们要的只是标题后面的标签,以及下方股票的名字而已,看图:


    # 获取每一个标题对象
    informations = bsoup.find("ul", class_="home-news-container").findAll("li")

这句代码,就将ul中class叫"home-news-container"中的每一个“li”实例取出,并返回一个存放实例的列表。

            3.3.4 获取利好、利空对应的股票名称,并写入文件中

                依然从Chrome浏览器来分析,定位你想要的内容在网页代码中的位置的方法如下图:


                定位我们要爬取的数据,以及获得需要的参数


                    爬取过程的代码如下:

    # 循环判断获取每一个标题对象中的利好、利空标题对象
    for information in informations:
        # 获取利好标签
        label = information.find("span", class_="bullish-and-bear bullish")
        # 判断标签是否为空
        if label is not None:
            # 获取当前标题对象中每一个利好股票对象
            shares = information.findAll("li", class_="stock-group-item")
            # 循环获取每一个股票对象的信息
            for share in shares:
                # 获取当前股票对象中的股票名称
                share_name = share.find("span", "stock-group-item-name").get_text()
                # 获取当前股票对象中的股票涨幅
                share_number = share.find("span", "stock-group-item-rate").get_text()
                # 将股票名称和股票涨幅整合为一条股票数据
                share_data = share_name + " " + share_number + "\n"
                # 将这一条股票数据写入利好股票名单中
                write_data(file_path, file_name_bullish, share_data)
        else:
            # 获取利空标签
            label = information.find("span", class_="bullish-and-bear bear")
            # 判断标签是否为空
            if label is not None:
                # 获取当前标题对象中每一个利空股票对象
                shares = information.findAll("li", class_="stock-group-item")
                # 循环获取每一个股票对象的信息
                for share in shares:
                    # 获取当前股票对象中的股票名称
                    share_name = share.find("span", "stock-group-item-name").get_text()
                    # 获取当前股票对象中的股票跌幅
                    share_number = share.find("span", "stock-group-item-rate").get_text()
                    # 将股票名称和股票跌幅整合为一条股票数据
                    share_data = share_name + " " + share_number + "\n"
                    # 将这一条股票数据写入利好股票名单中
                    write_data(file_path, file_name_bear, share_data)
以上代码中的方法如果不清楚是如何使用,可以自己重新写一个测试代码,或者网上一搜,也是很多人在解释的。

    3.4 主函数

        主函数就是调用以上那些函数,也就是程序入口。

# 主函数
if __name__ == "__main__":
    # 设置将要爬取的网站的网址
    url = "https://xuangubao.cn/"
    # 设置文件存放路径
    file_path = "C:\\Users\\XXW\\Desktop\\Python工程\\"
    # 创建存放利好股票以及利空股票的两个文件
    establish_file(file_path, "利好股票名单.txt")
    establish_file(file_path, "利空股票名单.txt")
    # 运行爬虫
    reptilian(url, 100, file_path,"利好股票名单.txt","利空股票名单.txt")

以上是代码分析,我们的爬虫也就此写出来,以下是整个爬虫的代码:

from selenium import webdriver
from bs4 import BeautifulSoup
import os
import io
import time


# 创建文件函数 (文件存放路径,文件名)
def establish_file(file_path, file_name):
    # 文件路径
    path = file_path + file_name
    # 判断文件是否存在
    if os.path.exists(path):
        print(file_name + "文件已存在,正在删除...")
        # 删除原有文件
        os.remove(path)
        print("原有文件已经删除,正在重新创建文件...")
    # 打开创建文件(文件路径,打开方式'w'只写,编码格式)
    f = io.open(path, 'w', encoding='utf-8')
    # 关闭文件
    f.close()
    print("文件创建成功!")


# 将获取数据写入文件中(文件存放路径,文件名,数据)
def write_data(file_path, file_name, data):
    # 文件路径
    path = file_path + file_name
    # 打开创建文件(文件路径,打开方式'a'追加,编码格式)
    f = io.open(path, 'a', encoding='utf-8')
    print("正在写入" + file_name + "...")
    # 数据写入文件
    f.write(data)
    print("写入成功")
    # 关闭文件
    f.close()


# 爬虫函数(选股宝网址,点击n次加载更多,文件存放路径,利好文件名,利空文件名)
def reptilian(url,n,file_path,file_name_bullish,file_name_bear):
    Chrome_driver = webdriver.Chrome()     # 打开浏览器
    Chrome_driver.maximize_window()        # 最大化浏览器
    Chrome_driver.get(url)                 # 打开选股宝网站
    for i in range(0, n):                  # n次点击加载更多
        Chrome_driver.find_element_by_class_name("home-news-footer").click()  # 点击加载更多
        time.sleep(2)                      # 延时两秒
    html = Chrome_driver.page_source       # 获取网页源代码
    bsoup = BeautifulSoup(html, "lxml")    # 使用BeautifulSoup创建html代码的BeautifulSoup实例
    Chrome_driver.close()                  # 关闭浏览器
    # 获取每一个标题对象
    informations = bsoup.find("ul", class_="home-news-container").findAll("li")
    # 循环判断获取每一个标题对象中的利好、利空标题对象
    for information in informations:
        # 获取利好标签
        label = information.find("span", class_="bullish-and-bear bullish")
        # 判断标签是否为空
        if label is not None:
            # 获取当前标题对象中每一个利好股票对象
            shares = information.findAll("li", class_="stock-group-item")
            # 循环获取每一个股票对象的信息
            for share in shares:
                # 获取当前股票对象中的股票名称
                share_name = share.find("span", "stock-group-item-name").get_text()
                # 获取当前股票对象中的股票涨幅
                share_number = share.find("span", "stock-group-item-rate").get_text()
                # 将股票名称和股票涨幅整合为一条股票数据
                share_data = share_name + " " + share_number + "\n"
                # 将这一条股票数据写入利好股票名单中
                write_data(file_path, file_name_bullish, share_data)
        else:
            # 获取利空标签
            label = information.find("span", class_="bullish-and-bear bear")
            # 判断标签是否为空
            if label is not None:
                # 获取当前标题对象中每一个利空股票对象
                shares = information.findAll("li", class_="stock-group-item")
                # 循环获取每一个股票对象的信息
                for share in shares:
                    # 获取当前股票对象中的股票名称
                    share_name = share.find("span", "stock-group-item-name").get_text()
                    # 获取当前股票对象中的股票跌幅
                    share_number = share.find("span", "stock-group-item-rate").get_text()
                    # 将股票名称和股票跌幅整合为一条股票数据
                    share_data = share_name + " " + share_number + "\n"
                    # 将这一条股票数据写入利好股票名单中
                    write_data(file_path, file_name_bear, share_data)


# 主函数
if __name__ == "__main__":
    # 设置将要爬取的网站的网址
    url = "https://xuangubao.cn/"
    # 设置文件存放路径
    file_path = "C:\\Users\\XXW\\Desktop\\Python工程\\"
    # 创建存放利好股票以及利空股票的两个文件
    establish_file(file_path, "利好股票名单.txt")
    establish_file(file_path, "利空股票名单.txt")
    # 运行爬虫
    reptilian(url, 100, file_path,"利好股票名单.txt","利空股票名单.txt")

为什么不写成一个函数就好呢?弄这么花里胡哨的干嘛?

        相信敲过一定量代码的人都知道,封装成函数能提高你的代码的移植性(简单来说就是复制到别的项目里运用,还有更牛逼的封装手段做成头文件,这里不就不介绍了),而且后期对工程项目的修改也是很有好处的,一个敲代码很优秀的人,他一定掌握了很牛逼的封装技术,其实也是基本功。话有点多了,来吧,运行我们的爬虫试试!!!

4、运行爬虫

运行效果如下:


看利好股票名单:


看利空股票名单:


完美!!!这就是我们要的效果。至此,你会不会觉得爬虫很好玩?这只是最简单的,还有爬取图片、爬取视频这些骚操作呢!

由于小编也是初学者,若以上讲解有误的地方,欢迎大家指正,谢谢~

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值