python + selenium + BeautifulSoup 爬股票信息

一、准备工作

1.安装python

我在这里装的是python3.6,具体的方法,在这就不一一详细说了,你们可以参考该文章:

https://blog.csdn.net/nerissa_lou/article/details/78300839

记得下载后设置path环境变量,然后Windows命令行就可以调用了


2.安装pycharm

有些朋友喜欢用pycharm也可以选择安装,同样可以参考该篇文章:

http://www.jianshu.com/p/042324342bf4

ps:以上两个编译环境,你可以只装一个(相信学习过编程的朋友都知道那个方便,个人喜爱吧)


3.安装selnium

Python3.x安装后就默认就会有pip(pip.exe默认在python的Scripts路径下),使用pip安装selenium:

pip install selenium

ps:记得要联网安装

 4.安装BeautifulSoup

(1)下载官方安装包:BeautifulSoup

下载网站:https://www.crummy.com/software/BeautifulSoup/bs4/download/4.4/

(2)安装BeautifulSoup

下载完成后,一般都会解压到了Python的安装下面,然后打开cmd,用cd命令进入到BeautifulSoup的解压包目录下
运行以下安装指令:

python setup.py build

python setup.py install


5.下载chromedriver.exe

下载的chromedriver要与chrome的版本对应,这个很重要,可以参考:

https://blog.csdn.net/huilan_same/article/details/51896672

下载网站:http://npm.taobao.org/mirrors/chromedriver/

下载后解压,然后配置环境变量

ps:你也可以用别的浏览器:Firefor 或者 IE


到此我们的准备工作就已经完成了,下面就开始我们的编程了


二、编写代码

过程分为:

1.创建一个文件夹以及文件,用来存放数据

2.打开浏览器,加载多个页面

3.查找需要的内容,并写入文件中


ps:在这里我会重点解析我所遇到的问题以及解决的方法


# 创建文件
def establish_papers(file_path, file_name):
	path = file_path + file_name
	if os.path.exists(path):
		print("文件已经存在,不再创建")
	else:
		f = io.open(path, 'w', encoding='utf-8')
		f.close()
		print("文件创建成功")

这里要说的是文件的编码格式,一开始,我使用了:f = io.open(path, 'w'),发现最终写入文件中的中文会乱码,最后改为f = io.open(path, 'w', encoding='utf-8')就解决了


# 网站
url = "https://www.xuangubao.cn"
# 打开浏览器
browser = webdriver.Chrome()
# 打开url对应的网页
browser.get(url)
# 获取网页的源代码
html = browser.page_source
# 使用BeautifulSoup创建html代码的BeautifulSoup实例,存为soup
soup = BeautifulSoup(html, "lxml")
# 关闭浏览器
browser.close()

刚开始的后,我运行soup = BeautifulSoup(html, "lxml")会出错,是因为我没有安装Ixml,安装命令:pip install lxml

如果没有成功,可以将原来"lxml"的改为:"html.parser"或者 "html5lib"

如果运行该代码出现以下错误,就是下载的chromedriver要与chrome的版本不对应



接下来我们一起学习如何加载多个页面:

直接上代码了

# 找到底部加载
target = browser.find_element_by_xpath("//*[@class='home-news-footer']")
js = "var q=document.documentElement.scrollTop=100000"
# 加载count个页面
for i in range(count):
    browser.execute_script(js)
    time.sleep(5)
    target.click()
    time.sleep(3)
    browser.execute_script(js)
# 等待5秒钟
time.sleep(5)

通过上面的代码,我们就可以获取多个页面的源代码了,接下来就可以,获取我们想要的内容了

进入网站:https://www.xuangubao.cn/(谷歌浏览器打开,然后按F12,就可以查看网页的源代码了)

我要爬的内容如下图所示:


该过程分为两步

1、先找出所有的新闻


contents = soup.find("ul", class_="home-news-container").findAll("li")

2、contents是一个列表,我们只需要提取利好的新闻就行了,然后再抓取我们需要信息


for content in contents:
    comment = content.find("span", class_="bullish-and-bear bullish")
    if(comment != None):
        comments = content.findAll("li", class_="stock-group-item")
        for comment in comments:
            name = comment.find("span", "stock-group-item-name").get_text()
            number = comment.find("span", "stock-group-item-rate").get_text()
            data = name + " " + number + "\n"

最后就可以将data写入文件中了

write_data(file_path, file_name, data)

到这里就大功告成了,最后是我写的完整的代码:

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

# 创建文件夹
def establish_file(file_path):
    if os.path.exists(file_path):
        print("文件夹已经存在,不再创建")
    else:
        os.mkdir("file_path")
        print("文件夹创建成功")

# 创建文件
def establish_papers(file_path, file_name):
    path = file_path + file_name
    if os.path.exists(path):
        print("文件已经存在,不再创建")
    else:
        f = io.open(path, 'w', encoding='utf-8')
        f.close()
        print("文件创建成功")

# 打开浏览器,加载count个页面,使用BeautifulSoup创建html代码的BeautifulSoup实例,存为soup
def get_soup(url, count):
    # 打开浏览器
    browser = webdriver.Chrome()
    # 打开url对应的网页
    browser.get(url)
    # 找到底部加载
    target = browser.find_element_by_xpath("//*[@class='home-news-footer']")
    js = "var q=document.documentElement.scrollTop=100000"
    # 加载count个页面
    for i in range(count):
        browser.execute_script(js)
        time.sleep(5)
        target.click()
        time.sleep(3)
        browser.execute_script(js)
    # 等待5秒钟
    time.sleep(5)
    # 获取网页的源代码
    html = browser.page_source
    # 使用BeautifulSoup创建html代码的BeautifulSoup实例,存为soup
    soup = BeautifulSoup(html, "lxml")
    # 关闭浏览器
    browser.close()
    # 返回soup
    return soup

# 查找需要的内容,并写入文件中
def get_write_data(soup):
    contents = soup.find("ul", class_="home-news-container").findAll("li")
    for content in contents:
        comment = content.find("span", class_="bullish-and-bear bullish")
        if(comment != None):
            comments = content.findAll("li", class_="stock-group-item")
            for comment in comments:
                name = comment.find("span", "stock-group-item-name").get_text()
                number = comment.find("span", "stock-group-item-rate").get_text()
                data = name + " " + number + "\n"
                write_data(file_path, file_name, data)

# 将data写入文件中
def write_data(file_path, file_name, data):
    path = file_path + file_name
    f = io.open(path, 'a', encoding='utf-8')
    print("正在写入...")
    f.write(data)
    print("写入成功")
    f.close()

# 主函数
if __name__ == "__main__":
    # 设置目标url
    url = "https://www.xuangubao.cn/"
    # 文件夹路径
    file_path = "D:\\python_Reptilian\\"
    # 文件名
    file_name = "demo.txt"

    # 创建一个文件夹
    establish_file(file_path)
    # 创建一个文件
    establish_papers(file_path, file_name)
    # 打开浏览器,加载count个页面,返回soup
    soup = get_soup(url, 5)
    # 查找需要的内容,并写入文件中
    get_write_data(soup)

利用pycharm运行的结果:

吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头吐舌头

猜你喜欢

转载自blog.csdn.net/weixin_37895246/article/details/80723658