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)