python 爬虫

python 爬虫

  1. 爬虫是什么

    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"问题
  2. URL和Cookie

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    URL: 统一资源定位符,互联网上资源均有其唯一地址

    URL 构成:
    * 模式/协议/服务方式
    * 文件所在主机IP地址及端口号
    * 主机上资源位置

    浏览器如何显示网页:
    * 用户在浏览网页过程中,比如: http://image.baidu.com/ ,通常会看到显示出一系列图片及百度搜索框,这个过程其实就是用户输入网页后,经过DNS服务器,找到服务器主机,向服务器发出一个请求,服务器经过解析之后,发送给用户的浏览器HTML,JS,CSS等文件,浏览器进行解析,用户便可以看到浏览器显示的图片
    * 因此,用户看到的网页实质上是由HTML代码构成的,爬虫爬来的便是这些内容,通过分析和过滤这些HTML代码,实现对图片,文件等资源的获取

    DOM:
    * DOM将HTML文件表达为树结构
    * 定义了访问和操作HTML文档的标准

    Cookie:
    * Cookie是由服务器端产生的,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次访问同一网站时就发送该Cookie给服务器
    *
  3. 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表单时使用
  4. urllib 和 urllib2区别

    1
    2
    3
    * urllib2 可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL
    * urllib提供urlencode方法来GET查询字符串产生,而urllib2没有
    urllib中的urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回是a=1&b=2这样的字符串
  5. 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异常
  6. 网页内容抓取方法

    1
    2
    3
    * 正则表达式
    * Lxml
    强大的HTML与XML的python库