彭智鑫
(湖南城市学院 湖南 益阳 413002)
通用搜索引擎已成为人们定位所需Web资源的利器,然而随着Web技术的发展和人们对通用搜索引擎需求的精细化,通用搜索引擎已越来越不能满足人们日常的搜索需要。当我们需要查询一类特定的信息时,通用性搜索引擎并不能将信息进行集中化处理和展示,无法让我们直观的看到我们所需要的信息,利用网络爬虫用户能快速精准的对互联网中的海量数据进行提取和保存。通过定制爬虫来实现我们对特定信息的搜索,自行设计要获取的信息内容和特定的搜索范围,能让我们更加精确地获取到信息。网络爬虫的优势在于不需要用户轮班值守,能自动化运行,自动判断网页数据的状态,及时更新[1]。
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。网络爬虫按照系统结构和实现技术大致可以分为以下几种类型:
(1)通用型网络爬虫。此类爬虫主要应用于搜索引擎,爬行范围和数量巨大,对于爬行速度和存储空间要求较高,具有较强的应用价值。
(2)聚焦型网络爬虫。选择性地爬行预先定义好的需求信息,极大地节省了硬件和网络资源,满足特定人员的特定需求。
(3)增量型网络爬虫。只在产生新的页面或者页面发生变化时才会进行爬行工作,有效减少数据下载量,减小时间和空间上的耗费。
(4)深度网络爬虫。需要注册登录或是提交相应表单才能获取web页面爬行数据[2]。
正则表达式是由一系列特殊字符和普通字符组成的字符集合,其中每个特殊字符都被称为元字符,这些元字符并不表示它们字面上的含义,而会被解释为一些特定的含义。正则表达式语法简单,功能强大,在日常的文本匹配、替换、解析中有很大的作用,掌握正则表达式的基本语法和用法,能大大提高了处理字符串和文本的效率。
Python是高效率的完全面向对象的语言,能有效而简单地实现面向对象编程。它的解释性语言的本质,再加上其简洁的语法和对动态输入的支持,使得它在大多数操作系统平台上都是一个较为理想的脚本语言,特别适用于快速的应用程序开发。Python提供了针对网络协议的标准库,能简单高效地实现网页抓取、网页解析、数据存储等功能,使程序员就可以集中精力处理程序逻辑。
本案例通过Python语言进行设计,采用深度网络爬虫和聚焦型网络爬虫相结合的程序,以本地某手机渠道商网站为例,通过网络爬虫对该网站的手机报价进行爬行,将提取到的数据保存到数据库便于后续开发研究工作。本爬虫主要的流程为访问目标网页、网页解析、数据保存等,主要引用的第三方库有requests、pytesseract、MySQLdb。
爬虫系统运行时,首要工作是访问指定的URL,对当前页面进行抓取。Python官方支持的基础模块中的urllib2库,能完成网页请求,cookie验证,代理等功能;但是基于urllib库开发的requests第三方库,使用起来更加人性化和简洁。
深度网络爬虫需要注册登录或是提交相应表单才能获取web页面爬行数据。它首先需要解决登录的安全控件问题和验证码问题,才能根据请求方式,进行登录[3]。
(1)安全控件问题
通过对原网页的分析,想要获取相关的报价数据,需要登录该网页的账号才能看到相关的信息,所以模拟人为的登录成为了爬虫设计的关键性步骤。原网页在登录过程中需要安装相关安全控件才能进行登录操作,但是通过手机端登录,进入移动端网页是不要安装安全控件的。通过模拟手机端的UA标识,让服务器判定为来自手机的访问请求,从而达到绕过安全控件进行登录。
#模拟手机端UA标识
headers={
'User-Agent':'Mozilla/5.0(iPhone;CPUiPhoneOS9_1likeMacOSX)AppleWebKit/601.1.46(KHTML,likeGecko)Ver sion/9.0Mobile/13B143Safari/601.1'
(2)验证码问题
为了保证网站的安全性,在登录过程中加入了验证码,通过对验证码的分析,发现大多数网页的验证码为简易数字,通过OCR软件一样能进行很准确的识别,谷歌的Tesseract-OCR对Python有很好的兼容性,可以安装pytesseract第三方库进行调用完成验证码的识别,完全符合爬虫模拟登录的需求。
#打开保存的验证码图片
image=Image.open("code.jpg")
#调用pytesseract进行验证码识别
code=pytesseract.image_to_string(image)
(3)请求方式
通过对原网页登录过程中的状态分析,网页采用POST的请求方式进行数据交互,通过浏览器的审查工具,网页登录过程中需要的参数有dhhm、pwd、sign,phhm为登录的账户名,pwd为登录的密码,sign为登录的验证码,将这三个参数打包后封装。
#封装请求参数
data={"dhhm":"username","pwd":"password","sign":code}
(4)模拟登录
通过requests第三方库可以很方便地进行模拟登录。
#调用requests进行模拟登录
response=requests.post(url,data=data,headers=he aders)
网页解析器是对网页内容中进行数据分析的工具。Python支持的网页解析器可以利用正则表达式可以将整个网页文档当成一个字符串,使用模糊匹配的方式来提取出有价值的数据。Python的re模块使Python语言拥有全部的正则表达式功能,通过正则表达式将符合要求的数据进行提取,将我们需要的报价数据准确的提取出来[4]。
#通过正则表达式提取报价信息
bj=re.compile('addCart(.*?)">购买')
bj=re.findall(bj,iphone)
Python可以将正则表达式获取到的信息通过引入相关数据库的第三方库,本文通过MySQLdb库创建数据库连接,然后直接用SQL语句操作数据库,将信息导出至数据库,方便各种应用程序的后续开发。
#设定数据库连接信息
db=MySQLdb.connect("127.0.0.1","root","123456","sjbj",charset='utf8')
#使用cursor()方法获取操作游标
cursor=db.cursor()
#创建数据表
sql="""CREATETABLEiphone(
id_1 VARCHAR(255) NOTNULL,
id_2 VARCHAR(255),
sjxh TEXT,
根据抽水孔结构,建立本次抽水试验的抽水井模型:井径r=0.11 m,水位埋深h=10.20 m,含水层厚度H=34.9 m,井流为无压井流。
price DOUBLE(10,2),
id_3 VARCHAR(255)
)"""
cursor.execute(sql)
#插入数据
sql="insert into iphone(id_1,id_2,sjxh,price,id_3)
cursor.execute(sql)
#关闭数据库连接
db.close()
运行网络爬虫程序,程序运行2.4s,成功抓取数据255条,部分爬行结果如表1所示。
表1
在当今数据大爆发的时代,通过爬虫快速的从互联网中爬行所需要的信息显得格外重要。Python在爬虫应用中充当了重要的角色,丰富的第三方库让开发变得简单易用。实例证明应用Python语言可以方便地实现深度网络爬虫和聚焦型网络爬虫相结合的爬虫程序,将网络中的大数据进行整合,让大数据更方便的服务于其他应用程序。
[1]周立柱,林玲.聚焦爬虫技术研究综述[J].计算机应用,2005(09):1965-1969.
[2]刘石磊.对反爬虫网站的应对策略[J].电脑知识与技术,2017,13(15):19-21+23.
[3]胡军伟,秦奕青,张伟.正则表达式在Web信息抽取中的应用[J].北京信息科技大学学报(自然科学版),2011,26(06):86-89.