对爬虫的简单介绍
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 webdriverbrowser = webdriver.Chrome()browser.get("")
实战开始
目标:通过网站新闻标题是利好还是利空获取与该新闻有关的股票
打开浏览器进入选股包页面,鼠标右键点击检查,使我们能够看到要抓取的数据的html代码以便我们写正则表达式与页面代码匹配,抓取我们想要的内容,通过分析可知网站的每一则新闻都是一块的
因此我们获得了网页的源代码后可以先获取一块一块新闻代码,再从该块代码获取是否有利好或者利空的消息,若有再获取新闻里面的股票
代码:
#coding=utf-8from selenium import webdriverimport timeimport refrom pyquery import PyQuery as pqimport jsondef 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_sourcedata=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 dicdef 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 = '/' dict = openurl(url, 5)print(dict)write_to_file(dict)if __name__=='__main__':main()