urllib
urllib是python内部自带的一个用于爬虫的组件
- 如何使用urllib
GET
- 1 导入
from urllib import request
- 2 发起请求
- <1> 创建一个request对象
url > 目标url地址
data=None 默认为None 表示是一个get请求 反之为post请求
headers={} 请求头
- <2> 发起请求
import ssl
context = ssl._create_unverified_context()
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
req = request.Request(
url='http://www.baidu.com',
headers=headers
)
response = request.urlopen(
req,timeout=20,context=context
)
解释一些参数
url > 发起请求的目标url地址
data=None 默认为None 表示是一个get请求 反之为post请求
timeout=socket._GLOBAL_DEFAULT_TIMEOUT 设置请求超时的时间
context=None 忽略ssl认证
- 3.得到响应结果
code = response.code # 响应状态码
content = response.read() # 读取页面源码
headers = response.headers # 响应头
print(code,len(content),headers)
POST
- 1 post请求一般会传递表单数据 需要导入
from urllib import request
from urllib import parse
import json
- 同样需要构建请求头 发起请求 传递表单数据 发起请求 需要对对表单数据进行编码转译
decode的作用是将其他编码的字符串转换成unicode编码 encode的作用是将unicode编码转换成其他编码的字符串
isinstance(str,unicode) 用来判断字符串是否为unicode
url = 'http://127.0.0.1:8000/api/login/'
data = {
'username':'13546214522',
'password':'123456',
}
# 对表单数据进行转换转换成url编码格式
data=parse.urlencode(data).encode('utf-8')
print('============================',data)
# 添加请求头 构建请求
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
req = request.Request(url=url,data=data,headers=headers)
response = request.urlopen(req,timeout=10)
- 有些时候 需要考虑异常的处理
try:
response = request.urlopen(req,timeout=10)
except error.HTTPError as err:
print(err.code)
print(err.headers)
print(err.reason)
except error.URLError as err:
print(err.reason)
- 获取到数据后 取值
注意json格式的数据和python数据之间的转换
json.loads() json->python
json.dumps() python->json
json.load() 将本地文件中的json->python
json.dump() python->json并写入本地文件
if response.code == 200:
content = response.read().decode('utf-8')
result = json.loads(content)
print(result['token']) |
print(result.get('token','暂无'))
Proxy
-
有些时候考虑到反爬 我们需要设置代理 通过自定义opener方法设置代理 发起请求
-
导入+设置ssl认证
from urllib import request
import ssl
context = ssl._create_unverified_context()
- 自定义opener 支持发起请求 忽略ssl认证
https_handler = request.HTTPSHandler(
debuglevel=1,
context=context,
)
参数解释
debuglevel=1,一种调试模式 1和0两个值
- 创建ProxyHandler代理处理器 允许发起请求设置代理
proxies = {
'http':'192.168.1.111:8080',
'https':'192.168.1.121:8080',
}
proxy_handler = request.ProxyHandler(proxies=proxies)
参数解释
proxies 设置代理,是一个字典
proxy_handler ProxyHandler代理处理器
- 根据处理器自定义opener
opener = request.build_opener(https_handler,proxy_handler)
- 将opener设置为全局的opener对象 这时候使用urlopen方法发起请求就会使用自定义opener
opener = request.install_opener(opener)
- 构建请求头 发起请求
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
req = request.Request(
url='http://www.baidu.com',
headers=headers
)
response = request.urlopen(req,timeout=10)
print(response.data)
- 或者不需要将opener设为全局变量 自定义opener发起请求
response=opener.open(req,timeout=10)
Cookie
最开始导入cookiejar和一些基本的包
from urllib import request
from http import cookiejar
import ssl
- 需要自定义创建CookieJar对象用来存储cookie和创建HTTPCookieProcessor处理器用来处理与使用cookie
cookie_jar = cookiejar.CookieJar()
cookie_handler=request.HTTPCookieProcessor(cookiejar=cookie_jar)
- 自定义opener 支持发起请求 忽略ssl认证
context = ssl._create_unverified_context()
https_handler = request.HTTPSHandler(
debuglevel=1,
context=context,
)
- 自定义opener方法
opener = request.build_opener(https_handler,cookie_handler)
4 构建请求头发起请求
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
req = request.Request(
url='http://www.baidu.com',
headers=headers
)
request.install_opener(opener)
response = request.urlopen(req,timeout=10)
print(response.code)
print(cookie_jar)
- 返回的响应数据中cookiejar里面就是cookie信息 拿到cookie信息可以做登陆保持
cookie_dict={}
for i in cookie_jar:
print(i.name+'='+i.value)
cookie_dict[i.name]=i.value
print(cookie_dict)
正则
- 常见的正则匹配规则
单字符匹配
\d:匹配数字[0-9]
\D:匹配非数字 [\d]/[0-9]<’^'表示取反>
\w:匹配单词字符[a-zA-Z0-9]
\W:匹配非单词字符[^\w]
\s:匹配空白字符(空格 \t…)
\S:匹配非空白字符[^\s]
.:匹配除了换行符‘\n’之外的任意字符
多字符匹配(贪婪模式:尽可能多地匹配)
:匹配前面任意字符 任意次数
?:匹配?前面任意字符 0次或1次
+:匹配+前面任意字符 至少1次
非贪婪匹配(非贪婪模式:尽可能少地匹配)
*?
??
+?
其他
|:表示或 匹配左边或者右边的正则表达式之一
():分组
^:匹配开头
$:匹配结尾
{n,m}: 匹配{n,m}前面的正则表达式 匹配n-m次
[0-9a-z]: 表示匹配数字0-9,字母a-z
[^a-z]: 不匹配a-z之间的字符
- re模块
一切正则的开始:compile 方法: 将正则表达式的字符串形式编译为一个 Pattern 对象
2. match 方法:从起始位置开始匹配符合规则的字符串,单次匹配,匹配成功,立即返回Match对象,未匹配成功则返回None
3 .search 方法:从整个字符串中匹配符合规则的字符串,单次匹配,匹配成功,立即返回Match对象,未匹配成功则返回None
4 .findall 方法:匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表
5. finditer 方法:匹配所有合规则的字符串,返回可迭代对象
6.split 方法:根据正则匹配规则分割字符串,返回分割后的一个列表
7 .sub 方法:替换匹配成功的指定位置字符串