第一节:技术选型,爬虫能作什么
技术选型
scrapy vs requests + beautifulsoup
1. requests + beautifulsoup都是库,scrapy是框架
2.scrapy框架中能够加入requests + beautifulsoup
3.scrapy基于twisted,性能是最大的优点
4.scrapy方便扩展,提供了不少内置的功能
5.scrapy内置的css和xpath selector很是方便,beautifulsoup最大的缺点就是慢css
网页分类
常见类型的服务
1.静态网页(网页是不会变的)
2.动态网页
3.webservice(restapi)python
爬虫能作什么
1.搜索引擎---百度、google、垂直领域搜索引擎
2.推荐引擎---今日头条 (根据咱们浏览的习惯)
3.机器学习的数据样本
4.数据分析(如金融数据分析)、舆情分析等web
第二-四节:正则表达式正则表达式
正则表达式介绍
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 非数字算法
示例:数据库
```api
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))scrapy
```
第五节:深度优先和广度优先
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个字节,因此一个字节能表示的最大的数字是2552.计算机是美国人发明的,因此一个字节能够表示全部字符了,因此ASCII编码就成为美国人的标准编码3.可是ASCII处理中文明显是不够的,中文不止255个汉字,因此中国制定了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去了,同理,日文,韩文等等上百个国家为了解决这个问题都发展了一套字节的编码,标准就愈来愈多,若是出现多种语言混合显示就必定会出现乱码4.越是unicode出现了,将全部语言统一到一套编码里5.看一下ASCII和unicode编码:1):字母A用ASCII编码十进制是652):汉字“中”已近超出了ASCII编码的范围,用unicode编码是20013,二进制是01001110 001011013):A用unicode编码只须要前面补0二进制是00000000 0100 00016.乱码问题解决了,可是若是内容全是英文,unicode编码比ASCII须要多一倍的存储空间,同时若是传输须要多一倍的传输7.因此出现了可变长的编码 utf-8,把英文变长一个字节,汉字3个字节,特别生僻的变成4-6字节,若是传输大量的英文,utf8做用就很明显了encode("utf-8")