提示:以下是本篇文章正文内容,下面案例可供参考
概述
HTTP 全称是 HyperText Transfer Protocal (超文本传输协议),从 1990 年开始就在 WWW 上广泛应用,是现今在 WWW 上应用最多的协议,HTTP 是应用层协议,当你上网浏览网页的时候,浏览器和 web 服务器之间就会通过 HTTP 在 Internet 上进行数据的发送和接收。HTTP 是一个基于请求/响应模式的、无状态的协议。即我们通常所说的 Request/Response
特点:
支持客户端/服务器模式
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快
灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记
无连接:无连接的含义是限制每次链接只处理一个请求。服务器处理完哭护的请求,并收到客户的应答后,即断开链接,采用这种方式可以节省传输时间
无状态:HTTP 协议是无状态协议。无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
代码如下(示例):
import urllib
from urllib import request
response = request . urlopen( 'http://baidu.com )
关于http 模拟htmZ源代码解析
虽然内置库urllib库和htm1库可以做。但内置库比较简单核心,不能满足所有需求。
python2时代urllib urllib2
有第三方程序员做了一个新http请求库,比官方更方便,urllib3
又有一个程序员,在urllib3基础上进一步封装 和优化,requests
python3时代内置库统一为urllib,
结论:建议直接第三方requests
三方库
pypi. org上丰 富的各种功能的库。
pip包管理工具
在服务器上没有图形界面的浏览器。开发语言第三方库往往用命令行包管理工具。
解释器/script/pip.exe
pip -V #看pip版本
pip sarch requests #搜索包信息
pip install requests #【重要】安装第三方库
pip uninstall requests # 删除已安装的库
pip List #展示所有已安装过的库
pip freeze > requests #把项目用到的库信息导出到一个文件
方式1:临时换
ipip install requests -i http://simply.aliyun.com/simple/
方式2:永久换
系统用户文件夹下新建. pip文件夹和pip. conf文件,写入配置。
pip config global
方式3(推荐): pycharm设置里面配。
settings/ interpreter/+号/manage repositories/ 添加国内源地址。
参考
pip换源(https://www.cnblogs.com/believepd/p/10499844.html)
豆瓣https://pypi.doubanio.com/simple/
阿里云http://mirrors.aliyun.com/pypi/simple/
清华大学https://pypi.tuna.tsinghua.edu.cn/simple/
import requests
baidu_index = 'https://www.baidu.com'
baidu_search_url = 'http://www.baidu.com/s' #百度是部署在http上的
#伪造请求头,基本反爬措施
headers = {
#'cookies' : '', # 跟公共参数,用户会话有关
#'referer' : '', #从哪一个页面来
#浏览器标识,容易伪造,但没有,肯定是容易被服务器识别出来
'User-agert' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
params = {
'wd' : '天气',
'ie' : 'utf-8'
}
response = requests.get(url=baidu_search_url,params=params,headers=headers)
#状态码
status_code = response.status_code
if status_code ==200:
#网页数据 bytes
content = response.content
#网页数据 str。 一般直接去text属性,但是少数情况解码错误乱码
text = response.text
#百度需要自行解码
text = content.decode('utf-8')
print(text)
url = response.url
headers = response.headers
#调试运行模式
#1 打断点
import requests
response = requests.get(url='https://www.baidu.com')
#状态码
status_code = response.status_code
if status_code ==200:
#网页数据 bytes
content = response.content
#网页数据 str。 一般直接去text属性,但是少数情况解码错误乱码
text = response.text
text = content.decode('utf-8')
print(text)
url = response.url
headers = response.headers
实验结论:方便寻找错误
#我们已经用request 模拟请求,拿到网页源代码,str字符串,里面html格式.
#需要解析
html ='标题
'
start_index = html.find(''
)
end_index = html.find('')
print(html[start_index:end_index])
#解析方式一:正则 regex,专门针对字符串处理的语法
import re
text1 = 'asdpythonfghjkl;'
pattern1 = re.compile(r'python')
matcher1 = re.search(pattern1,text1)
print(matcher1[0])
text2 = 'hello world
'
pattern2 = re.compile(r'.+
')
matcher2 = re.search(pattern2,text2)
print(matcher2[0])
text3 = 'SeLectSELEct '
text4 = 'cat hat pat mat '
text5 = '969501808@qq . com '
#注册验证邮箱、用户名a-z0-9, 6-10位。
#手册 https://tool.oschina.net/uploads/apidocs/jquery/regexp.html
#常用正则https://www.cnblogs.com/qq364735538/p/11099572.html
#总结:字符申处理能力强大,但语法多规则难写。
text6 = """
aaahelloaa
bbb
world
aaa
"""
text7 = """
aaaaa
bbb
world
aaa
"""
pattern10 = re. compile(r'hello.*?world', re.S)
print(pattern10. findall(text6))
pattern11 = re. compile(r'(.*?)'
, re.S)
print(pattern11. findall(text7))
#网页HTML本身就是树状层状结构,按照层次去找
# beautiful_ soup库beautifulsoup 是python2时代的库,小坑: 适合"python3的是beautifulsoup4"
# pip install beautifulsoup4
from bs4 import BeautifulSoup #小坑:代码包名字和包元信息名字不一致
html="""
百度一下
hello
"""
#先把字符串解析成HTML结构,内置库html.parser 三方库lxml
bs = BeautifulSoup(html,'html.parser') #'lxml'
# print(bs.a)
# print(bs.find_all('a'))
# print(bs.a['href'])
# print(bs.a)
#获取父子标签
#总结:
# xpath表达式有自己的语法,但没正则那么复杂,类似bs4库按照HTML层次查找
#pip install lxml
from lxml import etree
html = """
lxml中xpath的用法
first_p_tag
second_p_tag
first_div_tag
11111111
22222222
"""
#把长字符转html 文档树
dom = etree.HTML(html)
# print(dom)
# / 表示往下一层 //忽略任意层父级目录
#/body/ul/li/a
#默认 全文搜索,匹配到则返回空列表,否则【element,element】
print(dom.xpath('//a'))
print(dom.xpath('//ul/li/a'))
# 取html 元素里的属性
# @href 取元素属性值
print(dom.xpath('//a/@href'))
# 取元素内容
# /text()
print(dom.xpath('//a/text()'))
#属性过滤
print(dom.xpath('//a[@id="second_a"]/text()')[0])
#其他语法不常用
几种解析方式的比较:
正则 | xpath | bs4 | |
---|---|---|---|
难度 | 难 | 中 | 简单 |
代码量 | 少 | 少 | 多 |
可读性 | 难 | 中 | 简单 |