一、概述
简介
- 网络爬虫是一种按照一定的规则,自动地抓取信息的程序或脚本
特征
- 能按要求下载数据或内容
- 能自动在网络上流串
三大步骤
- 下载网页
- 获取网页地址
- 模拟浏览器发起http请求
- 提取正确的信息
- 格式化数据
- 非格式化数据
- 根据一定规则自动跳转到另外的网页上执行上两部内容
分类
- 通用爬虫
- 专用爬虫
二、下载网页
- 使用到的包
- python3:urllib, urllib3, httplib2, requests
urllib使用
- 包含模块
- urllib.request:打开和读取urls
- urllib.error:包含urllib.request产生的常见的错误(使用try可以捕捉)
- urllib.parse:负责解析url的方法
- urllib.rebotparse:解析robots.txt文件
- 对网址进行编码
- urllib.parse.urlencode({'key':'value})
urllib.request模块
- 访问一个网页的方式
- 打开URL地址
- 简单的GET请求:urllib.request.urlopen(url, data)
- 用于POST请求: urllib.request.Request(url, headers)
- 打开URL地址
- urlopen的返回对象
- urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None)
- 是一个类文件的对象,可以通过read方法、readline方法、read lines方法获取数据
- rsp.read() 是一个byte类型的
- rsp.read().decode() 需要进行解码
- chardet:(第三方包,需要install)可以自动检测页面的编码格式,但是,可能有误
-
- urlopen遇到301会自动跳转
- urlopen返回对象包含的方法
- geturl:返回请求对象的url
- info:请求返回对象的meta信息
- getcode:返回的http code
- request.data的使用
- 访问网络的两种方法
- get
- 利用url参数给服务器传递信息
- 参数为dict,然后用parse编码
- urlopen(url) data为None发起GET请求
- get
- 访问网络的两种方法
-
-
- post
- post是把信息自动加密处理
- 我们如果想使用post信息,需要用到data参数
- 使用post,意味着http的请求头可能需要更改
- content-type:application/x-www.form-urlencode
- content-length:数据长度
- 简而言之,一旦更改请求方法,请注意其他请求头部信息相适应
- post
-
-
- data参数需要编码,urllib.parse.urlencode(data)
- 为了更多的设置请求信息,单纯的通过urlopen已经不满足需求
- 需要利用request.Request类
- request.Request(url, data=None, headers={})
-
-
urllib.error模块
- urllib.error
- URLError产生的原因:
- 没网
- 服务器链接失败
- 不知道指定的服务器
- HTTPError,是URLError的一个子类
- HTTPError: Not Found
- URLError产生的原因:
-
- URLError和HTTPError区别
- HTTPError是对应HTTP请求的返回码错误,如果返回错误码是400以上的,则引发HTTPError
- URLError对应的是网络出现问题,包括url问题
- 关系区别:OSError--URLError--HTTPError
- URLError和HTTPError区别
urllib.request高级
- 上面都是最简单的爬虫使用,随着反爬虫的出现以及对爬虫的要求增多,需要去了解更多高级的功能
- UserAgent(让服务器把爬虫当作浏览器)
- 用户代理;属于headers的一部分,服务器通过UA来判断访问者的身份
- 常见的UA值,使用的时候可以直接复制,也可以用浏览器访问的时候抓包
- 两种方法添加:
- urllib.request.Request("http://www.baidu.com", headers = {"User-Agent": "xxx"} )
- urllib.request.Request.add_header() 添加/修改一个特定的header
- 一直在使用urlopen,它是一个特殊的opener,不支持代理、cookie等其他的HTTP/HTTPS高级功能,所有要支持这些功能:
- 1.使用相关的Handler处理器来创建特定功能的处理器对象;
- 2.然后通过urllib2.build_opener()方法使用这些处理器对象,创建自定义opener对象;
- 3.使用自定义的opener对象,调用open()方法发送请求
- ps:如果程序里所有的请求都使用自定义的opener,可以使用urllib2.install_open()将自定义的opener对象定义为全局opener
- ProxyHandler(代理服务器)
- 使用代理IP,是爬虫的常用手段
- 获取代理服务器的地址:
- http://www.goubanjia.com
- 代理用来隐藏真实访问客户端,代理也不允许频繁访问某一个固定网站,所以代理一定要很多
- 使用步骤
- 设置代理地址
- 创建ProxyHandler
- httpproxy_handler = urllib.request.ProxyHandler({"https": "27.191.234.69:9999"})
-
-
- 创建Opener
- opener = urllib.request.build_opener(httpproxy_handler)
- 创建Opener
-
- 应用代理
- response = opener.open(request) #只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理
- urllib.request.install_opener(opener) #将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理
- 应用代理
-
- cookie & session
- 初始于http协议的无状态特性,为了弥补这个缺陷,所以采用了一个补充协议
- cookie是服务器发放给用户的一段信息,session是保存在服务器上的对应的另一半信息,用来记录用户信息
- 二者区别
- 存放位置不同
- cookie不安全,主要用来做用户验证
- session会保存着服务器上(一般是放在内存中或者数据库中),会过期
- 单个cookie保存数据不超过4k,很多浏览器限制一个站点最多保存20个
- 使用cookie登录
- 手动 req = request.Request(url, headers=headers)
- 自动
- 模块
- CookieJar
- 管理存储cookie,向传出的http请求添加cookie,cookie存储在内存中
- 模块
-
-
-
-
- FileCookieJar(filename, delayload=None, policy=None)
- 使用文件管理cookie,filename是保存cookie的文件
-
-
-
-
-
- MozillaCookieJar(filename, delayload=None, policy=None)
- 创建与mozilla浏览器兼容的FileCookieJar实例
-
-
-
-
-
-
-
- LwpCookieJar
- 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例
-
-
-
-
-
- CookieJar -> FileCookieJar -> MozillaCookieJar & LwpCookieJar
-
-
-
-
-
-
- 使用方法
- 创建cookie对象
- cookie = cookiejar.CookieJar()
- 使用方法
-
-
-
-
- 创建cookie_handler
- cookie_handler = request.HTTPCookieProcessor(cookie)
-
-
-
-
-
-
-
- 创建opener
- opener = request.build_opener(cookie_handler)
- cookie作为一个变量,包含属性
-
-
-
-
- name:名称
- value:值
- domain:可以访问此cookie的域名
- path:
- expires:过期时间
- size:大小
- Http字段 - cookie 保存
- cookie = cookiejar.FileCookieJar('cookie.txt')
- cookie.save(ignore_discard=True, ignore_expires=True) 保存cookie到文件,文件名叫cookie.txt
- 需要在opener.open()后执行,即相当于要在打开网页的时候获取 - cookie 读取
- cookie.load(cookie_file, ignore_discard=True, ignore_expires=True)
-
-
- SSL
- SSL 是指安全套接字层,简而言之,它是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息,包括个人资料
- SSL 证书安装在服务器上
- 单独处理SSL证书,让程序忽略SSL证书验证错误
- js加密
- 参考 https://my.oschina.net/u/4004713/blog/3067132
- 是一种反爬措施
- 经过加密传输的就是密文,但是加密函数或者过程一定是在浏览器完成,也就是一定会把js代码暴露给使用者
- 怎样判断网站有没有使用js加密
- 在请求中,找到Form Data,可以看到有salt和sign
- 最初的账号密码明文传输--->对其进行md5加密--->对其进行加盐
-
- 加盐原理
- 在密码任意固定位置插入特定的字符串,使得进行MD5计算结果和原始密码的MD5结果不同
- 加盐的关键是如何选择盐
- 加盐原理
- ajax
- 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面