爬虫基础
- 正则表达式
- 深度优先和广度优先遍历算法
- url去重的常见策略
爬虫应用
- 搜索引擎——baidu、Google、垂直领域搜索引擎(知道爬什么内容什么网站)
- 推荐引擎——toutiao
- 机器学习的数据样本
- 数据分析(eg:金融数据分析)、舆情分析等
一、技术选型
技术选型:scrapy + requests
scrapy vs. requests + beatuifulSoup
- requests和beatuifulSoup都是库,scrapy是框架
- scrapy框架中可以加入requests和beatuifulSoup
- scrapy基于twisted,性能优势大
- scrapy易于扩展,提供很多内置功能
- scrapy内置css和xpath selector非常方便,beatuifulSoup慢
二、网页分类
常见类型的服务
- 静态网页
- 动态网页
- webservice(restapi)
三、正则表达式
对爬虫的内容进行处理,eg:5天前==》2019.04.30
特殊字符
- ^ $ * ? {2} {2, } {2, 5} |
- [] [^] [a-z] .
- \s \S \w \W
- [\u4E00-\u9FA5] () \d
# -*- coding:utf-8 -*-
import re
line = "XXX出生于2005年5月5日"
line = "XXX出生于2005年5月"
line = "XXX出生于2005/5/5"
line = "XXX出生于2005-5-5"
line = "XXX出生于2005-05-05"
regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}[日]|[月/-]\d{1,2}|[月/-]$|$))"
match_obj = re.match(regex_str, line)
if match_obj:
print(match_obj.group(1))
四、深度优先和广度优先
1、网站的树结构
网站url的结构图
网站url链接的结构图
2、深度优先算法和实现
输出:A、B、D、E、I、C、F、G、H
==》递归实现
def depth_tree(tree_node):
if tree_node is not None:
print(tree_node._data)
if tree_node._left is not None:
return depth_tree(tree_node._left)
if tree_node._right is not None:
return depth_tree(tree_node._right)
3、广度优先算法和实现
输出:A、B、C、D、E、F、H、G、I
==》队列实现
def level_tree(root):
if root is None:
return
my_queue = []
node = root
my_queue.append(node)
while my_queue:
node = my_queue.pop(0)
print(node._data)
if node._left is not None:
my_queue.append(node._left)
if node._right is not None:
my_queue.append(node._right)
五、爬虫去重策略
常用方法
- 将访问过的url保存到数据库中
- 将访问过的url保存到set中,只需要o(1)的代价就可以查询url。(内存占用越来越大)
- url经过md5等方法哈希后保存到set中
- 用bitmap方法,将访问过的url通过hash函数映射到某一位(冲突高)
- bloomfilter方法对bitmap进行改进,多重hash函数降低冲突。
六、字符串编码
Unicode、utf-8
1、发展
- 计算机只能处理数字,文本转换为数字才能被处理,计算机中8个bit作为一个字节,所以一个字节能表示最大的数字就是255.
- 计算机是美国人发明的,所以一个字符就可以表示所有字符了,所以ASCII(一个字节)编码就成为美国人的标准编码
- 但是ASCII处理中文明显不够,中文不止255个汉字,所以中国定制了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去;同理,日文、韩文等上百个国家为了该问题都创建了一套字节的编码。随着标准越来越多,若出现多种语言混合显示就一定会出现乱码。
- 将所有语言统一到一套编码中——Unicode(两个字节)
- 虽然解决了乱码问题,但是若内容全为英文,则Unicode编码比ASCII需要多一倍的存储空间,同时若传输也需要多一倍的传输。
- 解决方法:utf-8(可变长的编码),将英文变成一个字节,汉字三个字节,特别生僻的变成4-6个字节。 若传输大量的英文,utf-8的作用就明显了。
2、转换
python3
- 文件默认编码是utf-8 , 字符串编码是 unicode
- 以utf-8 或者 gbk等编码的代码,加载到内存,会自动转为unicode正常显示。
python2
- 文件默认编码是ascii , 字符串编码也是 ascii , 如果文件头声明了是gbk,那字符串编码就是gbk。
- 以utf-8 或者 gbk等编码的代码,加载到内存,并不会转为unicode,编码仍然是utf-8或者gbk等编码。