python 爬虫
爬虫是什么
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20爬虫概念: 在互联网上获取资源的程序
爬虫种类:
* 网络爬虫
是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎重要组成
* 传统爬虫
从一个或若干初始网页URL开始,获取初始网页上的URL,在抓取网页过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统一定停止条件
爬虫工作原理:
* 爬虫根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列
* 它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到满足一定条件时停止
* 所有被爬虫抓取的网页将会被系统存储,进行一定的分析下,过滤,并建立索引,以便之后查询和检索
爬虫策略:
* 广度优先
在抓取过程中,在完成当前层次的搜索后,才进行下一层的搜索
* 最佳优先
它只访问经过网页分析算法预测为"有用"的网页
* 深度优先
可能会导致"trapped"问题URL和Cookie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18URL: 统一资源定位符,互联网上资源均有其唯一地址
URL 构成:
* 模式/协议/服务方式
* 文件所在主机IP地址及端口号
* 主机上资源位置
浏览器如何显示网页:
* 用户在浏览网页过程中,比如: http://image.baidu.com/ ,通常会看到显示出一系列图片及百度搜索框,这个过程其实就是用户输入网页后,经过DNS服务器,找到服务器主机,向服务器发出一个请求,服务器经过解析之后,发送给用户的浏览器HTML,JS,CSS等文件,浏览器进行解析,用户便可以看到浏览器显示的图片
* 因此,用户看到的网页实质上是由HTML代码构成的,爬虫爬来的便是这些内容,通过分析和过滤这些HTML代码,实现对图片,文件等资源的获取
DOM:
* DOM将HTML文件表达为树结构
* 定义了访问和操作HTML文档的标准
Cookie:
* Cookie是由服务器端产生的,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次访问同一网站时就发送该Cookie给服务器
*urllib2库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45例1:
import urllib2
response = urllib2.urlopen('http://www.baidu.com')
print(response.read())
说明:
urlopen(url,data,timeout)
* 第一个参数,url
* 第二个参数,是访问url时要传送的数据
* 第三个参数,是设置超时时间
read方法,可以返回获取到的网页内容
例2:
import urllib2
request = urlib2.Request('http://www.baidu.com')
response = urllib2.urlopen(request)
print(response.read())
* urlopen参数可以传入一个request请求(request对象实例)
说明:
Reuest(url,data,headers)
* 第一个参数,url
* 第二个参数,是访问url时要传送的数据
* 第三个参数,是headers
http定义了与服务器交互的不同方式:
* GET[获取/查询]
GET方式直接以链接形式访问,链接中包含了所有参数
* POST[更新]
POST把提交的数据放置在试HTTP包的包体中
Headers设置:
* User-Agent
部分服务器或proxy会通过该值来判断是否是浏览器发出的请求
用于模拟浏览器
* Content-Type
使用REST接口时,服务器会检查该值,用来确定HTTP body中的内容该怎么解析
* application/xml
在XML RPC,如RESTful/SOAP调用时使用
* application/json
在JSON RPC调用时使用
* application/x-www-form-urlencoded
浏览器提交web表单时使用urllib 和 urllib2区别
1
2
3* urllib2 可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL
* urllib提供urlencode方法来GET查询字符串产生,而urllib2没有
urllib中的urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回是a=1&b=2这样的字符串request库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36例1:
import request
url = 'http://www.baidu.com'
response = request.get(url)
print(response.status_code)
print(response['content-type'])
print(response.content)
* request发送请求
r = request.get('https://github.com/timeline.json')
r = request.post('https://github.com/post')
* 为URL传递参数
value = {'k1':'v1','k2':'v2'}
r = request.get('http://github.com/get',params=value)
print(r.url)
* 响应内容
r = request.get('https://github.com/timeline.json')
print(r.text)
* 响应状态码
r = request.get('http://github.com/get')
print(r.status_code)
* 响应头
r = request.get('http://github.com/get')
print(r.headers)
* Cookie
r = request.get('http://github.com/get')
print(r.Cookies)
* 超时
request.get('http://...',timeout=0.001)
* 错误与异常
request异常一般都继承request.exception.RequestException
遇到网络问题,request会抛出一个ConnectionError异常
遇到请求超时,request抛出一个timeout异常
遇到无效http响应时,request抛出httpError异常
遇到请求超过设定最大重定向次数,抛出TooManyRediects异常网页内容抓取方法
1
2
3* 正则表达式
* Lxml
强大的HTML与XML的python库