您的位置:首页 > 编程语言 > Python开发

python3 简单爬虫实战|使用selenium来模拟浏览器抓取选股宝网站信息里面的股票

2018-06-27 08:05 816 查看

对爬虫的简单介绍

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()


运行结果:




阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