网络爬虫,又称网页蜘蛛,网络机器人,网页追逐者。蚂蚁、自动索引、模拟程序或蠕虫。
是一种按照一定的规则,自动地抓取万维网信息的程序或脚本。
通俗的讲,就是通过程序去获取web页面上自己想要的数据,即自动抓取数据。
你能够通过浏览器访问的数据都可以通过爬虫获取。
模拟浏览器打开网页,获取网页中你想要的那部分数据。
当你在浏览器输入地址后,经过DNS服务器找到服务器主机,向服务器发送一个请求,服务器解析之后发送给用户结果,包括html,js,css等文件内容,浏览器解析之后最后呈现给用户在浏览器上看到的结果。
即用户看到的浏览器结果就是由html代码构成的,而爬虫就是通过分析和过滤html代码,从中获取指定的资源(文本,图片,视频等)
1.通过http库向目标站点发起请求Request
2.被服务器响应后获得一个响应内容Response。
Response的内容即为要获取的页面内容。
能爬取什么样的数据?
1.网页文本:如HTML文档,Json格式化文本等
2.图片:获取到的是二进制文件,保存为图片格式
3.视频:同样是二进制文件
4.其他:只要请求到的,都可以获取
3.解析内容
方法
1.直接处理
2.Json解析
3.正则表达式处理
4.BeautifulSoup解析处理
5.PyQuery解析处理
6.XPath解析处理
4.保存数据
途径
1.文本:纯文本,Json,Xml等
2.关系型数据库:如mysql,oracle,sql server等结构化数据库
3.非关系型数据库:MongoDB,Redis等key-value形式存储
关于抓取的页面数据和浏览器里看到的不一样的问题
出现这种情况是因为,很多网站中的数据都是通过js,ajax动态加载的,所以直接通过get请求获取的页面和浏览器显示的不同。
如何解决js渲染的问题?
分析ajax
Selenium/webdriver
Splash
PyV8,Ghost.py
Json(JavaScript Object Notation, JS 对象简谱)
是一种轻量级的数据交换格式。
采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式,例如在 PHP 中,可以将 JSON 还原为数组或者一个基本对象。在用到AJAX时,如果需要用到数组传值,这时就需要用JSON将数组转化为字符串。
JSON 与 JS 对象的关系
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
如
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
XPath(XML Path Language,即XML路径语言)
它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。
正则表达式(简写regex、regexp或RE,Regular Expression又称规则表达式)
正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
BeautifulSoup
是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。利用它我们不在需要编写正则表达式就可以方便的实现网页信息的提取。
PyQuery
pyquery库是jQuery的Python实现,能够以jQuery的语法来操作解析 HTML 文档,易用性和解析速度都很好,与BeautifulSoup差不多,都是用来解析的。但相比BeautifulSoup完美翔实的文档,PyQuery库的文档弱很多。