第一节:技术选型,爬虫能做什么
技术选型
scrapy vs requests + beautifulsoup
1. requests + beautifulsoup都是库,scrapy是框架
2.scrapy框架中可以加入requests + beautifulsoup
3.scrapy基于twisted,性能是最大的优势
4.scrapy方便扩展,提供了很多内置的功能
5.scrapy内置的css和xpath selector非常方便,beautifulsoup最大的缺点就是慢
网页分类
常见类型的服务
1.静态网页(网页是不会变的)
2.动态网页
3.webservice(restapi)
爬虫能做什么
1.搜索引擎---百度、google、垂直领域搜索引擎
2.推荐引擎---今日头条 (根据我们浏览的习惯)
3.机器学习的数据样本
4.数据分析(如金融数据分析)、舆情分析等
第二-四节:正则表达式
正则表达式介绍
1.为什么必须会正则表达式
2.正则表达式的简单应用及python示例
目录
2.1 特殊字符
^ 开头字符
$ 结尾字符
* /+ 1次或多次
? 非贪婪匹配
{2} 限定出现两次
{2,} 至少出现两次
{2,5} 在2-5次之间
| 表示或者的意思
[ab]c 表示匹配ac或者bc 在中括号中没有特殊含义了
\s 匹配空格
\S 匹配非空格
\w [0-9a-zA-Z_]
\W 非w
[\u4E00-\u9FA5] 匹配汉字
\d 数字
\D 非数字
示例:
```
line = "xiaolinn123"
# regex_str = "^x.*"
#regex_str = ".*3$"
#regex_str = ".*(i.*n).*" #如果不在.*中加上问好,他会匹配到最后一个i的前一个
#regex_str = ".*?(i.*n).*" #加上问号就只匹配到第一个i的前一个
#regex_str = ".*?(i.*?n).*" #非贪婪匹配
#regex_str = ".*(i.{2,5}n).*"
#regex_str = "(xiaolin|xiaolinn)123"
#regex_str = "((xiaolin|xiaolinn)123)"
#regex_str = "([abcdx]iaolinn123)"
# line1 = "小林"
#regex_str = "([\u4E00-\u9FA5]+)"
# line2 = "study in 北京大学"
# regex_str = ".*?([\u4E00-\u9FA5]+)大学"
regex_str = ".*?(\d+)年"
line3 = "出生于2001年"
match_obj =re.match(regex_str,line3)
if match_obj:
print(match_obj.group(1))
# if re.match(regex_str,line):
# print("yes")
#line = "XXX出生于2001年6月1日"
#line = "XXX出生于2001/6/1"
#line = "XXX出生于2001-6-1"
#line = "XXX出生于2001-06-01"
#line = "XXX出生于2001-06"
regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"
match_obj =re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))
```
第五节:深度优先和广度优先
1.网站的树结构
url结构图
www.jobbole.com
然后再分类,下面的文章,等等
可以分为一级域名,二级域名....(有可能可以相互访问)
2.深度优先算法和实现
先从一级域名到二级域名到三级域名,然后走完了
再退回二级域名,再重新到另外一个三级域名
3.广度优先算法和实现
先遍历一级域名
然后再遍历二级域名
接着再遍历三级域名....
第六节:爬虫去重策略
1.将访问过的url保存到数据库中
2.将访问过的url保存到set中,只需要o(1)的代价就可以查询url
100000000*2byte*50个字符/1024/1024/1024 = 9G
3.url经过md5等方法哈希后保存到set中
4.用bitmap方法,将访问过的url通过hash函数映射到某一位
5.bloomfilter方法对bitmap进行改进,多重hash函数降低冲突
第七节:彻底搞清楚unicode和utf8编码
字符串编码
1.计算机只能处理数字,文本转换为数字才能处理。计算机中8个 bit作为1个字节,所以一个字节能表示的最大的数字是255
2.计算机是美国人发明的,所以一个字节可以表示所有字符了,所以ASCII编码就成为美国人的标准编码
3.但是ASCII处理中文明显是不够的,中文不止255个汉字,所以中国制定了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去了,同理,日文,韩文等等上百个国家为了解决这个问题都发展了一套字节的编码,标准就越来越多,如果出现多种语言混合显示就一定会出现乱码
4.越是unicode出现了,将所有语言统一到一套编码里
5.看一下ASCII和unicode编码:
1):字母A用ASCII编码十进制是65
2):汉字“中”已近超出了ASCII编码的范围,用unicode编码是20013,二进制是01001110 00101101
3):A用unicode编码只需要前面补0二进制是00000000 0100 0001
6.乱码问题解决了,但是如果内容全是英文,unicode编码比ASCII需要多一倍的存储空间,同时如果传输需要多一倍的传输
7.所以出现了可变长的编码 utf-8,把英文变长一个字节,汉字3个字节,特别生僻的变成4-6字节,如果传输大量的英文,utf8作用就很明显了
encode("utf-8")