当前位置:   article > 正文

Scrapy爬虫系列笔记之三:正则表达式,url去重策略以及遍历算法_by_书訢_webscraper url正则

webscraper url正则

建议参照目录大纲,即笔记第一篇来了解大致路线后进行博客查阅。每大章的分支都十分清楚

1.2基础知识部分

1.2.1常见类型的服务:

静态网站
动态网站
webservice(restapi)

1.2.2正则表达式的一些应用以及python代码示例:

^s:表示字符串必须以s开头

import re 
string_demo="software2018"
regex_str = "^s.*"
if re.match(regex_str,string_str):
print("yes")
  • 1
  • 2
  • 3
  • 4
  • 5

. :表示可以是任意字符
.*:表示可以任意字符重复任意多次
5$:表示必须以5作为结尾
.+:表示至少有一个字符
中括号模式匹配:[0-9][^9]:表示0-9的数字,非9的数字
\s \S \w \W:分别代表 空格 不为空格 为字符 不为字符(数字,字母)
\d:数字
\d+:多个数字,之前已经用了+
|:表示或者选择

str = "software123"
regex_str = "(software|sooftware)"
match_str = re.match(regex_str,str)
if match_str:
 print(match_str.group(1))
  • 1
  • 2
  • 3
  • 4
  • 5

输出software

str = "software123"
regex_str = "((software|sooftware)123)"
match_str = re.match(regex_str,str)
if match_str:
print(match_str.group(1))
print(match_str.group(2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出software123
software
注意:这里输出的两重(),十分常见

.{1},.{2,},.{2,5}:表示出现一次,出现两次以上,出现2到5次
?:使用非贪婪匹配模式

import re 
string_demo="sooooooossftware2018"
regex_str = ".*(s.*s).*"
match_str = re.match(regex_str,string_str):
if match_str:
 print(match_str.group(1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出为ss

import re 
string_demo="sooooooossftware2018"
regex_str = ".*?(s.*s).*"
match_str = re.match(regex_str,string_str):
if match_str:
 print(match_str.group(1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出为soooooooss

import re 
string_demo="sooooooossftware2018"
regex_str = ".*?(s.*?s).*"
match_str = re.match(regex_str,string_str):
if match_str:
 print(match_str.group(1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出为sooooooos
使用?就是为了防止去除贪婪模式
贪婪模式详细说明:

左边的?如果不加的话,就会采取向右最后一个能够满足条件的
右边的,如果不加的话,就算在向左寻找的过程中寻找到了,也还会向左继续找,直到最后一个满足条件的被找到

1.2.3深度优先和广度优先

深度优先和广度优先是爬虫最基础的爬取方式了,算法在数据结构课上也是重中之重,当然实现起来也很简单,递归方式和非递归方式都可以。

1.2.4 URL去重策略

1.将访问过的url存到数据库中

2.将访问过的url访问到内存中,只需要要O(1) 的代价就可以查询url

3.url经过MD5等方法哈希后存到set中

4.用bitmap方法,将访问过的url通过hash函数映射到某一位

5.bloomfilter方法对bitmap进行改进,多重hash函数降低冲突


我们分析一下各种方式的优缺点:
1.使用数据库:每次都要去数据库中进行查找,虽然有缓存但是还是很慢

2.url保存在内存当中:直接存储内存消耗太大(一千万就大概需要900多MB了)

3.url经过MD5hash后保存到set中:MD5一般编码到128bit=16byte,scrapy也是采用这种方式(大概掌握这种就OK了)

4.用bitmap将访问过的url映射到某一个具体的位。但是容易冲突,hash来防止冲突,但是冲突还是比较多的。这个方式压缩内存非常大。

5.怎么样才能够有bitmap的方式进行存url,同时又可以减少冲突呢?
使用第五种方式,即bollmfilter,后面会再写

以上就是scrapy爬虫笔记系列第一节的内容


笔记一到十链接
http://blog.csdn.net/sx_csu2016sw/article/details/79284369
http://blog.csdn.net/sx_csu2016sw/article/details/79284427
http://blog.csdn.net/sx_csu2016sw/article/details/79284449
http://blog.csdn.net/sx_csu2016sw/article/details/79284469
http://blog.csdn.net/sx_csu2016sw/article/details/79284481
http://blog.csdn.net/sx_csu2016sw/article/details/79284491
http://blog.csdn.net/sx_csu2016sw/article/details/79284509
http://blog.csdn.net/sx_csu2016sw/article/details/79284525
http://blog.csdn.net/sx_csu2016sw/article/details/79284547
http://blog.csdn.net/sx_csu2016sw/article/details/79284567

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/976954
推荐阅读
相关标签
  

闽ICP备14008679号