常用获取数据的方式?
- 企业产生的数据
- 数据平台购买的数据
- 政府、机构公开的数据
- 数据管理公司的数据
爬虫的概念?
网络爬虫又称为网页蜘蛛、网络机器人是一种按照一定的规则自动请求万维网网站并提取网络数据程序或脚本
这里数据是指互联网上公开的并且可以访问到的网业信息
爬虫的分类
- 按照使用场景分为通用爬虫和聚焦爬虫
1.1 通用爬虫又被称为全网爬虫
2.1 聚焦爬虫又被称为主题网络爬虫- 按照爬取形式又分为累积式爬虫和增量式爬虫
2.1 增量式爬虫只会在需要时爬行新产生或发生变更页面,并不会重新下载没有发生变化的页面
爬虫爬取步骤
- 选取一些网页、将这些网页的链接地址作为种子URL
- 将这些种子URL放入到带爬取的URL队列中
- 爬虫从待爬取的URL队列中依次读出URL、并通过DNS解析URL、把链接地址转换为网站服务器所对应的IP地址
- 将IP地址和网页对应路径名称交给网页下载器、网页下载器负责页面内容的下载
- 网页下载器将相应的网页内容下载到本地
- 将下载到本地的网页存储到页面库中, 等待建立索引等后续处理;于此同时, 将下载过的网页的URL放入到以爬取的URL队列中,这个队列记载了爬虫系统已经下载过的网页URL,以避免重复下载
- 对于下载过的网页, 从中抽取出所包含的链接信息, 并在已爬取URL中检查其中是否被爬取过, 如果还没被爬取过,则将这个URL放入到待爬取的URL队列中
- 下载被放入到待爬取URL队列中的URL对应的网页, 如此重复(3)~ (7),形成循环,知到待爬队列为空
通用爬虫网页的分类
- 已下载网页
- 已过期网页
- 待下载网页
- 可知网页
- 不可知网页
robots.txt文件
- 它会限定网络爬虫的访问范围,会保护没有被密码保护的页面
- 它使用"#"进行注释,它既可以包含一条记录,又可以包含多条记录
- User-Agent:它用于描述搜索引擎的名字
- Disallow: 改值用于描述不希望被访问到的一个URL,可是完整路径,也可是不完整路径
- Allow: 该项的值用于描述希望被访问到的一组URL
- 它只是一种建议, 没有实际的约束力,网络爬虫可以选择不遵守这个协议
防爬虫的策略
- 设置User-Agent
- 使用代理IP
- 降低访问频率
- 验证码限制
浏览网页的过程
- 浏览器通过DNS服务器查找域名对应的IP地址
- 向IP地址对应的Web服务器发送请求
- Web服务器响应请求, 发回HTML页面
- 浏览器解析HTML内容, 并显示出来
统一资源定位符
- 互联网上的每个文件都有唯一的URL
- URL地址由协议头、服务器地址、文件路径组成
- HTTP的默认端口是80 HTTPS是443
- 一个域名必须对应一个IP地址 一个IP地址可能对应零到多个域名
客户端HTTP请求格式
- HTTP协议的请求消息由:请求行、请求头部、 空行、 和请求数据四部分组成
重要的请求报头:
User-Agent表示客户端身份信息
Accept:指定浏览器或其他客户端可以接受的文件类型。例如:Accept:text/html 表示客户端希望接受html文本
Referer:表示产生请求的网页来自那个URL
Accept-Encoding:指出浏览器可以接受的编码方式 例如:gzip identity
Accept-Charset:指出浏览器可以接受的字符编码
- 常见的字符编码:
- iso-8859-1:英文浏览器默认的编码
- gb2312:标准的简体中文字符集
- utf-8:可以解决多种语言文本显示问题
服务端HTTP响应格式
- 响应报文由四部分组成:状态行、响应报头、空行、响应正文
响应状态码
- 200表示请求成功
- 404表示服务器无法找到请求页面
- 403表示服务器拒绝访问,权限不够
- 500表示请求未完成
urllib库概述
- urllib库是python内置的HTTP请求库
- urllib库包含四大模块:
(1) urllib.request:请求模块
(2) urllib.error:异常处理模块
(3) urllib.parse:URL解析模块
(4) urllib.rebotparser:rebots.txt解析模块
- 分析urlopen()方法
3.1 参数分析urllib.request.urlopen(url, data=None, [timeout, ]*,cafile=None,capath=None, cadefault=False, context=None)
url:可以是URL地址的字符串, 也可以是一个urllib.request对象
data:用来指明向服务器发送请求的额外信息,data参数必须是一个bytes对象
‘’’
data参数的使用
import urllib.request
import urllib.parse
data = bytes(urlloib.parse.urlencode({‘world’:‘hellow’}).encode(‘utf-8))
reponse = urllib.request.urlopen(‘http://httpbin.org/post’, data=data)
print(response.read())
‘’’
4. 构造Request对象
‘’’
import urllib.request
将url作为Request()方法的参数,构造并返回一个Request对象
request = urllib.request.Request(‘http://baidu.com’)
将Request对象作为urlopen()方法的参数,发送给服务器并接受响应
response = urllib.request.urlopen(request)
使用read()方法读取网页内容
html = response.read().decode(‘UTF-8’)
print(html)
‘’’
‘’’
request对象案例
from urllib import request,parse
from fake_useragent import UserAgent
import urllib.request
ua = UserAgent()
headers = {
‘User-Agent’:ua.random
}
url = “http://httpbin.org/post”
dict_demo = {‘name’:“iction”}
data = bytes(parse.urlencode(dict_demo).encode(‘utf-8’))
request = request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode(‘utf-8’)
print(html)
‘’’
URL编码转换
- 当传递URL包含中文或者其他特殊字符(例如:空格或""等)
‘’’
编码
import urllib.parse
data = {
‘a’:‘传智博客’,
‘b’:‘黑马程序员’
}
result = urllib.parse.urlencode(data)
print(result)
解码
import urllib.parse
result = urllib.parse.unquote(‘a=%E4%BC%A0%E6%99%BA%E5%8D%9A%E5%AE%A2&b=%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98’)
print(result)
‘’’
处理GET请求
处理POST请求
添加Headers
- 通过Request.add_headers()添加headers
- 通过Request.get_headers()查看headers
- 通过response.code()可以查看响应状态码
网络异常
- HTTPError是URLError的子类
requests库概述
- requests是基于Python开发的HTTP第三方库,是requests在urllib的基础上进行了高度的封装,它不仅继承了urllib的所有特性, 而且还支持一些其他的特性
- requests库提供了如下常用的类:
(1) requests.Request:表示请求对象
(2) requests.Response:表示响应对象
(3) requests.Session:表示请求会话
Requests类的常用属性
- staus_code :响应状态码
- text:http响应内容的字符串形式
- encoding:设置编码格式
- apparent_encoding:自己分析编码格式
- content:二进制内容
结构化数据?
XML和JSON等
非结构化数据?
办公文档、文本、HTML、图像等
数据解析技术
- 针对文本的解析,有正则表达式
- 针对HTML/XML的解析,有XPath、Beautiful Soup 正则表达式
- 针对JSON的解析,有JSONPath
- 正则表达式,XPath和Beautiful Soup都能实现网页的解析
- JSON模块支持JSONPath语法的使用
xpath语法
Beautiful Soup概述
- Beautiful Soup包含四大对象
(1) bs4.element.Tag类:表示HTML中的标签
(2) bs4.element.NavigableString类:表示HTLML标签中的文本
(3) bs4.BeautifulSoup类:表示HTML DOM中的全部内容,支持遍历文档树和搜索文档树的大部分方法
(4) bs4.element.Comment类:表示标签内字符串的注释部分,是一种特殊的NavigableString类
- bs4解析器的选择顺序是lxml, html5lib, Python标准库
- 如果指定的解析器没有安装,那么Beautiful Soup对象会自动选择其他方案
- 目前只有lxml解析器支持XML文档, 如果没有安装lxml库,就无法得到解析后的对象
css选择器进行搜索
形式:[code] 选择器 {样式}[\code]
其中在{}之前的部分是"选择器",选择器指明了{}中样式的作用对象,也即样式
JSONPath与json模块
- json值可以是字符串 , 数字, 对象, 数组, 逻辑值, null
- 例如:{“name”:“XiaoHong”,“age”:18}
json模块的基本使用
- json.loads():把JSON格式字符串解码转换成Python对象
- json.dumps():把Python类型编码为JSON字符串,返回一个str对象
- json.load():读取文件中JSON形式的字符串元素,转换成Python类型
- json.dump():将Python内置类型序列化为json对象后写入文件