python网络爬虫
一.Requests库 自动爬取HTML页面 自动网络请求提交
1.Resquests库入门
1.get()方法:r=requests.get(url)
r.status_code --HTTP请求的返回状态,200表示成功
r.text --url对应的页面内容
r.encoding --从HTTP header中猜测的响应内容的编码方式
r.apparent_encoding --从内容中分析出的响应内容编码方式(备选编码方式)
r.content --HTTP响应内容的二进制形式
2.Requests的异常
requests.ConnectionError --网络连接错误异常,如DNS查询失败、拒绝连接等
requests.HTTPError --HTTP错误异常
requests.URLRequired --URL缺失异常
requests.TooManyRedirects --超过最大重定向次数,产生重定向异常
requests.ConnectTimeout --连接远程服务器超时异常
requests.Timeout --请求URL超时,产生超时异常
r.raise_for_status() --如果不是200,产生异常 requests.HTTPError
3.Requests库的七个主要方法:
requests.request() 构造一个请求,支撑以下各方法的基础方法
--所有方法的基础
requests.request(method, url, **kwargs)
∙ method : 请求方式,对应get/put/post等7种
∙ url : 拟获取页面的url链接
∙ **kwargs: 控制访问的参数,共13个:
params : 字典或字节序列,作为参数增加到url中
data : 字典、字节序列或文件对象,作为Request的内容
json : JSON格式的数据,作为Request的内容
headers : 字典,HTTP定制头
cookies : 字典或CookieJar,Request中的cookie
auth : 元组,支持HTTP认证功能
files : 字典类型,传输文件
timeout : 设定超时时间,秒为单位
proxies : 字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects : True/False,默认为True,重定向开关
stream : True/False,默认为True,获取内容立即下载开关
verify : True/False,默认为True,认证SSL证书开关
cert : 本地SSL证书路径
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.get(url, params=None, **kwargs)
∙ url : 拟获取页面的url链接
∙ params : url中的额外参数,字典或字节流格式,可选
∙ **kwargs: 12个控制访问的参数
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.head(url, **kwargs)
∙ url : 拟获取页面的url链接
∙ **kwargs: 12个控制访问的参数
requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.post(url, data=None, json=None, **kwargs)
∙ url : 拟更新页面的url链接
∙ data : 字典、字节序列或文件,Request的内容
∙ json : JSON格式的数据,Request的内容
∙ **kwargs: 12个控制访问的参数
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.put(url, data=None, **kwargs)
∙ url : 拟更新页面的url链接
∙ data : 字典、字节序列或文件,Request的内容
∙ **kwargs: 12个控制访问的参数
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.patch(url, data=None, **kwargs)
∙ url : 拟更新页面的url链接
∙ data : 字典、字节序列或文件,Request的内容
∙ **kwargs: 12个控制访问的参数
requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE
requests.delete(url, **kwargs)
∙ url : 拟删除页面的url链接
∙ **kwargs: 12个控制访问的参数
4.HTTP协议
HTTP,Hypertext Transfer Protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议
HTTP协议采用URL作为定位网络资源的标识,URL格式如下:
http://host[:port][path]
host: 合法的Internet主机域名或IP地址
port: 端口号,缺省端口为80
path: 请求资源的路径
5.通用代码框架
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return "产生异常"
二.robots.txt 网络爬虫排除标准
网络爬虫的限制:
• 来源审查:判断User‐Agent进行限制
检查来访HTTP协议头的User‐Agent域,只响应浏览器或友好爬虫的访问
• 发布公告:Robots协议
告知所有爬虫网站的爬取策略,要求爬虫遵守
Robots协议:
作用:
网站告知网络爬虫哪些页面可以抓取,哪些不行
形式:
在网站根目录下的robots.txt文件
三.Beautiful Soup库 解析HTML页面
Beautiful Soup库入门 (美味汤)
简单使用:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>data</p>', 'html.parser')
Beautiful Soup库是解析、遍历、维护“标签树”的功能库
Beautiful Soup库的引用
Beautiful Soup库,也叫beautifulsoup4 或 bs4
约定引用方式如下,即主要是用BeautifulSoup类
1.from bs4 import BeautifulSoup
2.import bs4
Beautiful Soup库解析器
bs4的HTML解析器 BeautifulSoup(mk,'html.parser') --安装bs4库
lxml的HTML解析器 BeautifulSoup(mk,'lxml') --pip install lxml
lxml的XML解析器 BeautifulSoup(mk,'xml') --pip install lxml
html5lib的解析器 BeautifulSoup(mk,'html5lib') --pip install html5lib
BeautifulSoup类的基本元素
Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
Name 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name
Attributes 标签的属性,字典形式组织,格式:<tag>.attrs
NavigableString 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型
基于bs4库的HTML内容遍历方法
标签树的下行遍历
.contents 子节点的列表,将<tag>所有儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历
标签树的上行遍历
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点
标签树的平行遍历 --平行遍历发生在同一个父节点下的各节点间
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签
bs4库的prettify()方法:
.prettify()为HTML文本<>及其内容增加更加'\n'
.prettify()可用于标签,方法:<tag>.prettify()
bs4库的编码:
bs4库将任何HTML输入都变成utf‐8编码
Python 3.x默认支持编码是utf‐8,解析无障碍
四.信息标记与提取方法 Re 正则表达式 提取页面关键信息
信息的标记:
标记后的信息可形成信息组织结构,增加了信息维度
标记的结构与信息一样具有重要价值
标记后的信息可用于通信、存储或展示
标记后的信息更利于程序理解和运用
HTML通过预定义的<>…</>标签形式组织不同类型的信息
信息标记的三种形式:
XML 标签 Tag
JSON 有类型的键值对 key:value
YAML 无类型键值对 key:value
比较:
XML 最早的通用信息标记语言,可扩展性好,但繁琐
JSON 信息有类型,适合程序处理(js),较XML简洁
YAML 信息无类型,文本信息比例最高,可读性好
信息提取:
方法一:完整解析信息的标记形式,再提取关键信息
XML JSON YAML
需要标记解析器,例如:bs4库的标签树遍历
优点:信息解析准确
缺点:提取过程繁琐,速度慢
方法二:无视标记形式,直接搜索关键信息
搜索
对信息的文本查找函数即可
优点:提取过程简洁,速度较快
缺点:提取结果准确性与信息内容相关
融合方法:结合形式解析与搜索方法,提取关键信息
XML JSON YAML 搜索
需要标记解析器及文本查找函数
基于bs4库的HTML内容查找方法:
<>.find_all(name, attrs, recursive, string, **kwargs)
∙ name : 对标签名称的检索字符串
∙ attrs: 对标签属性值的检索字符串,可标注属性检索
∙ recursive: 是否对子孙全部检索,默认True
∙ string: <>…</>中字符串区域的检索字符串
五.Projects 实战项目
爬取图片:
import requests
path = "D://ABC.jpg"
url = "http://tupian.baike.com/ipad/a0_64_76_20300001349415131407760417677_jpg"
r = requests.get(url)
try:
r = requests.get(url)
r.raise_for_status()
with open(path,'wb') as f:
f.write(r.content)
f.close()
except:
print("产生异常")
print(r.status_code)
IP地址归属地查询
import requests
url = "http://m.ip138.com/ip.asp?ip="
r = requests.get(url)
try:
r = requests.get(url+'202.204.80.112')
r.raise_for_status()
print(r.text[-500:])
except:
print("产生异常")
print(r.status_code)
bs4库的基本实现:
import requests
url = "https://python123.io/ws/demo.html"
try:
r = requests.get(url)
demo = r.text
r.raise_for_status()
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo,'html.parser')
print(soup.prettify())
except:
print("产生异常")
print(r.status_code)
大学排名:
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
def printUnivList(ulist, num):
print("{:^10}\t{:^6}\t{:^10}".format("排名","学校名称","总分"))
for i in range(num):
u=ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs
main()