网页蜘蛛(spider)
,就是能够在互联网中检索自己需要的信息的程序或脚本。
爬虫,简单的说就是 一个http(https)请求
,获取到对面网页的源码,然后从网页的源码中抓取自己需要的信息。而html代码的规则是基于xml的,所以可以通过一定解析规则和逻辑完成我们的数据。
爬虫能干的事情比较多,并且有些领域和爬虫都有很大的关联。不同深度,技术的爬虫工作者能干的事情也不同。
网络爬虫+算法+db存储
形成的一套持久运行、相对稳定的系统。当然,这类爬虫并不是大部分人都能接触的,通常这类对硬件成本和算法的要求较高,要满足一定的爬行速率、爬行策略并且你还要通过一定 算法检索文本、挖掘文本
,通过文本价值和外链数量等等判权信息给搜索排名加权。具体不做过多介绍。笔者也不会。但是如果有兴趣完全可以运用开源软件或者工具做个站内搜索,或者局域搜索。这个如果有兴趣可以实现,虽然可能效果不好。 12306抢票 拉票,投票
pandownload
、 全网vip视频免费看
、 付费知识/文档下载
、 qq机器人
等等。有经验的爬虫工程师不仅仅能够解析http请求,而tcp-ip等请求涉及到的各种加密也能处理的非常得手。然而这些人就能开发出一些让人感到黑科技的东西。 微博、淘宝、京东、金融等其他
等就可以自己生产数据。而其他人如果想要这些数据集,那么要么通过官方可能给的部分可怜的api、数据。要么就是买(很贵),要么就是自己爬。通过爬虫的数据可以做舆情分析,数据分析等等。数据本身是没有价值的,然而通过挖掘处理之后就极具商业、研究价值。 校园辅助app
, 博客一键搬迁
, 新闻等咨询
,等等非官方授权的应用却有着官网app的功能都是基于网络爬虫实现。还有很多就不具体介绍。 用python更方便
,得益于python精简的语法和弱类型变量。能够伸缩自如。这样还有一点就是 python的字典操作起来远比java的Map方便
。而java的强变量让书写变得稍加繁琐。 高并发问题其实还是java占优
。python只能用多进程来优化速度而假的多线程对性能提升有限。 对于python爬虫常用的库有
名称 | 主要功能 | 依赖 |
---|---|---|
requests | 负责网页请求,代理等处理,封装urllib2(用起来麻烦)等库,使得操作简化。不需要考虑编码、解码等较麻烦的问题 | pip install requests |
Beautifulsoup | 非常好用的dom解析器,还有css选择器。匹配正则等,而选用lxml当做解析 | pip install bs4,pip install lxml |
xpath | 解析效率最高,和BeautifulSoup可以选择一个学习即可 | pip install lxml |
re | 正则库,很多特殊匹配需要正则来完成 | 内置 |
Senlenuim/ChromeDriver+PhantomJS | 模拟浏览器行为,执行点击事件,简单粗暴,但是速度慢 | 需要安装对应库和对应驱动 |
至于框架,scrapy流行。就不介绍 对于java爬虫常用的库有
名称 | 主要功能 |
---|---|
HttpURLConnection | java.net下包。很多其他包都基于此包进行封装 |
HttpClient | 基于 HttpURLConnection进行封装,更加友好的解决参数,Cookie,Session等问题。 |
jsoup | 基于HttpClient进行封装,更加方便的发送请求。此外jsoup的另一个重大功能就是他是一个非常良好的dom解析器。使用起来非常简单。 |
Senlenuim+PhantomJS | 解决动态渲染解析不了的问题,同上 |
至于框架,java的框架 比较多
,但是 流行度却没python的scrapy高
。自己可以查询各种框架进行对比。当然自己也可以使用spring+mybatis进行封装。如果项目比较大。
对于上面的主页,如果用python来完成数据提取
import requests from bs4 import BeautifulSoup url='https://blog.csdn.net/qq_40693171' req=requests.get(url) res=req.text#html 源码 soup=BeautifulSoup(res,'lxml')#转为bea--对象 node=soup.find(id='mainBox').find_all(attrs={'class':'article-item-box'}) for link in node: value=link.h4 print(value.text) 复制代码
运行结果
如果用java来完成
package com.bigsai; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class test { public static void main(String[] args) throws IOException { String url="https://blog.csdn.net/qq_40693171"; Document doc= Jsoup.connect(url).get(); Elements elements=doc.getElementById("mainBox").select(".article-item-box"); for(Element element:elements) { Element node=element.select("h4").get(0); System.out.println(node.text()); } } } 复制代码
运行结果
这样,一个简单的爬虫就完成了。是否勾起你对爬虫的兴趣?
非正常访问
的请求。比如检索你的请求非人为。请求过快等等。 爬虫与反爬虫的斗争由此开始。
一个http请求要携带很多头信息带给后台,后台也能够获取这些信息。那百度的首页打开F12刷新
公网ip进行封禁访问
。如果你访问过快,就会招来403 forbidden。所以你需要使用代理ip来让对面认为你的ip没问题。 User-Agent
等其他信息进行判断。所以你需要多准备几个User-Agent,比如谷歌的,IE的,360的随机使用即可。 cookie
进行封禁。因为有的cookie储存了用户的一些信息。如果网站根据cookie来进行限制,那么你不仅要找的到这样cookie池维护,还要记得维持cookie的活性。而 新浪微博
的反扒策略就是基于cookie鉴定。所以你需要到淘宝购买已登录过的cookie池才能拿到更多的数据。 有很多数据是开放可以查看的,但是也有很多数据需要注册登录之后才能查看数据的,比如国内的各大招聘网站都需要你先登录然后才能爬取。
对于普通验证码来说,你大致有四个选择。
而对于滑块以及其他奇葩如滑块,点选等等,那你要么借助第三方,要么就是自己研究其中js运转流程。以及交付方式。算法原理,还是很复杂的。笔者这部分也不是特别了解。只是略知一二。
不仅如此,在登录环节,往往还会遇到一些其他参数的会放到JavaScript里面,这需要你抓到比较。有的还会针对你的数据进行加密传到后台。这就需要你娴熟的js解密能力了。
虽然一些高难度的爬虫确实很难,没有一定的工作经验和时间研究确实很难变强。但是我们还是能够通过掌握一些大众知识能够满足生活、学习的日常需求和创意。