爬虫实战前的知识储备

爬虫定义

爬虫:一个自动抓取互联网上信息的脚本

爬虫可以解决的问题

(1)解决冷启动问题。

(2)搜索引擎的根基:做搜索引擎少不了爬虫。

(3)建立知识图谱,帮助建立机器学习知识图谱。

(4)可以制作各种商品的比价软件,趋势分析。

爬虫工程师必备技能

初级爬虫工程师

1.web 前端的知识: HTML、CSS、JavaSc1ipt、 DOM、 DHTML 、Ajax、jQuery、json 等;

2、正则表达式, 能提取正常一般网页中想要的信息,比如某些特殊的文字, 链接信息, 知道什么是懒惰, 什么是贪婪型的正
则;

3、会使用 XPath 等获取一些DOM 结构中的节点信息;

4、知道什么是深度优先, 广度优先的抓取算法, 及实践中的使用规则;

5、能分析简单网站的结构, 会使用urllib或requests 库进行简单的数据抓取。

中级爬虫工程师

1、了解什么事HASH,会简单地使用MD5,SHA1等算法对数据进行HASH一遍存储

2、熟悉HTTP,HTTPS协议的基础知识,了解GET,POST方法,了解HTTP头中的信息,包括返回状态码,编码,user-agent,cookie,session等

3、能设置user-agent进行数据爬取,设置代理等

4、知道什么事Request,什么事response,会使用Fiddler等工具抓取及分析简单地网络数据包;对于动态爬虫,要学会分析ajax请求,模拟制造post数据包请求,抓取客户端session等信息,对于一些简单的网站,能够通过模拟数据包进行自动登录。

5、对于一些难搞定的网站学会使用phantomjs+selenium抓取一些动态网页信息

6、并发下载,通过并行下载加速数据爬取;多线程的使用。

高级爬虫工程师

1、能够使用Tesseract,百度AI,HOG+SVM,CNN等库进行验证码识别。

2、能使用数据挖掘技术,分类算法等避免死链。

3、会使用常用的数据库进行数据存储,查询。比如mongoDB,redis;学习如何通过缓存避免重复下载的问题。

4、能够使用机器学习的技术动态调整爬虫的爬取策略,从而避免被禁IP封禁等。
   能使用一些开源框架scrapy,scrapy-redis等分布式爬虫,能部署掌控分布式爬虫进行大规模数据爬取。

搜索引擎

1.主要组成

通用爬虫:就是将互联网的上页面整体的爬取下来之后,保存到本地。

问题探讨:通用爬虫要想爬取网页,需要网站的url.但是搜索引擎是可以搜索所有网页的。那么通用爬虫url就要涉及到所有网页,这个‘所有’是如何做到的。

(1)新网站向搜索引擎主动提交网址
(2)在其他网站上设置新网站外链。
(3)搜索引擎和DNS解析服务商(如DNSPod等)合作,新网站域名将被迅速抓取。

2.工作流程

第一步:抓取网页
	通过将待爬取url加入到通用爬虫的url队列中,进行网页内容爬取
第二步:数据存储
	将爬取下来的网页保存到本地。这个过程会有一定的去重操作。如果某个网页的内容大部分重复,搜索引擎可能不会保存
第三步:预处理
	提取文字
	中文分词
	消除噪音(比如版权声明文字、导航条、广告等。。。)	
	索引处理
第四步:
	设置网络排名,为用户提供检索服务

3.局限性

1.搜索引擎只能爬取原网页,但是90%的内容都是无用的。
2.搜索引擎不能满足不同行业,不同语言的特定要求
3.通过搜索引擎只能爬取文字信息,对于视频,文件,音频等其他信息无法爬取
4.只能基于关键字查询,无法基于语义查询

聚焦爬虫

定义:

聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息

爬虫准备工作

robots协议

定义

网络爬虫排除标准

作用

告诉搜索引擎哪些内容可以爬,哪些不能爬

sitemap

一个网站地图,可以指导我们查看该网页下有哪些内容。

https://help.bj.cn/

估算网站大小

在百度中输入:site:目标网站的地址。

builtwith

为了更好的了解网站,抓取该网站的信息,我们可以先了解一下该网站大致所使用的的技术架构。

安装

builtwith:pip install bulitwith

使用:在python交互环境下,输入

