python3 简单爬虫实战|使用selenium来模拟浏览器抓取选股宝网站信息里面的股票
对爬虫的简单介绍
1. 什么是爬虫?
请求页面并提取数据的自动化过程。
2. 爬虫的基本流程
(1) 发起请求:通过url向服务器发起request请求,请求可以包含额外的header信息。 (2)获取响应内容:如果服务器正常响应,那我们将会收到一个response,response即为我们所请求的网页内容,或许包含HTML,Json字符串或者二进制的数据(视频、图片)等。 (3) 解析内容:如果是HTML代码,则可以使用网页解析器进行解析,如果是Json数据,则可以转换成Json对象进行解析,如果是二进制的数据,则可以保存到文件进行进一步处理。 (4)保存数据:可以保存到本地文件,也可以保存到数据库(MySQL,Redis,Mongodb等)
3. request请求包含什么?
1) 请求方式:最常用的请求方式包括get请求和post请求。post请求在开发中最常见的是通过表单进行提交,从用户角度来讲,最常见的就是登录验证。当你需要输入一些信息进行登录的时候,这次请求即为post请求。2) url统一资源定位符:一个网址,一张图片,一个视频等都可以用url去定义。3) request headers:请求头,包括这次请求的请求类型,cookie信息以及浏览器类型等。这个请求头在我们进行网页抓取的时候还是有些作用的,服务器会通过解析请求头来进行信息的审核,判断这次请求是一次合法的请求。所以当我们通过程序伪装浏览器进行请求的时候,就可以设置一下请求头的信息。4) 请求体:post请求会把用户信息包装在form-data里面进行提交,因此相比于get请求,post请求的Headers标签的内容会多出Form Data这个信息包。get请求可以简单的理解为普通的搜索回车,信息将会以?间隔添加在url的后面。
4. response包含什么
1) 响应状态:通过Headers中的General可以看到status code。
status code=200表示成功,301跳转,404找不到网页,502服务器错误等。
2) 响应头:包括了内容的类型,cookie信息等。
3) 请响应体:求的目的就是为了得到响应体,包括html代码,Json以及二进制数据等。
此次爬虫实战使用到的库(确认电脑是否已安装以下库)
1.selenium (浏览器自动化测试框架需要我们下载)selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。该库需要我们下载,
下载操作如下:
1、在配置好python3 pip环境变量的情况下使用快捷键 WIN+R 输入cmd 后输入pip install selenium
2、
进入Scripts 文件夹 按着 Shift 加右键点击 Powershell 再输入pip install selenium 后面需要的库的下载也是同样的操作
2、lxml (需要我们下载)3、 pyquery(下载pyquery之前应该先下载lxml 否则下载失败) PyQuery库也是一个非常强大又灵活的网页解析库; 我们使用PyQuery来解析html。4、 json(需要我们下载)5、re (不需要我们下载)6、time(不需要我们下载)
除此之外安装chromeDriver驱动浏览器:(注意你浏览器的版本!!!)
由于Selenium可以操作各种浏览器进行测试,所以在使用之前我们需要在电脑上安装对应的浏览器。
【1】Chrome浏览器的驱动chromedriver 【2】Firefox浏览器的驱动geckodriver 【3】IE浏览器的驱动IEdriver 在这个项目中,我们使用Chrome浏览器作为自动化测试的浏览器。
(小伙伴们根据实际情况选择相应的浏览器驱动) 下载好后, 将可执行文件放到python安装目录下的Scripts文件夹中;
测试是否已经安装好,在python命令行中输入:
(如果弹出浏览器,说明执行成功)
from selenium import webdriver browser = webdriver.Chrome() browser.get("http://www.baidu.com")
实战开始
目标:通过网站新闻标题是利好还是利空获取与该新闻有关的股票
打开浏览器进入选股包页面,鼠标右键点击检查,使我们能够看到要抓取的数据的html代码以便我们写正则表达式与页面代码匹配,抓取我们想要的内容,通过分析可知网站的每一则新闻都是一块的
因此我们获得了网页的源代码后可以先获取一块一块新闻代码,再从该块代码获取是否有利好或者利空的消息,若有再获取新闻里面的股票
代码:
#coding=utf-8 from selenium import webdriver import time import re from pyquery import PyQuery as pq import json def openurl(url,num):#url 是网站的地址 num是要爬取股票的个数 browser = webdriver.Chrome()#打开Chrome浏览器 browser.get(url)#浏览器进入该url网站 html=browser.page_source#获取网站的代码 data=str(pq(html)) #将获取到的网页代码转换成字符串格式 dic={} re_rule=r'<div class="news-item-container">(.*?)<div data-v-00b2e9bc=""/>' #用于匹配网页代码的新闻模块 datalist=re.findall(re_rule,data,re.S) for i in range(0,len(datalist)): rule1=r'<img src="/img/icon-lihao.png" data-v-6c26747a=""/>(.*?)<!----></span>'#用于匹配该新闻是否有利好消息 bullish = re.findall(rule1,datalist[i],re.S) if(len(bullish)==0): rule0=r'<img src="/img/icon-likong.png" data-v-6c26747a=""/>(.*?)</span>'#用于匹配该新闻是否有利空消息 bullish = re.findall(rule0, datalist[i], re.S) rule2=r'<span class="stock-group-item-name" data-v-f97d9694="">(.*?)</span>'#用于匹配该新闻是否有股票的消息 stock_name=re.findall(rule2,datalist[i], re.S) if len(stock_name) > 0 and len( bullish) > 0: #如果该新闻有利好或者利空消息且有股票的消息则存入字典dic中 for c in range(0,len(stock_name)): dic[stock_name[c]]= bullish[0] c=len(datalist) if len(dic) < (num+1): while(1): browser.find_element_by_class_name("home-news-footer").click()#浏览器点击加载更多 time.sleep(1)#由于点击之后要等待页面加载所以需要等待时间 如果网速快、电脑运行快则可以省去 html=browser.page_source data=str(pq(html)) datalist=re.findall(re_rule,data,re.S) for i in range(c,len(datalist)): rule3=r'<img data-v-6c26747a="" src="/img/icon-lihao.png"/>(.*?)<!----></span>' #由于点击加载出来的数据代码有改变 所以正则表达式也要改变 判断利好消息 bullish = re.findall(rule3,datalist[i],re.S) if (len(bullish)==0): rule0=r'<img data-v-6c26747a="" src="/img/icon-likong.png"/>(.*?)</span>' # 由于点击加载出来的数据代码有改变 所以正则表达式也要改变 判断利空消息 bullish = re.findall(rule0,datalist[i],re.S) rule4=r'<span data-v-f97d9694="" class="stock-group-item-name">(.*?)</span>' # 由于点击加载出来的数据代码有改变 所以正则表达式也要改变 判断股票信息 stock_name=re.findall(rule4,datalist[i], re.S) if len(stock_name) > 0 and len( bullish) > 0: for c in range(0,len(stock_name)): dic[stock_name[c]]= bullish[0] c=len(datalist) if len(dic) > num: browser.quit() print("爬取完毕!!") break print("正在爬取第",len(dic)+1,"个请稍等.....") return dic def write_to_file(content): with open('result.txt','a',encoding='utf-8') as f: # encoding='utf-8' ensure_ascii=False 这样能让文件里面显示的是中文 f.write(json.dumps(content, ensure_ascii=False)+'\n') f.close() def main(): url = 'https://www.xuangubao.cn/' dict = openurl(url, 5) print(dict) write_to_file(dict) if __name__=='__main__': main()
运行结果:
阅读更多
- Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
- Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
- Python爬虫实战03:用Selenium模拟浏览器爬取淘宝美食
- python3 [爬虫实战] 微博爬虫京东客服之Selenium + Chrom浏览器的使用(上)
- 浅谈python爬虫使用Selenium模拟浏览器行为
- Python爬虫实战一之使用Beautiful Soup抓取百度招聘信息并存储excel文件
- python3.x爬虫实战:阿里巴巴网站定向信息抓取
- [Python爬虫] 之二十六:Selenium +phantomjs 利用 pyquery抓取智能电视网站图片信息
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
- Python爬虫入门实战七:使用Selenium--以抓取QQ空间好友说说为例
- Python利用selenium模拟浏览器抓取异步加载等难爬页面信息
- python3 [爬虫入门实战] 爬虫之selenium 模拟QQ登陆抓取好友说说内容(暂留)
- 使用Selenium模拟浏览器抓取淘宝商品美食信息
- 使用python利器selenium工具模拟浏览器运行并爬取淘宝商品信息
- Python爬虫之selenium爬虫,模拟浏览器爬取天猫信息
- python爬虫:使用Selenium模拟浏览器行为
- 【python日常一】使用python抓取拉勾网职位信息并做简单统计分析
- python 爬虫实战 抓取学校bbs相关板块的发帖信息
- Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
- 使用Selenium模拟浏览器登录,并获取页面信息