技术选型:
Scrapy vs requsts+beautifulsoup
1,reqests,beautifulsoup都是库,Scrapy是框架 2,Scrapy中可以加入requests beautifulsoup 3,Scrapy基于twisted,异步IO框架,性能最大的优势 4,Scrapy 扩展方便,提供了许多内置功能 5,内置css和xpath selector(都是c写的)非常方便,beautifulsoup(是纯python写的缺点就是慢)
网页分类
1,静态网页
2,动态页面 3,webservice(restapi)
爬虫能做什么
1,搜索引擎,百度google,垂直领域的搜索引擎
2,推荐引擎,--今日头条 3,机器学习的数据样本 4,数据分析,金融分析
正则表达式
1,为什么学习
精细化提取
2,基础内容 特殊字符 1) ^:^b 必须以b开头 . : 代表任意字符 * :前面出现的字符任意多次 $ : b$ 必须以b结尾的 ? :非贪婪匹配模式,尽量少的匹配 + :前面出现的字符出现(1,+00) {2} : 前面的字符出现了两次 {3,}:前面的字符出现了最少3次 {2,5} : 前面的字符出现了2-5次 | : 数线 或的关系,先提取前面的 2) [] : [abc] 从abc中都选一个都可以;[0-9a-Z]区间;[.]进入[]中的.*等没特殊意义; [^1] 排除1的都可以匹配 手机号: "1[48357][0-9]{9}" 3) \s : 空格 \S : 只要不是空格就匹配了 \w : 等价于[a-zA-Z0-9_] \W : 除了[a-zA-Z0-9_]都匹配 4) [\u4E00-\u9FA5] :值提取中文 \d : 数字体会一下非贪婪匹配: 匹配boooobby 中的boooob1 import re2 a = "aaboooobby123"3 match_obj = re.match(".*?(b.*?b).*",a)4 if match_obj:5 print(match_obj.group(1)) #输出匹配子串16 # ".*(b.*b).*" --> bb 贪婪匹配,从左边开始匹配或者7 #说从右边开始找到最后一个符合条件的8 # ".*?(b.*b).*" --> boooobb 括号中是贪婪匹配,直至找到最后一个b9 #".*?(b.*?b).*" --> boooob 都是非贪婪匹配
网站的深度优先和广度优先
深度优先:
对于二叉树,先考虑一边,往深了寻找
Scrapy 默认也是深度优先,递归算法实现 广度优先:优先兄弟节点而不是子节点;按每层遍历
通过队列形式实现URL去重:
1,将URL报存到数据库,麻烦,慢 2,保存到set中,只需要O(1)代价就能查询URL
但是:一亿 100000000*2byte*50个字符/1024/1024=9G 小型爬虫一亿不多 3,url 经过md5等方法哈希后保存到set中 Scrapy采用的就是此;可将字符缩短到固定一般长度16个byte 4,bitmap方法将访问的URL通过hash函数映射到某一位 缺点:冲突可能性较大 5,bloomfilter方法对bitmap进行改进,多重hash函数降低冲突