第三章:爬虫基础知识回顾

第一节:技术选型,爬虫能做什么
技术选型
scrapy vs requests + beautifulsoup
1. requests + beautifulsoup都是库,scrapy是框架
2.scrapy框架中可以加入requests + beautifulsoup
3.scrapy基于twisted,性能是最大的优势
4.scrapy方便扩展,提供了很多内置的功能
5.scrapy内置的css和xpath selector非常方便,beautifulsoup最大的缺点就是慢

网页分类
常见类型的服务
1.静态网页(网页是不会变的)
2.动态网页
3.webservice(restapi)

爬虫能做什么
1.搜索引擎---百度、google、垂直领域搜索引擎
2.推荐引擎---今日头条 (根据我们浏览的习惯)
3.机器学习的数据样本
4.数据分析(如金融数据分析)、舆情分析等

第二-四节:正则表达式

正则表达式介绍
1.为什么必须会正则表达式
2.正则表达式的简单应用及python示例
目录
2.1 特殊字符
^ 开头字符
$ 结尾字符
* /+ 1次或多次
? 非贪婪匹配
{2} 限定出现两次
{2,} 至少出现两次
{2,5} 在2-5次之间
| 表示或者的意思
[ab]c 表示匹配ac或者bc 在中括号中没有特殊含义了
\s 匹配空格
\S 匹配非空格
\w [0-9a-zA-Z_]
\W 非w
[\u4E00-\u9FA5] 匹配汉字
\d 数字
\D 非数字

示例:

```

line = "xiaolinn123"
# regex_str = "^x.*"
#regex_str = ".*3$"
#regex_str = ".*(i.*n).*" #如果不在.*中加上问好,他会匹配到最后一个i的前一个
#regex_str = ".*?(i.*n).*" #加上问号就只匹配到第一个i的前一个
#regex_str = ".*?(i.*?n).*" #非贪婪匹配
#regex_str = ".*(i.{2,5}n).*"
#regex_str = "(xiaolin|xiaolinn)123"
#regex_str = "((xiaolin|xiaolinn)123)"
#regex_str = "([abcdx]iaolinn123)"
# line1 = "小林"
#regex_str = "([\u4E00-\u9FA5]+)"
# line2 = "study in 北京大学"
# regex_str = ".*?([\u4E00-\u9FA5]+)大学"
regex_str = ".*?(\d+)年"
line3 = "出生于2001年"
match_obj =re.match(regex_str,line3)
if match_obj:
print(match_obj.group(1))
# if re.match(regex_str,line):
# print("yes")

#line = "XXX出生于2001年6月1日"
#line = "XXX出生于2001/6/1"
#line = "XXX出生于2001-6-1"
#line = "XXX出生于2001-06-01"
#line = "XXX出生于2001-06"
regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"

match_obj =re.match(regex_str,line)
if match_obj:
print(match_obj.group(1))

```

第五节:深度优先和广度优先
1.网站的树结构
url结构图
www.jobbole.com
然后再分类,下面的文章,等等
可以分为一级域名,二级域名....(有可能可以相互访问)

2.深度优先算法和实现
先从一级域名到二级域名到三级域名,然后走完了
再退回二级域名,再重新到另外一个三级域名

3.广度优先算法和实现
先遍历一级域名
然后再遍历二级域名
接着再遍历三级域名....

第六节:爬虫去重策略
1.将访问过的url保存到数据库中
2.将访问过的url保存到set中,只需要o(1)的代价就可以查询url
100000000*2byte*50个字符/1024/1024/1024 = 9G
3.url经过md5等方法哈希后保存到set中
4.用bitmap方法,将访问过的url通过hash函数映射到某一位
5.bloomfilter方法对bitmap进行改进,多重hash函数降低冲突

