urllib&正则

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
  1. 需要自定义创建CookieJar对象用来存储cookie和创建HTTPCookieProcessor处理器用来处理与使用cookie
cookie_jar = cookiejar.CookieJar()
cookie_handler=request.HTTPCookieProcessor(cookiejar=cookie_jar)
  1. 自定义opener 支持发起请求 忽略ssl认证
context = ssl._create_unverified_context()
https_handler = request.HTTPSHandler(
    debuglevel=1,
    context=context,
)
  1. 自定义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)
  1. 返回的响应数据中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 方法:替换匹配成功的指定位置字符串

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值