赞
踩
网络爬虫(又称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。如果把互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛,如果它遇到自己需要的食物(所需要的资源),那么它就会将其抓取下来。例如百度、google等搜索引擎本质上就是超级爬虫。搜索引擎爬虫每时每刻都会在海量的互联网信息中进行爬取,爬取优质信息并收录,当用户在搜索引擎上检索对应关键词时,搜索引擎将对关键词进行分析处理,从收录的网页中找出相关网页,按照一定的排名规则进行排序并将结果展现给用户。
爬虫主要作用是抓取某个网站或者某个应用的内容,批量提取有用的价值,比如把某一个壁纸网页的所有壁纸图片抓取到本地并保存,或者搜集众多机票网站的航班价格信息做价格对比,对各种论坛、股吧、微博、公众号的舆情收集等。将爬到的数据也可以用来做数据分析,先通过对爬取的数据的清洗,抽取,转换,将数据做成标准化的数据,然后进行数据分析和挖掘,得到数据的商业价值。
据说互联网上50%以上的流量都是爬虫创造的,也就是很多热门数据内容都是爬虫所创造的,所以可以说没有爬虫就没有互联网的繁荣。综合国内目前的法律法规来说爬虫这种技术是不违法的,因为技术本身确实是没有对错的.但使用技术的人是有对错的,如果违反法律法规制作和使用相关的爬虫肯定是会受到法律的惩处。
制作和使用爬虫的时候也需要按照一定的规则来避免风险.
爬虫程序通过编程语言编写程序请求网络地址,根据响应的内容进行解析采集数据,需要注意的是并不是只有Python能制作爬虫程序,例如JAVA,PHP等通用语言都可以制作Python程序。之所以python爬虫程序比较常见,是因为Python的语法比较简单,而且有很多第三方库为Python爬虫提供支持,可以用比较少的代码实现爬虫。
Python中的两个内置模块(urllib2和urllib),来实现HTTP请求功能,不过功能比较简单,除了不用额外添加依赖包以外的优点以外,并没有其他的优势。目前在Python中使用比较多的还是Requests实现HTTP请求的方式,也是在Python爬虫开发中最为常用的方式。Requests实现HTTP请求非常简单,操作更加人性化。
Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库。由于Python没有自带该库所以我们在使用之前需要先进行安装。
通过pip安装:
pip install requests
也可以通过下载源码安装。
常见的请求方法都支持 get、post、put、delete。
import requests
response = requests.get('http://www.baidu.com') # 使用get 请求
response = requests.post('http://www.baidu.com') # 使用post 请求
response = requests.put('http://www.baidu.com') # 使用put 请求
response = requests.delete('http://www.baidu.com') # 使用delete 请求
import requests
response = requests.get("http://www.baidu.com?key1=value1&key2=value2")
import requests
parameter = {
"key1":"value1",
"key2":"value2"
}
response = requests.get("http://www.baidu.com",params = parameter)
import requests
parameter = {
"key1":"value1",
"key2":["value2-1","value2-1"]
}
response3 = requests.get("http://www.baidu.com",params = parameter)
import requests
payload = {
"key1":"value1",
"key2":"value2"
}
response = requests.post("http://www.baidu.com",data = payload)
还可以为 data 参数传入一个元组列表:
import requests
payload = (("key1","value1"),("key1","value2"))
response = requests.post("http://www.baidu.com",data = payload)
import requests
payload = {
"key1": "key1"
}
response = requests.post('http://www.baidu.com', json=payload)
请求添加 HTTP 头部 Headers,只要传递一个 字典 给 headers 关键字参数就可以了。
import requests
new_headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"
}
response = requests.get("http://www.baidu.com",headers = new_headers)
如果同一个ip在短时间频繁访问一个网站,很容易被服务器发现将其拉入黑名单,因此需要添加代理。
mport requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://www.baidu.com", proxies=proxies)
Requests请求以后会返回 Response 对象,Response 对象是对服务端返回给浏览器的响应数据的封装,响应数据中主要元素包括:状态码、原因短语、响应首部、响应 URL、响应 encoding、响应体等等。
import requests
response = requests.get('http://www.baidu.com')
print(response.status_code) # 打印状态码
print(response.url) # 打印请求url
print(response.headers) # 打印头信息
print(response.cookies) # 打印cookie信息
print(response.text) # 以文本形式打印网页源码
print(response.content) # 以字节流形式打印
通过上文我们了解到通过Requests可以模拟网络请求拿到网页数据。接下来我们就需要对网页数据进行分析它的结构和规律以便对网页数据进行解析。我们可以这么理解浏览器打开网页的过程就是爬虫获取数据的过程,对于静态网页而言两者获取到的结果是一样的。对于动态网页而言,由于很多动态网页都采取了 异步加载技术 (Ajax),会导致很多时候抓取到的源代码和网站显示的源代码不一致(这个下文会说到)。通过浏览器自带元素审查可以帮助分析页面,浏览器可以通过F12调出抓包功能。
当然除了浏览器自带的抓包功能我们还可以使用如Fidder(Windows建议) 和 Charles(Mac建议)等第三方抓包工具。
上说说到我们通过抓包工具分析了我们请求到的网页。下面就需要对网页进行解析,对于 HTML 类型的页面来说,常用的解析方法其实无非那么几种,正则、XPath、CSS Selector,BeautifulSoup库,对于某些接口返回的数据,常见的可能就是 JSON、XML 类型,使用对应的库进行处理即可。
\ | 正则regex | xpath | beautifulsoup |
---|---|---|---|
学习难度 | 难 | 中 | 简单 |
代码量 | 小 | 较少 | 较多 |
解析速度 | 快 | 较快 | 较快 |
场景 | 广泛 | 专一 | 专一 |
正则表达式又称规则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。在 Python 中,我们可以使用内置的 re 模块来使用正则表达式。
XPath全称为XML Path Language 一种小型的查询语言 最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。完全可以使用 XPath 做相应的信息抽取。
它所具备的优点:
from lxml import etree
selector=etree.HTML(源码) #将源码转化为能被XPath匹配的格式
selector.xpath(表达式) #返回为一列表
当然我们也可以借助Chorme的F12控制调试台或者Chorme插件来方便的获取到元素的Xpath路径,将其复制到我们的爬虫脚本中。
BeautifulSoup就是Python的一个HTML或XML的解析库,可以用它来方便地从网页中提取数据。
Beautiful Soup在解析时实际上依赖解析器,它除了支持Python标准库中的HTML解析器外,还支持一些第三方解析器(比如lxml)。
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, “html.parser”) | Python的内置标准库、执行速度适中、文档容错能力强 | Python 2.7.3及Python 3.2.2之前的版本文档容错能力差 |
xml HTML解析器 | BeautifulSoup(markup, “lxml”) | 速度快、文档容错能力强 | 需要安装C语言库 |
lxml XML解析器 | BeautifulSoup(markup, “xml”) | 速度快、唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | BeautifulSoup(markup, “html5lib”) | 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 | 速度慢、不依赖外部扩展 |
在使用工具解析到网页上的数据后,要想办法把数据存储起来,这也是网络爬虫的最后一步。存储,即选用合适的存储媒介来存储爬取到的结果。
有时通过爬虫获取的网页源码不能在html代码里面找到想要的数据,但是通过浏览器打开的网页上面却有这些数据。这是因为浏览器通过ajax技术异步加载了这些数据。要了解这其中的原理我们首先要知道html的渲染方式。网页常见的有两种渲染页面的方式:一种是服务端渲染,一种是前端渲染。
在互联网早期,用户使用浏览器浏览的都是一些没有复杂逻辑的、简单的页面,这些页面都是在后端将html拼接好的,然后返回给前端完整的html文件,浏览器拿到这个html文件之后就可以直接解析展示了,这就是服务器渲染网页了。
随着前端页面的复杂性提高,前端就不仅仅是普通的页面展示了,也可能添加了更多功能性的组件,复杂性更大,另外,随着ajax的兴起,使得业界开始推崇前后端分离的开发模式,即后端不提供完成的html页面,而是提供一些api使前端可以获取到json等数据,然后前端拿到json等数据之后再在前端进行html页面的拼接,然后展示在浏览器上,这就是前端渲染。
这样做的好处是前后端代码分离,可以让前端更专注于UI的开发,后端专注于逻辑的开发。也就是说页面的主要内容由 JavaScript 渲染而成,真实的数据是通过 Ajax 接口等形式获取的,比如淘宝、微博手机版等等站点就是这种方式实现的。
ajax全称叫Asynchronous JavaScript and XML,意思是异步的 JavaScript 和 XML。ajax是现有标准的一种新方法,不是编程语言,可以在不刷新网页的情况下,和服务器交换数据并且更新部分页面内容,不需要任何插件,只需要游览器允许运行JavaScript就可以。
而传统的网页(不使用ajax的)如果需要更新页面内容,就需要重新请求服务器,返回网页内容,重新渲染刷新页面。当访问很多列表网页时,鼠标不断向下滑,数据不断的更新而http网址没有变化,那么这个网页就利用了ajax异步加载技术.
审查浏览器源代码,如果能看到页面上展示的数据,则说明是服务器端渲染,看不到则就是前端渲染。
上文重要讲的就是服务器端渲染的网页的爬取方式,可以用一些基本的 HTTP 请求库就可以实现爬取,如 urllib、urllib3、pycurl、hyper、requests、grab 等框架,其中应用最多的可能就是 requests 了。
上文说到随着AJAX技术不断的普及,以及现在Vue、AngularJS这种Single-page application框架的出现,现在js渲染出的页面越来越多。对于爬虫来说,这种页面仅仅提取HTML内容,往往无法拿到有效的信息。
那么如何处理这种页面,总的来说有两种做法:
对于一些网页,甚至还有一些js混淆的技术,这个时候,使用浏览器模拟抓取的的方式基本是万能的,但是这些工具都存在一定的效率问题,因为要依赖于浏览器进行操作.
Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome、firefox等主流浏览器。可以通过代码控制与页面上元素进行交互(点击、输入等),也可以获取指定元素的内容。
例如:
通过Selenium运行Chorme访问百度并且通过代码将关键字输入到搜索框进行搜索
pip install selenium
# 导包 from selenium import webdriver #定义url url = "https://www.baidu.com/" #实例化驱动 chrom = webdriver.Chrome() #发起get请求 chrom.get(url) #使用选这起完成元素的捕获 search = chrom.find_element_by_id("kw") #发送数据请求 search.send_keys("python") #使用选择器完成元素的捕获 submit = chrom.find_element_by_id("su") #点击触发 submit.click()
上文中使用Selenium爬取网页还必须依赖一个外部的浏览器,那么能不能内置一个浏览器来完成这个功能能?PhantomJS 是一个无界面的,可脚本编程的 WebKit 浏览器引擎。它原生支持多种 web 标准:DOM 操作,CSS 选择器,JSON,Canvas 以及 SVG。可以理解为无界面的浏览器。配合selenium使用,就可以无需依赖额外的浏览器,来实现可视化爬虫的功能.
注意,目前Selenium 貌似已经放弃对PhantomJS的支持了。
通过浏览器进行网站访问时,都会携带user-agent信息。很多网站都会建立 user-agent白名单,只有属于正常范围的user-agent才能够正常访问。而在通过请求时,携带user-agent信息并不是浏览器的user-agent信息,因此就会被拒绝访问。
爬虫解决方案:
可以在浏览器的请求内复制完整的请求头。伪装成浏览器来进行爬取.
herder={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Upgrade-Insecure-Requests':'1'
}
url='https://www.baidu.com'
request=requests.get(url,headers=herder)
IP 限制是很常见的一种反爬虫的方式。服务端在一定时间内统计 IP 地址的访问 次数,当次数、频率达到一定阈值时返回错误码或者拒绝服务。
爬虫解决方案:
url='https://www.baidu.com'
#ip代理池,放在本地获取通过网络获取.
proxies = ["192.168.0.1","192.168.0.2","192.168.0.3","192.168.0.4"]
#随机取出一个Ip
proxie=rondom.randint(0,len(proxies))
#请求添加代理
request=requests.get(url,headers=herder,proxies=proxies)
登录限制是一种更加有效的保护数据的方式。网站或者 APP 可以展示一些基础的数据,当需要访问比较重要或者更多的数据时则要求用户必须登录。同时浏览器会保持一个session会话,而一般的request模块中,并不能携带session。
爬虫解决方案:
验证码是一种非常常见的反爬虫方式。服务提供方在 IP 地址访问次数达到一定 数量后,可以返回验证码让用户进行验证。
爬虫解决方案:
前文分析过使用Selenium+PhantomJS或者是抓包分析AJAX请求,然后再进行爬取。
通过多线程提升爬虫效率。(有兴趣的可以找相关资料查阅,这里不做详细讲解)
通过将爬虫部署到不同的主机上组成集群,提升爬虫的效率。(有兴趣的可以找相关资料查阅,这里不做详细讲解)
如果是比较小型的爬虫需求,直接使用requests库 + bs4就解决了,再麻烦点就使用selenium解决js的异步加载等问题。相对比较大型的需求才使用框架,主要是便于管理以及扩展等。
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
Pyspider
是一个用python实现的功能强大的网络爬虫系统,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器,
能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行爬取结果的存储,还能定时设置任务与任务优先级等。
App几乎都是请求后端接口进行本地渲染的,因此我们通过抓包工具就可以抓取到需要的内容。例如
fiddler
charles
安装配置appuim首先需要配置好JDK环境和Android Sdk环境。这两点不必多说,网上面大把的相关教程。
下载appium-desktop文件,点击进行安装。
Json配置文件示例:
{
“platformName”: “Android”,
“platformVersion”: “8.0.0”,
“appPackage”: “com.example.myapplication”,
“appActivity”: “.MainActivity”
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。