爬虫基础知识
1.安装 requests scrapy 豆瓣源 pip install -i 豆瓣源 包名
2.新建虚拟环境时使用 -p 参数指定 Python的版本目录 virtualenv -p pythonpath envXXX
3.网页分类
静态网页
动态网页
webservice
4.爬虫的应用
搜索引擎
推荐引擎
机器学习的数据样本
金融等数据分析
等。。。
5.正则表达式
^:(限定开头) 如果放在中括号[ ]里边就是非 [^1] 不能为1
.:(任意一个字符)
* + {n}:(限定词限定前面)
|:(或)
():括号用于提取子字符串
[ a-z ]:指定字符为中括号中任意一个 1[58347][0-9]{9}: 电话号码验证 1开头 第二位只能是58347中的一位 最后剩下九位只能再0-9之间选择 任何特殊字符进入中括号[ ]就是去特殊意义 [.*] 代表取值.或者取值*
{1},{1,3},{1,}:限定词 指定n-m次
\s:代表空格 只匹配一个字符
\S:代表非空格字符 只匹配一个字符
\w:等同于 [A-Za-z0-9_]
\W:对上面取反
[\u4E00-\u9FA5]:所有中文
\d:数字
&:(限定结尾)
***********************************************************************************************************************************************************************************************************************************************************
^a : 以字母a开头
^a.: 以字母a开头后面任意一个字符
^a.*: 以字母a开头并且后面任意字符
^a.*3$: 以字母a开头并且后面任意字符3$以3结尾 *限定词 0-多次
^a.+3$: 加号用于限定前面的字符至少出现一次 aX3 aXX3 ... +限定词 1-多次
^a.{2}3$: 加号用于限定前面的字符出现两次 aXX3 {1},{1,3},{1,}限定词 指定n-m次
(你\s好): 匹配出 你 好
(你\S好): 匹配出 你很好
import re str = 'wlc123' zhengze = '^w.*' if re.match(zhengze, str): print(True)
import re #用于解释贪婪匹配此案例输出结果为cc 而不是clllllllllc #因此需要添加问号?使得匹配从左往右进行就可以得到clllllllllc了 #只在左边添加?结果会变成cllllllllcc后边还是会贪婪匹配 因此在后边的c之前也要加上? str = 'wwlcllllllllllcc123' zhengze = '.*(c.*c).*' #zhengze = '.*?(c.*?c).*' result = re.match(zhengze, str) print (result.group(1))
import re str = 'study in 吉林大学' #取出字符串中的XX大学 ?取消+号的贪婪匹配 否则林大学就是匹配结果 zhengze = '.*?([\u4E00-\u9FA5]+大学)' result = re.match(zhengze, str) print (result.group(1))
import re str = 'XXX出生于1992年12月11日' str0 = 'XXX出生于1992年12月' str1 = 'XXX出生于1992-12-11' str2 = 'XXX出生于1992/12/11' str3 = 'XXX出生于1992-01' #([月/-]|\d{1,2}|$)) 总结上面四个字符串规则 月可有可无 月后面可有哪一天或者是直接结尾 zhengze = '.*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|\d{1,2}|$))' result = re.match(zhengze, str0) print (result.group(1))
6.深度广度优先遍历算法
网站树结构 分层设计
abc.com
top.abc.com
blog.abc.com
python.abc.com
ios.abc.com
深度优先使用递归(略)
广度优先使用队列(略)
7.url去重的常见策略
1.将url保存到数据库中(最简单)
2.使用set直接使用内存 假设1000000000 * 2byte *50字符 /1024/1024/1024 = 9G 占用较高内存
3.使用md5等方法哈希后保存到set (scrapy使用的是md5映射到相同的位)
4.bitmap方法将url使用哈希函数映射到某一位 缺点会有冲突
5.bloomfilter 对bitmap进行改进多重哈希函数降低冲突 100000000位 /8位/1024/1024 (M)
8.字符串编码
1.GB2312 使用两个字节(8bit)表示一个汉字
2.unicode将所有语言统一到一套编码里面I(16bit)
3.可变长编码utf-8 英文一个字节 汉字三个字节
内存中保存为了节省空间将文件使用utf8编码 在文件中读到内存中使用unicode编码统一长度(好处理)
查看linux默认编码
>>>import sys
>>> sys.getdefaultencoding()
'ascii'
python3 中将所有的编码转变成unicode 已经是unicode所以进行encode编码不会报错
python2中有两种格式
1.中文在linux下是utf8编码 在windows下是gb2312编码
(windows下)解决以上编码错误的方法是 s.decode("gb2312").encode("utf-8")
(Linux下)解决以上编码问题的方法是 s.decode("utf8").encode("utf8")
python2中文也可以直接在中文之间加上u u"我用python"
python3下可以直接encode utf8
decode是将原先的编码(中文在linux下是utf8编码 在windows下是gb2312编码)转换成统一的unicode编码
Thanks Bobby