文末获取完整论文报告+源码源文件+讲解视频
摘要
信息在无论何时何地都是至关重要的。随着万维网的高速发展,信息呈现指数形式的爆炸增长。传统的信息处理延申至互联网领域时,常常需要将分布在各网站的信息下载到本地在进一步处理。然而在大量数据采集时,明显传统的方法并不适用,传统方法在网络查询信息时无法避免的一个问题就是眼花缭乱的信息让人难以辨别和舍取,为了更为高效和准确的获取想要的大量时信息,网络爬虫不失为一个绝佳的手段。通过自定的规则,可以从指定的网站挖掘相关的信息,并进行筛选后获得更为精准的信息。
本为的网络爬虫程序主要采用Python脚本语言。使用Tkinter库构造图形界面便于操作,即通过点击对应按钮触发相应功能。数据存储并没有使用SQL和NoSQL,网络爬虫爬取的结果直接以xlsx文件保存,以便于数据的读取并将数据可视化。数据分析采用matplolib库,以pandas库读取xlsx文件,读取获得的数据生成散点图或柱状图以便于观察。
关键词: 网络爬虫 ;Python ;数据挖掘 ;数据分析
1 绪论
1.1选题背景(篇幅有限,详见文末)
1.2课题研究的内容
本设计主要基于Pycharm的编程平台建设,整个系统由如下几个模块组成,具体如下:Tkinter图形界面模块,设置按钮,点击按钮触发对应功能;爬虫模块,编写爬虫文件,由Tkinter模块‘查询’按钮触发,对获取内容以xlsx保存;数据分析模块,读取对应的xlsx文件,让数据可视化,由Tkinter模块‘生成可视化图’按钮触发;反爬虫模块,用于存储多个浏览器型号和多个代理IP,当爬虫文件启动时,每次循环自动从反爬虫模块中调用函数获取随机得到浏览器型号和代理IP,本文爬取目标网站IP的封禁程度一般,因此代理IP选项被注释掉了(需要使用时将对应语句取消注释即可),即本文暂未使用代理IP。
2 开发软件平台介绍
(篇幅有限,详见文末)
3 网络爬虫总体方案
3.1 系统组成
主要由四个.py文件构成:crawl_views.py、crawl_ZL.py、data_views.py、Against_Reptilia_solve.py,分别负责图像界面、网络爬虫、数据分析、反爬虫模块。
3.2 工作原理
在爬虫界面预设目标网站的相关url,在输入不同信息时,进行不同的url拼接得到完整的相关地址进而获取相应信息,对获取的信息进行解析,从解析后的数据中获取需要的数据创建并存入对应的xlsx表格中。数据获取完毕后,用API从xlsx读取关键信息,在用API生成可视化图像(API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节[3]。)。
4模块化设计
4.1 Tkinter图形界面模块介绍
Tkinter是Python的事实上的标准GUI(图形用户界面)包。 它是Tcl / Tk顶部的薄面向对象层。Tkinter不是Python唯一的工具包。 然而,它是最常用的一种。CameronLaird将保留TkInteri的年度决定称为“Python世界的次要传统之一”。
4.1.1图形模块的略解
要创建一个图形界面,我们需要首先定义窗口:
import tkinter as tk
window = tk.Tk()
window.title('智联招聘爬虫')
window.geometry('700X500')
通过以上代码,完成对图形界面窗口的名称命名和大小设置。窗口创建完毕后,进行填充,首先添加背景:
canvans = tk.Canvas(window,height=500,width=700)
image = canvans.create_image(0,0,anchor='nw',image=tk.PhotoImage(flie='爬虫_gif.gif')
canvans.pack()
以上代码完成窗口背景设置,分别对背景图像大小和位置进行的设置,被使用的图像名称为’爬虫_gif.gif’。
为窗口添加文本框,设置文本框的名称和位置:
tk.Label(window,text="关键字:").place(x=50,y=150)
var_kwords = tk.StringVar()
为文本框设置默认值
var_kwords.set('python')
本文中运行网络爬虫后会返回显示对应查询目标行业的薪资的平均值、最大值和最小值,通过文本框的默认值显示。
4.1.2图形界面模块与其他模块的交互
图像界面提供按钮以启动对应功能。
设置按钮时需提前定义相关函数,对应按钮被点击时,则相关函数被调用。按钮的设置操作:
设置按钮名称和按钮被点击时调用的函数
btn_selection = tk.Button(window, text="查询", command=usr_selection)
设置按钮的位置:
btn_selection.place(x=400, y=150)
(篇幅有限,其余完整详见文末)
4.2 爬虫模块
4.2.1 requests库的说明及使用
本设计采用requests库来获取网页的请求信息。
requests库并非Python的原生库,使用时先在终端输入import requests检查是否安装该库,如无报错则已安装,报错则需要安装或者重新安装,在终端输入指令可快速按装,指令:pip install requests。需要注意的是,在Windows环境下,权限不足经常导致无法安装各种库,在Windows界面使用小娜助手搜索cmd,右键点击cmd,以管理员权限运行cmd进行库的安装操作可解决此类问题。
requests库的常规使用:
获取url地址后,根据目标网站的请求类型选择对应的请求,用变量接收获取的请求信息,代码如下:
r=requests.get(url,params=params,headers=headers,timeout=10),其中get表示当前请求类型为get,params为详细的请求信息,headers为浏览器型号信息,timeout为超时函数。超时函数用于检测当前爬取的目标网站是否拒绝本机的访问,如拒绝访问,在10秒后会报错。
r接收的信息即为当前页面的源代码,通过解析可以获得有效信息。
4.2.2 bs4库的说明及使用
Beautfiful Soup简称bs4,是编写Python爬虫常用库之一,主要用来解析HTML标签,它可以将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象。安装和检查方法与requests一致。
通常情况下,使用requests模块获取的网页源代码(HTML)都是从头显示都尾的,毫无结构可言,看起来杂乱无章,处理起来较为复杂,使用bs4解析后,得到的HTML代码则结构分明,易于信息筛选。打个比方,将图书馆比作HTML,将分类放置比作bs4,图书馆的书都是分类放置排列的,寻找书籍只需要按照分类和编号即可快速寻找到,而如果图书馆的书放置的非常杂乱那寻找起来就得耗费许些时间了。
bs4的使用较为简单,用变量接收由bs4处理过的HTML代码即可,操作代码:
soup = BeautifulSoup(r.text,‘lxml’),其中r.text,r代表requests请求获取的网页源代码,text表示解析后的文件格式,lxml表示获取所有的lxml相关信息。使用bs4时,字符的编码要求为utf-8,因此一般需要先将r进行编码的变更,代码如下:
r.encoding = ‘utf-8’
4.2.3 json模块的说明及使用
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于ECMAScrip。Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:
json.dumps(): 对数据进行编码,将Python对象编码成JSON字符串。
json.loads(): 对数据进行解码,返回Python字段的数据类型。
在json的编解码过程中,python 的原始类型与json类型会相互转换,具体的转化对照如下[4]:
在常规的信息筛选中,re、xpath很多时候并不适用,使用json解析可以将信息转换为类似于字典中的键值对,对信息的选取便利得多。以下用两种图来展示是否使用Json解析的区别:
(篇幅有限,其余完整详见文末)
4.2.4爬虫模块的流程解析
下面介绍下网络爬虫的常规步骤,首位我们拿到需求时,对对应网站进行分析。我们打开对应的网站,查看其源代码,对源代码进行快速浏览,必要时自己写个函数检查想要的数据是否在当前网页的源代码中,如果检查结果不存在,则为Ajax异步加载,需要使用开发者工具,如不使用Ajax异步加载则可使用网页源代码。除了Ajax异步加载的问题外,还有加密等措施,需要阅读css、jss、jQuery进行反编译。此外还需要注意请求信息的完整性,许多网站会对请求进行检测,如果少了必要的信息,则被视为网络爬虫,不予返回正确的页面或正确的信息,甚至被禁止访问。
本设计使用google浏览器,爬虫目标为智联招聘。使用时先打开智联招聘首页,然后随便点击一个行业进入下一个界面,这里以Java开发为例。进入Java开发这一这样的招聘信息行业后,点击右键,出现一个选择框,点击最下面的检查进入开发者模式。由于智联网站使用Ajax异步加载,直接从网页源代码无法获取需求的信息,这时候就需要观察当前网站的请求信息。开发这模式下,在该工具的顶部可以看到Network的选项,刷新页面再次获得请求信息,异步加载的信息都在XHR中,直接点击XHR获取所有的异步加载的信息,见图1.7。
(篇幅有限,其余完整详见文末)
4.3 数据分析模块
4.4 反爬虫模块
5 实验结论与发展前景
本设计实现了Tkinter图形界面的实现、网络爬虫的数据抓取、matplolib的数据分析。
5.1网络爬虫主要实现代码
url="https://fe-api.zhaopin.com/c/i/sou"
params={ #参数
'start': '90',
'pageSize': '90',
'cityId': '489',
'workExperience': '-1',
'education': '-1',
'companyType': '-1',
'employmentType': '-1',
'jobWelfareTag': '-1',
'kw': 'python',
'kt': '3',
}
r=requests.get(url,params=params,headers=headers,timeout=10)
r.encoding='utf-8'
js=json.loads(r.text)
for i in js['data']['results']:
idd=i['number'] #id
title=i['jobName'] #职位名称
salary=i['salary'] #工资
updateDate=i['updateDate'] #更新时间
place=i['city']['display'] #工作地点
company=i['company']['name'] #公司名称
recruitCount=i['recruitCount'] #需求人数
eduLevel=i['eduLevel']['name'] #学历
workingExp=i['workingExp']['name']
data=[title,salary,updateDate,place,company,recruitCount,eduLevel,workingExp,zhize] self.df=self.df.append(Series(data,index=self.columns),ignore_index=True)
self.df.to_excel("%s.xlsx" % self.word)#保存数据
本设计涉及多方知识,较为复杂。首先爬虫目标网站的分析是一个较大的工程量,网络爬虫不同于其他软件编程,网络爬虫常常花费大量时间在网站分析上,因此代码量就显得不那么大。其次tkinter模块都是先学先用的,花费了不少时间查找资料和编写图形界面。pandas和matplolib曾经涉猎过,用起来不那么费劲,但是由于C语言底层代码的问题还是让我的Python逻辑出现了随机触发的问题,偶尔会出现错误,这个错误并非代码的错误,每个编程语言都有自己的缺陷,我们可以把它归类为缺陷部分。通过本次设计,我的代码编程能力有一定程度的提升,在编写过程中遇到的Bug也使得我有了更多的处理经验和方法。