TasK One. 基础知识学习
为什么需要爬虫?
万维网是一个信息资源贡献库,所有的信息是分布式地储存在因特网上各个角落。那么我们想要收集数据到本地,就需要把因特网上地信息下载带到本地。最基本的方法是我们知道一个url,然后使用游览器访问它,服务器返回数据给我们。这样就可以满足我们最基本的要求。但当我们想要从一个网站上获取我们所想要的信息,it’s not easy for us to click every possible link。因此,我们就需要一个可以自动化访问网站,解析内容并下载我们所需信息的一个自动化工具(即爬虫)。
1. 什么是互联网?
- 因特网:
遵循一组特定的通信协议族(网络协议族)连接的多个结点(可以是简单的设备,但通常而言是一个网络),组成的一个巨型网络。类似一个巨大的通信系统(类似于物流系统) - 网络协议族:
针对不同的功能,我们需要有不同的通信协议。比如超文本之间的传输,文件的传输等等。这些网络协议们,统称为网络协议族 - 互联网:
狭义来说,两台设备之间能相互通信,就可以被称之为互联网 - 万维网(world wild web):
是英特网的一个应用实例,功能是为了信息共享(通过这种 uri+hyperlink方式 )。本质上为一个信息共享的资源库,特点是通过超链接可以访问其他站点的资源。使用uri定位资源。 - 万维网有几个需要解决的问题:
- 如何定位资源?
- 如何传输超文本or超媒体
- 如何展示这些内容
- 如何查找所需要的资源
2. 什么是http
为了解决第二个问题,就有http超文本传输协议。HTTP是一个客户端和服务端之间进行请求和应答的一套标准化的流程操作(protocl)。 通过游览器,或者其他模拟游览器的工具,客户端可以向服务器上的指定端口发起一个http请求(就像去银行窗口办理业务,不同的窗口对应了不同的业务。在这里通常默认是80窗口端口)。客户端成为客户代理。资源储存在应答服务器上,亦为原服务器origin server。在客户代理和源服务器中间,可能有多个中间层??代理服务器,网关和隧道。尽管tcp/ip是互联网中最主要的协议,但http不一定要使用它。
HTTP可以在其他互联网协议下实现?HTTP假定下层能够提供可靠的传输(只要能够提供可靠传输的协议)。RCP作为传输层使用TCP/IP协议族时。client -> request to server (port 80)。一旦收到请求,服务器会返回一个状态,以及请求文件,错误信息等响应内容
HTTP的请求:
get, head, post, put, delete, trace, option, connect.
3. 网页基础
当我们在使用爬虫爬网站的时,我们在爬什么?
-
什么是网站?
简单的理解上,网站就是网页的集合。网站就是一本书,而网页就是这本书的每一页。 -
那么网页是什么?
通常而言,就是在我们通过游览器访问网站,所最终呈现给我们的信息页面。在游览器中按F12可以进入开发者模式,我们就可以看到在游览器眼中,网页原本是什么样子的。(游览器解析源代码->呈现的内容) -
网页的组成
三个部分组成组成:HTML,CSS,JavaScript
HTML是用来搭建网页的整个骨架,CSS是为了让整个页面更好看,JavaScript是增加网页的动态表现。-
HTML:
什么是html: hypertext markup language. 标签语言,特点是使用标签来控制文本
对一个.html格式它的意思是一个使用html写的文本。对于一个文本而言,我们需要标头和内容。.html文本如下:
标头
内容
<>开始,以</>结束
什么是元素?
<>中的部分就是元素,元素有属性,有公共属性,也有私有属性。属性通常以名称="值"这样子出现。常见的一些属性:id, class, styple, tile -
DOM(document object model):
DOM识文档为一颗节点树,或者可以被称为逻辑树,所有标签定义的内容都是结点,都是一个对象。文档结点 -> 元素结点->文本节点,属性结点,注释节点。结点之间,拥有层级关系,其实也就是逻辑关系。所有的结点都是一个对象,并且都可以被增删查改。 -
css(Cascading Style Sheets)
又被称作为串样式列表,级联样式标,串接样式表,阶层样式表。主要是用来为结构化文档添加样式的语言(大小,颜色,样式等等)。css会根据不同的结点选择不一样的规则。那么css如何定位到结点呢?css选择器。有三种方法:id: #name class: .name, or 直接更具标签h
另外支持嵌套选择,选择方法加空格#name .wrap p 。还有一些其他语法,在这里就不多叙述了。
-
实例
基本流程:
1. 访问站点
2. 定位到所需资源位置
3. 得到并处理信息
爬取python之禅
request有不同的请求类型
这里主要涉及了两种请求:
get就是最基本的直接访问,并返回response
post的话会上传所需要的数据,然后再返回response
import requests
url = ''
res = requests.get(url) ###get请求
res.text ###这里返回的是 网页的源代码的字符串形式
text = text[text.find('<pre')+28:text.find('</pre>')-1]###从原文中定位到文本。但如果这一段是一个hyperlink呢?那该怎么处理
with open('','w') as f:
f.write(text)
import urllib
url = 'https://www.python.org/dev/peps/pep-0020/'
res = urllib.request.urlopen(url).read().decode('utf-8')
print(res[res.find('<pre')+28:res.find('</pre>')-1])
url = ''
data = {}
headers ={}
res = requests.post(url, data=data, headers=headers)
print(res.json())
练习爬取豆瓣数据
算是直接调取了豆瓣的api查询
4.API
从个人角度来看,就是url(**kwargs) -> return data
5.JavaScript and AJAX
如果对于每一个内容都要准别一个特定的网页,那么一个网站需要制作的网页实在是太多了。
通过JavaScript,可以使得网页许多部分只是呈现一个窗口,具体执行什么样的操作,可以通过输入参数,经由JavaScript脚本来操作。就好像看电视,只需要遥控器按按钮,就可以切换成别的电视。而不是对于不同的节目,我们都需要准备一台对应的电视机。
但对于爬虫来说,我们首先得到的是一个完整原始的.html页面, 其中会有许多部分是JavaScript,并没有实质性的文本内容与数据。