基于Python的反反爬虫技术分析与应用
作者:余豪士 匡芳君
来源:《智能计算机与应用》2018年第04期
作者:余豪士 匡芳君
来源:《智能计算机与应用》2018年第04期
摘 要:爬虫软件是现今互联网环境下,高效准确地获取数据的重要方式之一。针对传统的初级爬虫技术易于被目标网站拦截访问的问题,简述爬虫的工作原理和方式,讨论爬虫、反爬虫与反反爬虫之间的相互关系。分析应对目标网站的反反爬虫机制,包括伪装用户代理,设置IP地址代理、使用自动化测试工具调用浏览器等技术要点,并分析了基于Python语言中Requests库,构建了对网页的多种请求方式和数据获取方法的解决方案。结合反反爬虫机制与数据分析技术,以哔哩哔哩视频网为案例,分析其网页基本结构与调用的应用程序接口,使用Python与Requests库抓取网站所有视频的相关数据。数据清洗后分析播放量最高视频的相关信息,并将结论以数据可视化的方式呈现,实现对数据的获取、挖掘与分析。
关键词:网络爬虫; 反爬虫; 反反爬虫; 大数据; 数据分析
Abstract: Crawler software is one of the most important ways to obtain data effectively and accurately in the current Internet environment. In view of the traditional crawler technolo
gy which is prone to be intercepted by target website, the paper explains how the crawler appears to work, discusses about the relationship between crawler, anti-crawler and anti-anti-crawler, and analyzes the mechanism of anti-anti-crawler for the target website, including fake user agents, setting IP proxy address, calling browser using automated testing tools. Furthermore, multiple requests and data acquisition methods for web pages are built based on Requests Library in Python language and its solution is analyzed. Combined with the mechanism of anti-anti crawler and data analysis technology, the paper takes the Bilibili website as a case, analyzing its basic structure, as well as its API called. On the one side, all relevant data of video on the Bilibili website is captured using Python and Requests Library and the related information of the video, in which the highest click rate is analyzed after data cleaning. On the other side, the conclusion is presented in the way of data visualization, and the data acquisition, mining and analysis are also realized.
Key words: Web crawler; anti-crawler; anti-anti-crawler technology; big data; data analysis
引言
大数据时代下的数据来源和获取尤为重要[1],爬虫技术作为一项获取数据的工具而被广泛应用。已超过60%的互联网流量来自爬虫(Spider),各大搜索引擎门户网站以及新闻网站的文章都与爬虫息息相关。爬虫技术已成为当今的研究热点,目标网站对爬虫软件所做的各方面防范,给出了不同的拦截方式[2]。开发者与开发者之间通过爬虫、反爬虫、反反爬虫技术进行较量,一方面开发者想通过爬虫脚本获取数据,另一方面开发者又想拦截爬虫,防止爬虫脚本妨碍本网站的正常运营,对正常用户的访问造成了负面影响。
1 反反爬虫概述
1.1 反反爬虫技术
爬虫软件是一种模拟浏览器的行为,是从指定网站抓取和保存网络数据的应用软件。爬虫软件提取出存在于网页上的数据,并以结构化的方式存储。主要活动于计算机网络通信模型中的传输层与应用层。传输层使用TCP/IP协议与目标Web服务器进行数据传输;应用层使用HTTP或HTTPS协议与目标Web服务器通信[3]。
由于传统的初级爬虫不使用任何隐藏伪装手段,在对站点发送大量请求时,会加重目标Web服务器的负担,且容易被服务器侦测。在大中型网站中,开发者会针对传统的初级爬虫制定一系列的反爬机制,如针对爬虫软件所处终端进行IP限制;针对请求报文中Header属性拦截爬虫软件;通过分析网站流量和日志统计分析过滤爬虫。爬虫开发者针对反爬虫机制,开发了一套反反爬虫机制,在爬取数据的过程中防止被目标站点拦截,开发者需最大限度地将爬虫模拟成真人行为,获取真实可靠的数据。初级爬虫、反爬虫、反反爬虫的关系如图1所示。
1.2 反反爬虫策略
1.2.1 降低访问频率
对目标站点连续访问不同网页,如果不限制爬虫的请求频率,爬虫的效率只会受到所处终端的处理能力和带宽的限制,因此爬虫的访问频率会非常高。通过增加线程的休眠时间,降低访问频率,实现模仿人为浏览的行为。具体代码如下:
import time
time.sleep(0.5)
1.2.2 伪装用户代理
用户代理(User-Agent)是一种代表用户行为的属性,用于发送HTTP请求描述用户系统和浏览器信息。站点服务器通过获取报文中的User-Agent属性,给不同操作系统与浏览器发送不同页面。通常爬虫软件在请求数据时不会携带此属性字段,目标站点也因此可侦测与进行拦截。所以,爬虫脚本在请求时需在头部加入类似浏览器的User-Agent属性[4]。例如:
headers = {'User-Agent':'Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
data = (url, headers=headers). text
1.2.3 IP代理
爬虫脚本在访问请求的过程中,TCP报文会携带客户端的IP地址,站点服务器也因此可获取到客户端的IPspider软件地址。爬虫软件访问频率过高,站点服务器可对此IP地址进行暂时性的封
禁。开发者在编写脚本时需要设置IP代理池。在多进程下,多个进程间使用不同的IP代理访问目标网站,绕过站点服务器IP地址字段的检测,加快爬取数据的效率。例如:
proxies = {'http':'XX.XX.XX.XX:XXXX',
'https':'XX.XX.XX.XX:XXXX'}
data = (url, proxies=proxies). text
1.2.4 使用自动化测试工具Selenium
Selenium是一个用于WEB开发自动化测试的软件,其本身用于从用户角度使用终端测试Web应用,加载浏览器驱动对网页进行操作。爬虫开发者使用Selenium,并设置适应的浏览器,例如Chome Driver或无头浏览器PhantomJS,最大限度模拟真人行为。应用代码如下:
from selenium import webdriver
driver = webdriver.Chrome()
1.2.5 访问移动端站点
网站根据终端浏览器的用户代理相应不同的页面,其中终端分为移动端和PC端。移动端站点地址通常以WAP开头,且对爬虫软件的限制不如PC端强。如果目标站点有移动端页面且数据可抓性高,可以对移动端页面进行抓取[5-6]。
2 基于Requests库编写爬虫
Python中的第三方HTTP库、Requests库被爬虫开发者广泛应用。Requests集成了定制请求头、发送请求、传递URL参数、获取相应内容等多种函数[7]。
2.1 发送请求
在发送请求上,Requests 集成了多种请求方式,例如最普遍的get和post请求,还有其他HTTP协议中的请求类型。具体实现过程如下:
response = ('https:///get')
response = requests.delete("http:///delete")
response = requests.options("http:///get")
2.2 传递 URL 参数
在浏览器地址输入栏,输入目标网址的地址后,可输入以键值对形成的参数,最终形成一个完整的URL地址跳转至目标网页。同理在Requests库也有此功能,以字典的形式构建。实现过程如下:
params = {'key1':'value1','key2': 'value2'}
response = ('http://yhslib', params= params)
若要查看构建后的完整地址,也可输出查看。
2.3 定制请求头
HTTP请求头,Requests库也给出了定制方式,以字典的形式构建。实现过程如下:
headers = {'content-type': 'application/json'}
response = ('http://yhslib', headers=headers)
2.4 获取相应内容
通常所需的数据会显示在网页上,这也说明数据包含在HTML或者JavaScript等文本类型的文件中,通过获取其文本信息经过筛选即可获得数据。Requests库中可以通过获取text获得其文本:
r = ('http:///get')
print(r.text)
有些情况下,所需数据以二进制的文件存在,例如图片、音频、视频等。在Requests中可通过获得二进制数据,通过解码和编码得到最终数据文件。
JSON数据在数据交换和API接口领域中广泛应用。Requests中,对JSON类型数据有独立的获取方式:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论