
2020年第02期
84
基于Python 的网络爬虫技术探析
张宁蒙
国防大学政治学院,广东 广州510070
摘要:本文主要研究网络爬虫的设计及相关实现技术。基于Python 设计及实现一个网络爬虫,最终完成对目标气象网站指定信息数据的提取和存储;对主流反爬虫技术进行研究,并对网络爬虫和反爬虫的关系进行了理论说明和发展展望。
关键词:网络爬虫;反爬虫;Python 中图分类号:TP312
0 引言
爬虫的全名叫网络爬虫,简称爬虫,还有网络机器人、网络蜘蛛等名称。它是一种程序,基本原理是向网站、网络发起请求,获取资源后分析并提取相关数据。从技术层面来说,就是通过程序模拟浏览器请求站点的行为,把站点返回的HTML 代码/JSON 数据、二进制数据(图片、视频)爬到本地,通过数据解析进而提取需要的信息,并存放至数据库内。
1 网络爬虫的设计与实现
本文以爬取气象网站信息为例,在爬取数据前,首先要明确需要爬取的气象网站内容信息,如气温、降雨量以及日期等,然后对气象网站逻辑规则和数据结构进行分析,通过爬虫在网页中高效地获取需要的气象信息,最后通过数据解析得到结构化的数据信息,最终存储到数据库中。
1.1 数据抓取工具选取
Selenium 是Web 自动化测试工具集,包括IDE、Grid、WebDriver 等,可以在Internet Explorer、Chrome 和Firefox 等浏览器上运行。Selenium 能控制浏览器模仿一般用户行为进行操作,比如访问某个具体地址、获取网页状态、点击页面中的某个元素、控制滚动条等。Selenium 直接在浏览器中运行,开发时避免了对AJAX 数据和JavaScript 动态页面渲染的考量,使其开发流程得以简化。Selenium 可以在Windows、Linux 和Macintosh 上的Internet Explorer、Chrome 和Firefox 中运行。
1.2 目标分析与逻辑设计
在爬取气象网站信息前,首先分析网站的域名结构和层次。以2345天气预报网站某城市的历史天气为例,结合Sitemap 分析该网站,其URL 连接结构以主域名为中心,主域名下分有本地天气、空气质量和历史天气等子域名,也就是导航部分。在子域名下是年月信息,后面是附有城市代码的部分。因此,设计本网络爬虫爬取该气象网站数据的基本逻辑为:进入某城市的历史天气网页,遍历逐月的URL,并获取详细气象数据,直到获取完列表中全部月份天气的数据,然后进行入库保存。
1.3 爬虫实现
对网页数据信息提取、网页信息解析和数据库表的建立以及对程序中重要的方法进行讲解。
1.3.1 定位天气数据模块
定位正文元素,广州市天河区的历史天气URL 为http://tianqi.2345.com/wea_history/72025.htm,使用Firefox 浏览器的开发者模式查看器,查看元素后就会发现可以使用“data-table”这个class 的值来定位到天气数据模块。
1.3.2 安装Firefox Driver
到火狐的对应站点下载驱动,然后使用selenium 库的webdriver.Firefox(‘Firefoxdriverpath’)语句创建Firefox 浏览器对象。
1.3.3 搜寻获取数据
检查是否发生超时异常,等待页面加载完成后,使用浏览器对象的get()、find_element_by_id()、find_element_by_name()和click()等方法获取网
2020年第02期
85
页源码。之后用time.Sleep()方法推迟调用线程的运行。
1.3.4 使用lxml 解析网站代码
lxml 是用于解析XML 和HTML 的工具,可以使用XPath 和CSs 来定位元素,使用etree.HTML()和html.xpath()等方法获取数据信息。
1.3.5 翻页操作
Selenium 库本身并不提供这个功能,可用两种方式来达成:一是模拟键盘输入(例如输入PageDown);二是以JavaScript 代码的形式完成。
1.3.6 存储至数据库
使用insert()方法进行录入,数据抓取完毕,可以打开MongoDB 可视化工具NoSQL Managerfor MongoDB,查看抓取到的数据。
2 绕过反爬虫的方法
出于对网站性能或数据的保护,一般都会有反爬手段。为了能更有效地获取网站数据,编写的爬虫就要具备一定的对抗反爬虫的功能。越是强大的爬虫,越难拦截,但相应的开发成本也越高。下面是对抗反爬虫的几种主要方法。
2.1 修改Robots 协议
Robots 协议全称是“网络爬虫排除标准”(Robots Exclusion Protocol)。Robots 文件只是一个“君子协议”,并没有强制性约束爬虫程序的能力,只是表明了不希望网站数据被不适当抓取的意图,告诉搜索引擎页面抓取规则,规定不能抓取的信息等。用户可根据需要将ROBOTTSTXT_OBEY 的值True 修改为False,以方便抓取。
2.2 设置超时
爬虫访问网页的速度是很快的,很容易被服务
器检查到。可通过socket 的setdefaulttimeout 方法设置10 s 后连接超时,使爬虫的操作更近似于普通用户的行为。
2.3 更换User -agent
爬虫默认的Headers 和浏览器的Headers 有很大差异,爬虫程序默认向对方发送的头文件user -agent 值会让目标网站容易识别并拦截访问。可以使用fake -useragent 库进行随机更换user_agent,将Headers 修改为浏览器的User -Agent,如果有检查防盗链的话就将Referer 的值修改为目标网站域名。
2.4 代理IP
网站的服务器会记录用户的访问日志,可通过IP 辨识用户。IP 就像网络身份证,是标识自己的代码。如果用户访问行为异常,会对其IP 甚至屏蔽。伪装IP 有静态获取与动态随机获取两种方式。
3 结语
爬虫与反爬虫的对弈始终处于一种螺旋上升的态势。网络爬虫会为Web 服务器带来更大的资源开销,作为爬虫编写者应该遵守爬虫的基本规范,停止没必要的网络请求,减少带给网站的干扰,不影响网站的正常使用,避免给服务器造成过大的压力。对于网站上获取的数据应尊重产权,在未经作者或版权所有者的授权情况下,不随意转载使用,尤其是商业方面的使用。
参考文献
[1]漆志辉,杨天奇.网络爬虫性能研究[J ].北京:微型机与应用,
2011,24(5):72-74.
[2]潘昊.海量网络信息实时抽取引擎设计与实现[D ].北京:北
京邮电大学,2016.
