网络爬虫基础1

HTTP

HTTP = HyperText Transfer Protocol
URI = Uniform Resource Identifier
URL = Uniform Resource Locator
- URI和URL的区别:URI强调的是资源,而URL强调的是资源的位置。

常用请求类型

  • OPTIONS: 返回服务器针对特定资源所支持的http请求方法。
  • HEAD: 向服务器索要与get请求相一致的相应,只不过响应体将不会被返回。
  • GET: 向特定资源发出请求。
  • PUT: 向指定资源位置上传其最新内容。
  • POST: 向指定资源提交数据进行处理请求。
  • DELETE: 请求服务器删除指定URI所标识的资源。
  • PATCH: 用来将局部修改应用于某一资源。

HTTP常见状态码

  • 200/OK: 请求成功
  • 201/Created: 请求已被实现,且一个新资源已根据请求被建立,URI跟随Location头信息返回。
  • 202/Accepted: 服务器已接受请求,但尚未处理。
  • 301: 重定向,跳转,将需要转移的网址重定向另一个新的网址上,并且是永久性转移。
  • 400/Bad Request: 请求无法被服务器理解。
  • 401/Unauthorized: 当前请求需要用户验证。
  • 403/Forbidden: 服务器已理解请求,但拒绝执行。
  • 404/Not Found

爬虫框架介绍

爬虫工作流程

  • 将种子URL放入队列
  • 从队列中获取URL, 抓取内容
  • 解析抓取内容,将需要进一步抓取的URL放入工作队列,存储解析后的内容。

抓取策略

  • 深度优先
  • 广度优先
  • PageRank
  • 大站优先策略

如何去重

  • Hash表
  • bloom过滤器

爬虫质量标准

  • 分布式
  • 可伸缩性
  • 性能和有效性
  • 质量
  • 新鲜性
  • 更新
  • 可扩展性

Robots规范与原则

  • Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些网页可以抓取,哪些网页不可以抓取。Robots协议的本质是网站和搜索引擎爬虫的沟通方式,用来指导搜索引擎更好地抓取网站内容,而不是作为搜索引擎之间相互限制和不正当竞争的工具。
  • 详情:http://baike.so.com/doc/4854891-5072162.html

实战

import requests
import xml.etree.ElementTree as ET
from xml.parsers.expat import ParserCreate

class DefaultSaxHandler(object):
    def __init__(self, provinces):
        self.provinces = provinces

    #处理标签开始
    def start_element(self, name, attrs):
        if name != 'map':
            name = attrs['title']
            number = attrs['href']
            self.provinces.append((name, number))

    def end_element(self, name):
         pass

    def char_data(self, text):
        pass

def get_province_entry(url):
    content = requests.get(url).content.decode('gb2312')
    start = content.find('<map name=\"map_86\" id=\"map_86\">')
    end = content.find('</map>')
    content = content[start: end + len('</map>')].strip()    #去掉多余空格
    provinces = []
    #生成Sax处理器
    handler = DefaultSaxHandler(provinces)
    #初始化分析器
    parse = ParserCreate()
    parse.StartElementHandler = handler.start_element
    parse.EndElementHandler = handler.end_element
    parse.CharacterDataHandler = handler.char_data
    #解析数据
    parse.Parse(content)
    return provinces

provinces = get_province_entry('http://www.ip138.com/post')
print(provinces)

猜你喜欢

转载自blog.csdn.net/qq_38195197/article/details/81165742