1、能够使用Tesseract,百度AI,HOG+SVM,CNN等库进行验证码识别。
2、能使用数据挖掘技术,分类算法等避免死链。
3、会使用常用的数据库进行数据存储,查询。比如mongoDB,redis;学习如何通过缓存避免重复下载的问题。
4、能够使用机器学习的技术动态调整爬虫的爬取策略,从而避免被禁IP封禁等。
能使用一些开源框架scrapy,scrapy-redis等分布式爬虫,能部署掌控分布式爬虫进行大规模数据爬取。
一个程序脚本—>自动的抓取互联网上信息的脚本。
1. 第一步:抓取网页
通过搜索引擎将待爬取的url加入到通用爬虫的url队列中,进行网页内容的爬取
2. 第二步:数据存储
将爬取下来的网页保存到本地,这个过程会有一定的去重操作,如果某个网页的内容大部分内容都会重复,搜索引擎可能不会保存
3. 第三步:预处理
4. 第四步:设置网站排名,为用户提供服务
A.通用爬虫:就是将互联网的上页面整体的爬取下来之后,保存到本地。
通用爬虫要想爬取网页,需要网站的url.但是搜索引擎是可以搜索所有网页的。那么通用爬虫url就要涉及到所有网页,这个‘所有’是如何做到的。
B.聚焦爬虫:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
为了更好的了解网站,抓取该网站的信息,我们可以先了解一下该网站大致所使用的的技术架构。
①安装builtwith:
Import buildwith
Buildwith.parse(‘http://www.sina.com.cn’)
②使用:在python交互环境下,输入:
Import buildwith
Buildwith.parse(‘http://www.sina.com.cn’)
1.安装python-whois:pip install python-whois
2.使python的交互模式下输入:
Import whois
Whois.whois(‘http://www.sina.com.cn’)
1.什么是http协议?
2.端口号
3.http协议的特点
4.url:统一资源定位符
scheme:协议(例如:http, http, ftp)
host:服务器的IP地址或者域名
1.port:服务器的端口(如果是走协议默认端口,缺省端口80)
2.path:访问资源的路径
3.query-string:参数,发送给http服务器的数据
4.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='')
5.http工作过程
(1)地址解析,将url解析出对应的内容:scheme:协议(例如:http, http, ftp)
(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连接
6.当我们在浏览器输入一个url,为什么可以加载出一个页面?为什么在抓包的过程中请求了一个url,会出现很多的资源请求?
7.客户端请求
①组成:请求行、请求头部、空行、请求数据四个部分组成
② 请求方法get/post
③重要的请求头:
User-Agent:客户端请求标识。
Accept: (传输文件类型)允许传入的文件类型。
Referer :表明产生请求的网页来自于哪个URL,用户是从该Referer页面访问到当前请求的页面。
cookie (cookie):在做登录的时候需要封装这个头。
Content-Type (POST数据类型)
发送POST请求时,需要特别注意headers的一些属性:
Content-Length: 144: 是指发送的表单数据长度为144,也就是字符个数是144个。
X-Requested-With: XMLhttpRequest :表示Ajax异步请求。
8.服务响应
import hashlib
#对一个字符串进行hash
def hash_str(text):
md5 = hashlib.md5()
md5.update(bytes(text,encoding='utf-8'))
return md5.hexdigest()#返回密文的16进制格式
#--------------------------------------------------
#对文件进行hash
#对文件进行hash要避免把文件全部读出来在进行
chuckSize = 4096
def hash_file(filename):
h = hashlib.sha256()
with open(filename,'rb') as f:
while True:
chuck = f.read(chuckSize)
if not chuck:
break
h.update(chuck)
return h.hexdigest()#得到文件最终的hash
# -----------------------------------------1.用递归方式完成斐波那契数列。
# 方法1
def Fbnq(num):
if num == 1 or num == 2:
return 1
else:
return Fbnq(num - 1) + Fbnq(num - 2)
num = int(input('输入数字:'))
print(Fbnq(num))
# 方法2
a, b, c = 0, 1, []
for i in range(num):
if num == 1:
a = 1
c.append(a)
else:
a, b = b, a + b
c.append(a)
print(c)
#--------------------------------------------------------------------
# 2.用递归的方法,获取一个列表的最大值和最小值。
from copy import deepcopy
def GetMax(list):
if len(list) == 1:
return list[0]
else:
if list[0] > list[1]:
del list[1]
else:
del list[0]
return GetMax(list)
def GetMin(list):
if len(list) == 1:
return list[0]
else:
if list[0] > list[1]:
del list[0]
else:
del list[1]
return GetMin(list)
list = [1, 2, 3, 0, -5, 99, 213, -32]
list_copy = deepcopy(list)
print('该列表最大值:', GetMax(list))
print('该列表最小值:', GetMin(list_copy))