import buildwith
buildwith.parse(‘http://www.sina.com.cn’)

python-whois

有时候,我们需要知道网站的所有者是谁,这里在技术上有个简单地方法可以参考:

安装

pip install python-whois

使python的交互模式下输入:

import whois
whois.whois(‘http://www.sina.com.cn’)

http和https

http协议/https协议定义

http:超文本传输协议

它是一个规范。----约束发布和接收html页面的规范。

HTTPS (Hypertext Transfer Protocol over Secure Socket Layer)简单讲是http的安全版,在http下加入SSL层

端口号

http协议的端口号:80

https协议的端口号:443

http协议的特点

1.是一个应用层的协议
2.无连接:每次请求都是独立的(在http 1.1 增加了一个Connection: keep-alive,这个头表示,客户端和服务器的连接是一个长连接。)
3.无状态:无状态表示客户端每次请求都不能记录请求状态。也就是两条请求之间无法进行通信。

url:统一资源定位符

1.http://ip:port/path
ip:可以定位电脑
port:端口号---用来从互联网上进入电脑。
path:就是为了在电脑中找到对应的资源路径。

2.有三种特殊符号
?:问好后面就是请求参数。?username='zhangsan'&password='123'
&:请求参数用&连结。?username='zhangsan'&password='123'
#:表示锚点:锚点就是在请求这个url时,页面会跳入锚点指定位置。

3.基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
  scheme:协议(例如:http, http, ftp)
  host:服务器的IP地址或者域名
  port:服务器的端口(如果是走协议默认端口,缺省端口80)
  path:访问资源的路径
  query-string:参数,发送给http服务器的数据
  anchor:锚(跳转到网页的指定锚点位置)

在python中,有一个模块可以帮助我们解析url。

from urllib import parse
url = 'http://localhost.com:8080/index.htm?username="zhangsan"&password="123"'

print(parse.urlparse(url))

输出内容:
ParseResult(
	scheme='http', 
	netloc='localhost.com:8080', 
	path='/index.htm', 
	params='',
	query='', 
	fragment=''
)

http工作过程

(1)地址解析,将url解析出对应的内容:			
	scheme:协议(例如:http, http, ftp)
	host:服务器的IP地址或者域名
	port:服务器的端口(如果是走协议默认端口,缺省端口80)
	path:访问资源的路径
	query-string:参数,发送给http服务器的数据
	anchor:锚(跳转到网页的指定锚点位置)

(2)封装http请求数据包
(3)封装成TCP包,建立TCP连接(TCP的三次握手)
	TCP握手协议 
	第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 
	SYN:同步序列编号(Synchronize Sequence Numbers)
	第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 
	第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
	完成三次握手,客户端与服务器开始传送数据
(4)客户端发送请求。
(5)服务器发送响应。
(6)服务器关闭tcp连接。

问题探讨:当我们在浏览器输入一个url,为什么可以加载出一个页面?(为什么,在抓包的过程中,请求了一个url,会出现很多的资源请求。)

(1)当我们在浏览器输入一个url,客户端会发送这个url对应的一个请求到指定服务器获取内容。
(2)服务器收到这个请求,解析出对应的内容,之后将内容封装到响应里面发送给客户端。比如index.html页面。
(3)当客户端拿到这个html页面,会查看这个页面中是否有css、js、image等url,如果有,在分别进行请求,获取到这些资源。
(4)客户端会通过html的语法,将获取到的所有内容完美的显示出来。

客户端请求

1.组成:请求行、请求头部、空行、请求数据四个部分组成

2.请求方法get/post

(1).get请求:

get,获取--->从服务器上获取资源--->通过请求参数来告诉服务器获取什么资源。--->请求参数是在url里面用&进行拼接的,也就是?后面的内容。---->所以不安全--->传输参数大小受限。

(2).post请求

post,传递--->向服务器传递数据---->数据是封装在请求的实体。--->可以传递更多内容--->更安全。

(3).get和post区别

(1)get是从服务器获取内容,post是向服务器传递内容
(2)get不安全,因为参数拼接在url后面。post比较安全,因为参数是放在是实体里面。
(3)get传参大小受限,post不受限。

3.重要的请求头

User-Agent:客户端请求标识。
Accept: (传输文件类型)允许传入的文件类型。
Referer :表明产生请求的网页来自于哪个URL,用户是从该Referer页面访问到当前请求的页面。
cookie (cookie):在做登录的时候需要封装这个头。
Content-Type (POST数据类型)

发送POST请求时,需要特别注意headers的一些属性:

Content-Length: 144: 是指发送的表单数据长度为144,也就是字符个数是144个。
X-Requested-With: XMLhttpRequest :表示Ajax异步请求。

服务响应

1.组成:状态行,响应头,空行,响应正文

2.重要的响应头

Content-Type:text/html;charset=UTF-8:告诉客户端,资源文件的类型,还有字符编码

3.状态码

100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
200~299:表示服务器成功接收请求并已完成整个处理过程。常用200(OK 请求成功)。	
300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。
400~499:客户端的请求有错误,常用404(服务器无法找到被请求的页面)、403(服 务器拒绝访问,权限不够---DDos)。
500~599:服务器端出现错误,常用500(请求未完成。服务器遇到不可预知的情况)。

hash加密

1.给一个字符串进行加密

import hashlib 
def get_str_hex(value):
	## 创建一个md5实例对象
    md5 = hashlib.md5()
    ## 将需要加密的内容updata到md5对象中
    ### 首先要将字符串转换为bytes类型
    ###两种方法
    	### str.encode('utf-8')
        ### bytes(str,'utf-8')
    md5.update(value.encode('utf-8'))
    return md5.hexdigest()

2.给一个文件进行加密

import hashlib
def get_file_hex(filename):
    ### 声明一个块,标志一次读取多少
    chunk_size = 1024
    ### 创建md5实例对象
    md5 = hashlib.md5()
    ### 将文件按照声明的块进行读取
    with open(filename,'r',encoding='utf-8') as fp:
        chunk = fp.read(chunk_size)
        if chunk:
            md5.update(bytes(chunk,encoding='utf-8'))
        return md5.hexdigest()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值