一、准备工作
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运行的结果: