【爬虫笔记】爬虫基础


爬虫基础

  • 正则表达式
  • 深度优先和广度优先遍历算法
  • url去重的常见策略

爬虫应用

  • 搜索引擎——baidu、Google、垂直领域搜索引擎(知道爬什么内容什么网站)
  • 推荐引擎——toutiao
  • 机器学习的数据样本
  • 数据分析(eg:金融数据分析)、舆情分析等

一、技术选型

技术选型:scrapy + requests
scrapy vs. requests + beatuifulSoup

  • requests和beatuifulSoup都是库,scrapy是框架
  • scrapy框架中可以加入requests和beatuifulSoup
  • scrapy基于twisted,性能优势大
  • scrapy易于扩展,提供很多内置功能
  • scrapy内置css和xpath selector非常方便,beatuifulSoup慢

二、网页分类

常见类型的服务

  • 静态网页
  • 动态网页
  • webservice(restapi)

三、正则表达式

对爬虫的内容进行处理,eg:5天前==》2019.04.30

特殊字符

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

在这里插入图片描述
在这里插入图片描述

# -*- coding:utf-8 -*-
import re

line = "XXX出生于2005年5月5日"
line = "XXX出生于2005年5月"
line = "XXX出生于2005/5/5"
line = "XXX出生于2005-5-5"
line = "XXX出生于2005-05-05"

regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}[日]|[月/-]\d{1,2}|[月/-]$|$))"
match_obj = re.match(regex_str, line)
if match_obj:
	print(match_obj.group(1))

四、深度优先和广度优先

1、网站的树结构

网站url的结构图
在这里插入图片描述
网站url链接的结构图
在这里插入图片描述

2、深度优先算法和实现

在这里插入图片描述
输出:A、B、D、E、I、C、F、G、H
==》递归实现

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)

3、广度优先算法和实现

在这里插入图片描述
输出:A、B、C、D、E、F、H、G、I
==》队列实现

def level_tree(root):
	if root is None:
		return
	my_queue = []
	node = root
	my_queue.append(node)
	while my_queue:
		node = my_queue.pop(0)
		print(node._data)
		if node._left is not None:
			my_queue.append(node._left)
		if node._right is not None:
			my_queue.append(node._right)

五、爬虫去重策略

常用方法

  1. 将访问过的url保存到数据库中
  2. 将访问过的url保存到set中,只需要o(1)的代价就可以查询url。(内存占用越来越大)
  3. url经过md5等方法哈希后保存到set中
  4. 用bitmap方法,将访问过的url通过hash函数映射到某一位(冲突高)
  5. bloomfilter方法对bitmap进行改进,多重hash函数降低冲突。

六、字符串编码

Unicode、utf-8

1、发展

  • 计算机只能处理数字,文本转换为数字才能被处理,计算机中8个bit作为一个字节,所以一个字节能表示最大的数字就是255.
  • 计算机是美国人发明的,所以一个字符就可以表示所有字符了,所以ASCII(一个字节)编码就成为美国人的标准编码
  • 但是ASCII处理中文明显不够,中文不止255个汉字,所以中国定制了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去;同理,日文、韩文等上百个国家为了该问题都创建了一套字节的编码。随着标准越来越多,若出现多种语言混合显示就一定会出现乱码。
  • 将所有语言统一到一套编码中——Unicode(两个字节)
  • 虽然解决了乱码问题,但是若内容全为英文,则Unicode编码比ASCII需要多一倍的存储空间,同时若传输也需要多一倍的传输。
  • 解决方法:utf-8(可变长的编码),将英文变成一个字节,汉字三个字节,特别生僻的变成4-6个字节。 若传输大量的英文,utf-8的作用就明显了。

2、转换

在这里插入图片描述
在这里插入图片描述
python3

  • 文件默认编码是utf-8 , 字符串编码是 unicode
  • 以utf-8 或者 gbk等编码的代码,加载到内存,会自动转为unicode正常显示。

python2

  • 文件默认编码是ascii , 字符串编码也是 ascii , 如果文件头声明了是gbk,那字符串编码就是gbk。
  • 以utf-8 或者 gbk等编码的代码,加载到内存,并不会转为unicode,编码仍然是utf-8或者gbk等编码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值