1. 什么是爬虫
网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
由于专门用于检索信息的“机器人”程序象蜘蛛一样在网络间爬来爬去,因此,搜索引擎的“机器人”程序就被称为“蜘蛛”程序。
2. python 开发环境搭建
上手容易
免费开源,使用不受限制
解释执行,跨平台不受限制
面向对象
框架和库支持丰富,有大量的历史积累
3. 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: 用来将局部修改应用于某一资源
(get, post 用的比较多)
HTTP常见状态码
- 200/OK: 请求成功
- 201/Created: 请求已被实现,且一个新资源已根据请求被建立,URI跟随Location头信息返回。
- 202/Accepted: 服务器已接受请求,但尚未处理。
- 400/Bad Request: 请求无法被服务器理解常见情况:格式错误
- 401/Unauthorized: 当前请求需要用户验证用户名,密码错误
- 403/Forbidden: 服务器已理解请求,但拒绝执行。没有权限等
- 404/Not Found
4. HTML/XML/Json简介
HTML (Hypertext Markup Language)
- 推荐教程:HTML
- HTML不是编程语言,而是一种标记语言。即HTML使用标记标签来描述网页。
- 标签和元素
<标签 属性=>"属性的值"</标签>
- DOM文档模型
在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM
就是一个大数组
文本<body>
-段落1<p>...</p>
-列表<ul>....</ul>
-文本
-图片<imgsrc..>...
-段落2
- XML
eXtensible Markup Language
ROOT
-E1 (node)
-G1
-G1 ->属性/值
-E2
-E3
<node attr=value>...</node>
XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据。
- Json
语法类似XML,但是更小、更快、更容易解析。对JavaScript特别友好。
5. MySQL/Apache安装和配置
MySQL
- Windows:
下载免费社区版mysql server。
客户端操作可以使用
MySQLworkbench - Linux(以debian为例):
apt-get install mysql-server mysql-client
登陆mysql: mysql -p hostname -u username -p,然后使用use dbname指定需要操作的数据库
安装phpmyadmin方便在浏览器操作数据库 - SQLite
本地数据库
Windows直接去下载可执行文件即可使用,Linux下apt-get install sqlite3即可完成安装。
相比mysql更加轻便好用。
大数据情况下效率变差,适合单机小程序。 - MySQL常用命令
show databases: 显示当前服务器上的数据库
create database dbname: 创建一个新数据库
use dbname: 使用指定的数据库
show tables: 显示当前数据库的所有表
desc tbname: 显示表结构
6. 爬虫框架介绍
- 爬虫工作流程
将种子URL放入队列
从队列中获取URL,抓取内容。
解析抓取内容,将需要进一步抓取的URL放入工作队列,存储解析后的内容 - 抓取策略
深度优先
广度优先
PageRank: 根据PR值对网站进行排序
大站优先策略 - 如何去重
Hash表
bloom过滤器:实际商业大型应用使用bloom过滤器,优点:节省内存 - 爬虫质量标准
-分布式:效率
-可伸缩性
-性能和有效性
-质量
-新鲜性
-更新
-可扩展性
扯得远点
-Map/Reduce背后
-bloom过滤器
7. robots 规范和爬虫原则
- Robots规范
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。Robots协议的本质是网站和搜索引擎爬虫的沟通方式,用来指导搜索引擎更好地抓取网站内容,而不是作为搜索引擎之间互相限制和不正当竞争的工具。
详情:http://baike.so.com/doc/4854891-5072162.html
import
import
def get_province_entry(url):
#todo
province = get_province_entry('httpp//.....')
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):
# 获取文本,并用gb2312解码
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)
# 初始化分析器
parser = ParserCreate()
parser.StartElementHandler = handler.start_element
parser.EndElementHandler = handler.end_element
parser.CharacterDataHandler = handler.char_data
# 解析数据
parser.Parse(content)
# 结果字典为每一页的入口代码
return provinces
provinces = get_province_entry('http://www.ip138.com/post')
print(provinces)