爬虫基础知识

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

posted @ 2017-11-03 21:02  WangLC  阅读(218)  评论(0编辑  收藏  举报