python分布式爬虫:爬虫基础知识

技术选型

scrapy vs requests + beautifulsoup

1,requests和beautifulsoup都是库,scrapy是框架
2,scrapy框架中可以加入requests和beautifulsoup
3,scrapy基于twisted(异步I/O),性能是最大的优势
4,scrapy方便扩展,提供了很多内置的功能
5,scrapy内置的css和xpath selector非常方便,beautifulsoup最大的缺点就是慢(对HTML进行分析)

网页分类

常见类型的服务
1,静态网页(静态博客)
2,动态网页
3,webservice(restapi)

爬虫能做什么

爬虫作用
1,搜索引擎--百度,google,垂直领域搜索引擎
2,推荐引擎--今日头条
3,机器学习的数据样本
4,数据分析(如金融数据分析),舆情分析等。

正则表达式

目录:
1,特殊字符

  1. ^ $ * ? + {2} {2,} {2,5} |
  2. [] [^] [a-z] .
  3. \s \S \w \W
  4. [\u4E00-\u9FA5] () \d

2,正则表达式的简单应用及python示例
栗子1:

import  re

line = "bobby123"
regex_str = "^b.*"
if re.match(regex_str,line):
    print("yes")

栗子二:

import  re

line = "boooooooobby123"
regex_str = ".*?(b.*?b).*"
mathch_obj = re.match(regex_str,line)
if mathch_obj:
    print(mathch_obj.group(1))

当没有加 ? 的时候是贪婪匹配(从最后开始匹配),加了之后是非贪婪模式(从前面开始匹配)。

注意: [ ] 里面的特殊字符不再有特殊含义,[ * ]就是匹配 *

栗子三:

import  re

line = "你 好"
regex_str = "(你\s好)"
mathch_obj = re.match(regex_str,line)
if mathch_obj:
    print(mathch_obj.group(1))

栗子四:

import  re

line = "你好s"
regex_str = "([\u4E00-\u9FA5]+)"
mathch_obj = re.match(regex_str,line)
if mathch_obj:
    print(mathch_obj.group(1))

使用[\u4E00-\u9FA5]可以匹配连续的中文
我们看下一个字符串中除了中文还有其它字符的时候,我们想提取大学前面和大学

import  re

line = "study in 南京大学"
regex_str = ".*?([\u4E00-\u9FA5]+大学)"
mathch_obj = re.match(regex_str,line)
if mathch_obj:
    print(mathch_obj.group(1))

深度优先和广度优先

目录:
1,网站的树结构
2,深度优先算法和实现
3,广度优先算法和实现

网站url的结构图:伯乐在线

Paste_Image.png

网站设计是分层的,多级域名的。

网站url链接的结构图

Paste_Image.png

为了防止循环爬取,对已经爬取过的链接新建一个list存放。在爬取之前,我们进行一次判断,如果没有爬取过,才爬取。

深度优先图:

Paste_Image.png

深度优先:每次爬取到无链接可爬取为止,然后向上层返回查找。
广度优先:每次爬取当前页面可访问的所有兄弟节点。(分层)
1,深度优先输出A,B,D,E,I,C,F,G,H(递归实现)
2,广度优先输出A,B,C,D,E,F,G,H,I(队列实现)

深度优先过程:

In [1]: def depth_tree(tree_node):
   ...:     if tree_node is not None:
   ...:         print(tree_node._data)
   ...:         if tree_node._left is not None:
   ...:             return depth_tree(tree_node._left)
   ...:         if tree.node._right is not None:
   ...:             return depth_tree(tree_node._right)
   ...:

注意:递归太深会导致栈溢出

广度优先过程:

In [4]: def level_queue(root):
   ...:     """利用队列实现树的广度优先遍历"""
   ...:     if root is None:
   ...:         return
   ...:     my_queue = []
   ...:     node = root
   ...:     my_queue.append(node)
   ...:     while my_queue:
   ...:         node = my_queue.pop(0)
   ...:         print (node.elem)
   ...:         if node.lchild is not None:
   ...:             my_queue.append(node.lchild)
   ...:         if node.rchild is not None:
   ...:             my_queue.append(node.rchild)
   ...:

爬虫去重策略

1,将访问过的url保存到数据库中
(每次拿到一个新的url都会去数据库查询是否被爬取过,效率低)
2,将访问过的url保存到内存set中,只需要O(1)的代价就可以查询url
假设有一亿个url,占用内存:
1000000002byte50个字符/1024/1024/1024 = 9G
3,url经过md5等方法哈希后保存到set
经过编码之后,可以对数据压缩
4,用bitmap方法,将访问过的url通过hash函数映射到某一位
将url映射到byte的位上,但是具有高冲突
5,bloomfilter方法对bitmap进行改进,多重hash函数降低冲突

字符串编码

image.png
image.png

utf8编码在保存和网络传输的时候,使用的空间较小。
而unicode编码在编程的时候,因为字节统一,便于编程。

因此文件文件保存的时候,我们保存为utf-8的格式,读取到内存的时候,我们转化为Unicode编码。当由内存保存至文件的时候,我们再将编码改为utf-8的编码格式。

Paste_Image.png

获取系统默认编码

In [1]: import sys

In [2]: sys.getdefaultencoding
Out[2]: <function sys.getdefaultencoding>

In [3]: sys.getdefaultencoding()
Out[3]: 'utf-8'

想要encode之前要保证字符串是Unicode格式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • scrapy学习笔记(有示例版) 我的博客 scrapy学习笔记1.使用scrapy1.1创建工程1.2创建爬虫模...
    陈思煜阅读 12,587评论 4 46
  • Python版本管理:pyenv和pyenv-virtualenvScrapy爬虫入门教程一 安装和基本使用Scr...
    inke阅读 59,560评论 6 99
  • 音频朗读 我在黑暗中向你划去 世界一片静谧 我飘荡在寂夜里 手脚并用呵 赤手空拳的游往你的岸 我在时间的洋流中向你...
    赵不弃阅读 189评论 0 1
  • 今天下午董老师的引领内容一直在我脑海里重现,我在回忆,我是怎么一步步在董老师的带领下一直聚焦聚焦聚焦到最终的那个想...
    cherrylih阅读 98评论 0 0
  • 聊赠一枝春(欣然) @二胖的这张照得好,前景实后景虚,虚实结合又以虚衬实,枝桠横斜交错,...
    yiyi_1650阅读 148评论 1 2