爬虫
- 前提知识:
- URL
- HTTP协议
- web前端,html css js
- ajax
- re,Xpath
- XML
爬虫的定义
- 百度上详细的介绍
- 三大步骤:
- 下载信息
- 提取正确的信息
- 根据一定的规则自定跳到另外的网页上执行的两步内容
- 爬虫分类
- 通用爬虫
- 专用爬虫
- pyhon网络包简介
- 2.X ----
- 3.x----urllib,urllib3,httplib2,requests
urllib
- 包含模块
- urllib.request:打开和读取模块的urls
- urllib.error:包含urllib.request产生的常见错误,使用try捕捉
- urllib.parse: 包含即系url的方法
- urllib.robotparse:解析robots.txt文件
- 案例V1
- 网页编码问题解决
- chardet 可以自动检测网页的编码格式,但是可能有误
- 需要安装 conda install chardet
- 案列V2
- urlopen的返回项
- geturl:返回请求对象
- info:请求返回对象的meta对象
- getcode:返回对象的请求状态码
- request.code
- 访问网络的两种方法
- get:实际上利用参数给服务器传递信息,参数用dict,然后用parse编码
- post:一般使用的服务器传递参数的方式
- post是把信息自动加密
- 如果使用post信息需要用到data参数
- 使用post意味着Http的请求头可以需要更改:
- Content-Type:applocation/x-www.from-urlencode
- Content-Length:数据长度
- 也就是说,一旦更改请求方法,需要注意其他请求头部信息相适应
- urllib.parse,urlencode可以将上字符串改为网络协议的
- 案例V4
- 案例V4
- 为了更多的设置我们的请求信息,单纯的使用urlopen已经不是很好用了
- 需要利用request.Request()类
- 案例V6
- urllib.error:
- 产生原因:
- 没网
- 服务器链接失败
- 不知道指定的服务器
- 是osError的子类
- 案例V7
- 产生原因:
- HTTPError:是URLError的一个子类
- 案例V8
- UserAgent
- UserAgent:用户代理简称UA,属于Headers的一部分,服务器通过UA来判断访问者的身份
- 设置UA可以使用
- heads
- add_heads
- 案例V9
- 访问网络的两种方法
- ProxyHandler 代理服务器
- 使用代理IP,爬虫的常用手段
- 获取代理服务器的地址:
- 代理用来隐藏真实访问汇总,代理也不允许频繁访问某一个固定网站,所以代理一定要很多
- 基本使用代理的设置:
- 设置代理地址
- 创建ProxyHandler
- 创建Opener
- 安装Opener
- 案例V10
cookie & session
- 由于http协议的无记忆性,人们为了弥补这个缺憾,所采用的一个补充协议
- cookie是发送给用户的一半信息,session是保存在服务器的另一半的信息,用来记录信息
- cookie和session的区别:
- 存放位置不同
- cookie不安全
- session会在服务器上一段时间,会过期的
- 单个cookie保存不超过4K,很多浏览器限制一个站点最多为20个
- session 存放位置
- 存放在服务器
- 一般情况,session是存放在数据库中
- cookie 登陆
- 模拟登陆人人网
- V11
- 使用Cookie登陆
- 直接把cookie复制下来,然后手动放入请求头
- V12
- http模块包含我们可以使用的cookie的模块,自动使用cookie
- CookieJar
- 管理存储Cookie,向传出的http请求添加Cookie
- cookie存储在内存里,CookieJar实例回收后cookie将消失
- FileCookieJar
- 使用文件管理cookie
- filename是保存Cookie的文件
- MozillaCookieJar
- 创建Mozilla浏览器Cookie.txt兼容的FileCookieJar实例
- LwqCookieJar
- 创建于libwww-perla标准兼容的Set-Cookie3格式的FileCookieJar
- 他们的关系是:Cookie Jar–>FileCookieJar–>MozillaCookieJar&LwqCookieJar
- 利用Cooke Ja访问人网
- 案例13
- 自动使用Cookie登陆
- 打开登陆界面后自动通过账户密码登陆
- 自动提取反馈的Cookie
- 利用提取的Cookie登陆隐私页面
- handler是Headler的实例
- 常用的有
- 创建cookie实例
- cookie = cookiejar.CookieJar()
- 生成cookie的管理器
- cookie_handler = request.HTTPCookieProcessor(cookie)
- 创建http请求管理器
- http_handler = request.HTTPHandler()
- 生成http管理器
- https_handler = request.HTTPSHandler()
- 创建请求管理器
- opener = request.build_opener(http_handler,https_handler,cookie_handler)
- 创建handler后,使用opener打开,打开后相应的handler进行使用
- cookie作为一个变量打印出来
- 案例V14
- cookie属性
- name :名称
- value:值
- domain :可以访问此cookie的域名
- path:看可以访问的cookie的页面路经
- expirse:过期信息
- size:大小
- http字段
- cookie的保存—FileCookieJar
- 案例15
- cookie的读取
- 案例16
- CookieJar
SSL
- SSL证书就是指 遵守SSL安全套结层协议的服务器数字证书
- CA(CertifacateAuthority)是数字认证中心
- 遇到不信任的SSL证书处理方法
- 案例V17
JS加密
- 有的反爬虫策略采用js对于传输的数据进行加密通常是md5值
- 经过加密就是密文但是,加密函数或者过程一定是在浏览器完成,也就是将JS的代码暴露给使用人
- 通过阅读加密算法,就可以模拟出加密过程,从而进行破解
- 案例V18
- 使用V18和V19进行对比
- 记住JS一定被保存在本地,然后去找加密算法
AIAX
- 实质就是一段js代码,是我们的网页进行异步请求
- 一定会有url,请求方法
- 使用一般的json格式
- 案例20
- 一般GET方式使用的参数的形式发送
- post使用的是form的方法,也方便于加密
Requests 模块宪哥人类的模块
- 继承了urlllib的所有方法
- 底层使用了urllib3
- 开源
- 有中文的地址
- 安装 pip install request
- get请求:
- request.get(url)
- request.request(‘get’,url)
- 可带有headers和parmas参数
- 案例21
- get的返回内容
- 案例22
- post
- rsp = resquest.post(url,data)
- 案例23
- data,headers要求是dict类型
- proxy 代理
- proxy = {
“http”:“地址”
“HTTPs”:‘地址’
}
rsp = requests.request(“get”,“http::…”,proxies=proxy)
- proxy = {
- 用户验证
- 代理验证
- 可能使用的HTTP basic Auth可以这样
- 格式就是用户名:密码@代理地址:端口号
- proxy = {“http”:“china:123456@192.168.1.1:8888”}
- res = request.get(“http://www.baidu.com”,proxies=proxy)
- 代理验证
- web 客户端验证
- 如过遇到需要验证就是添加auth=(用户名,密码)
- autu=(“用户名”,‘’密码"’)
- res = request.get(“http://www.baidu.com”,auth=autu)
- cookie
- request可以自动处理cookie信息
- rsp = requests.get(url)
- 如果对方服务器传送过来cookie信息,则可以考虑反馈的cookie属性得到的,返回一个cookie的实例
- cookieJar = rsp.cookies
- 可以将cookie转换成字典
- cookiedict = requests.utils.dict_from_cookiejar(cookieJar)
- request可以自动处理cookie信息
- session
- 和服务器上的session不一样啦
- 模拟一次会话,从客户端历览器开始链接服务器,到客户端断开
- 能让我我们跨请求时保持某些参数,比如说在同一个session实例发出的有的请求之间cookie
- 创建session对象时候,可以保存cookie值
- ss = requests.session()
- headers = {“User-Agent”:“XXXXXXx”}
- data = {“name”:“XXXXXXx”}
- 此时有创建的session管理请求,负责发出请求
- ss.post(“http://www.baidu.com”, data=data,headers=headers)
- rsp = ss.get(“XXXXXX”)
- https验证SSL证书
- 参数verify负责表示是否需要SSL 证书,默认需要TRUE
- 如果不需要SSL证书验证,则false
- rsp = requests.get(“https:”,verify=false)
爬虫数据的处理
- 结构数据:先有结构,再谈数据
- json文件
- json Path
- 转换成相应的Python类型操作(json类)
- XML
- 转换成python的类型(xmtodict)
- Xpath
- CSS选择器
- 正则
- json文件
- 非结构数据:先有数据,再谈结构
- 文本
- 电话号码
- 邮箱地址
- 通常处理这种数据时使用正则表达式
- Html文件
- 正则
- Xpath
- CSS选择器
正则表达式
- 一套股则,可以在字符串文本中搜查替换等等
- 案例24,基本的正则的使用规则
- 案例match的基本使用
- 常用的方法:
- match :从开始位置查找,只匹配一次
- search: 从任何位置开始查找,一次匹配
- findall:全部查找,返回列表
- finditer:全部匹配,返回迭代
- spilt:分割字符,返回列表
- sub:替换
- 匹配中文
- 匹配Unicode范围主要在【u4e00-u9fa5]
- 案例V27
- 贪婪于非贪婪
- 贪婪模式:在整个表达式或者匹配成功的前提下,尽可能多的匹配
- 非贪婪模式:尽可能少的匹配
XML
- XML(ExtensibilityleMarkLanguage)
- http://www.w3cschool
- 案例V28
- 概念;父节点,子节点,先辈节点,兄弟节点,后代节点
Xpath
- Xpath(XML Path language)
- w3school
- 常用路径表示式
lxml库
- 案例29
- 解析html
- 文件读取 html
- etree和xpath配合使用
- 案例V31
CSS选择器 beatifulsoup4
几种工具的比较
- 正则:快,不好用不用安装
- beatifulsoup 慢使用简单
- lxml: 比较快
- 使用beatifulsoup的案例
- 案例V32
beautifulSoup
- 四大对象
- Tag
- NavigableString
- Beautifulsoup
- Comment
- Tag
- 对应HTML标签
- 通过soup,tag_name()
- tag两个重要
- name
- 属性
- 案例V33
- NavigableString
- 对应内容值
- Beautifulsoup
- 表示一个文档的内容
- comment
- 特殊的NavigableString对象
- 对其输出,则内容不包括注释符号
- 遍历对象
- contents: tag的子节点列表的方式输出
- children:子节点义迭代的形式返回
- descendants:所有孙节点、
- string
- 案例34
- 搜索文档对象
- find_all(name,arrts,recursive,text,** kwaargs**)
- name:按照字符串搜索,可以收入的内容
- 字符串
- 正则表达式
- 列表
- keywortd参数,表示属性
- text :对应tag的文本值
- CSS选择器