第七节:彻底搞清楚unicode和utf8编码
字符串编码
1.计算机只能处理数字,文本转换为数字才能处理。计算机中8个 bit作为1个字节,所以一个字节能表示的最大的数字是255
2.计算机是美国人发明的,所以一个字节可以表示所有字符了,所以ASCII编码就成为美国人的标准编码
3.但是ASCII处理中文明显是不够的,中文不止255个汉字,所以中国制定了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去了,同理,日文,韩文等等上百个国家为了解决这个问题都发展了一套字节的编码,标准就越来越多,如果出现多种语言混合显示就一定会出现乱码
4.越是unicode出现了,将所有语言统一到一套编码里
5.看一下ASCII和unicode编码:
1):字母A用ASCII编码十进制是65
2):汉字“中”已近超出了ASCII编码的范围,用unicode编码是20013,二进制是01001110 00101101
3):A用unicode编码只需要前面补0二进制是00000000 0100 0001
6.乱码问题解决了,但是如果内容全是英文,unicode编码比ASCII需要多一倍的存储空间,同时如果传输需要多一倍的传输
7.所以出现了可变长的编码 utf-8,把英文变长一个字节,汉字3个字节,特别生僻的变成4-6字节,如果传输大量的英文,utf8作用就很明显了
encode("utf-8")

   
   

原文地址:https://www.cnblogs.com/linyujin/p/9795112.html

时间: 2024-11-05 18:39:35

第三章:爬虫基础知识回顾的相关文章

第三章 nodejs基础知识(上)

本章主要介绍一些nodejs的基础知识: 1. 什么是nodejs中的控制台,如何向控制台进行标准输出流与标准错误输出流的输出: 2. 什么是nodejs中的全局作用域,在nodejs中预先提供了哪些全局函数以及全局变量: 3. 什么是nodejs中的事件处理机制以及事件环进制,如何在nodejs中为各种事件指定事件触发以及事件取消时执行的回调函数: 4. 如何使用nodejs 中的调试器进行应用程序的调试: 3.1 nodejs中的控制台 在nodejs中,使用console对象代表控制台.在

【Linux系列】【基础版】第三章 Shell基础知识

3. Shell基础知识     3.1 Shell的由来         3.1.1 Bourne Agin Shell         3.1.2 其他的shell, 有 zsh, ksh等     3.2 查看有没有shell         3.2.1 yum list | grep zsh         3.2.2 ls /root/.bash_history         3.2.3 echo $HISTSIZE -> vi /etc/profile 修改HISTSIZE的值 -

第三章 Linux基础知识

3.1 程序的组成与执行过程 3.1.1 三种编程接口 在前面几章我们已经粗略的说过,面向计算机通常有三种编程接口,分别是: a) 硬件规格 b) 系统调用 c) 库调用 每个CPU的生产厂商在生产一个计算芯片时,这个芯片本身有其内置的指令集,所以有一部分人在编程时直接面向这些指令集进行,这类编程方式就是面向硬件规格编程. 3.1.2 程序执行过程 前面我们说过,Intel x86系列的CPU,通常由外而内,指令集是分布在4个环上的,环0上的是特权指令,只能由操作系统执行,环3上的是普通指令,可

python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding:utf-8from com.wenhy.crawler_baidu_baike import url_manager, html_downloader, html_parser, html_outputer print "爬虫百度百科调度入口" # 创建爬虫类class SpiderMai

JS基础知识回顾:ECMAScript的语法(三)

ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符.位操作符.关系操作符和相等操作符. ECMAScript操作符的与众不同之处在于,他们能够适用于很多值,例如字符串.数字值.布尔值.甚至是对象. 在将这些操作符应用于对象时,相应的操作符通常都会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值. 只能操作一个值的操作符叫做一元操作符. 递增和递减操作符直接借鉴自C,各有前置型和后置型两个版本:a++.++a.a--.--a 这四种操作符不仅适用于整

JS基础知识回顾:引用类型(三)

ECMAScript通过RegExp类型来支持正则表达式. 使用类似Perl的语法就可以创建一个正则表达式:var expression=/pattern/flags; 其中模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类.限定符.分组.向前查找以及反向引用. 每个正则表达式都可以带有一个或多个标志(flags),用以标注正则表达式的行为. 正则表达式的匹配模式只是下列三个标志: g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即

java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:

总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但是实现Runnable接口可以处理同一个资源. 下面我们做个测试:验证下.车站的售票系统售票的例子,车站的各个售票口相当于各个线程,我们先使用第一种方法几继承Thread类的方式实现: 代码如下: package com.lp.ecjtu.Thread; /** * * @author Admini

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字节的值,该如何在它上面调用方法? 二:值类型转换为引用类型--装箱 2.1CLR对值类型进行装箱时:新分配托管堆内存,将值类型的实例字段拷贝到新分配的内存中,返回托管堆中新分配对象的地址.这个地址就是一个指向对象的引用. int i = 10; Object obj = i; 三:将引用类型转换为值

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub