2.2 requests的使用
2.实例引入
urllib.request 构造GET请求。如果传递了参数data,请求方式为POST。
3.GET请求
- 基本实例
r = requests.get("https://httpbin.org/get", params=data)
print(type(r.json()))
将json格式的字符串转为字典。
- 抓取网页
r = requests.get('https://static1.scrape.center/')
pattern = re.compile('<h2.*?>(.*?)</h2>', re.S)
titles = re.findall(pattern, r.text)
print(titles)
re.S:使 . 匹配包括换行在内的所有字符
(.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
r = requests.get('https://github.com/favicon.ico')
print(r.text)#图片数据为二进制,text打印为str类型乱码
print(r.content)
with open('favicon.ico','wb') as f:
f.write(r.content)
- 添加请求头,比如User-Agent
5.POST请求
headers属性为CaseInsensitiveDict。
cookies属性为RequestsCookieJar
request.codes状态码.
request.codes.ok得到成功的状态码200reque
以字符串ok来表示状态比200更直观。
404:request.codes.not_found
6.高级用法
- Cookie设置
r = requests.get('https://www.baidu.com')
print(r.cookies)
for key, value in r.cookies.items():
print(key + '=' + value)
Cookie屬於RequestCookieJar類型.
jar=requests.cookies.RequestsCookieJar()#新建RequestCookieJar對象
jar.set(key,value)#set方法設置每个Cookie条目的键名和键值。
r=requests.get('\url',cookies=jar,headers=headers)#cookies传参
- Session
直接用requests库的get或post方法可模拟网页请求,相当于不同的Session即用两个浏览器分别打开不同的网页。
Session对象,相当于打开新的浏览器选项卡而非新的浏览器,模拟同一个会话。
s = requests.Session()
s.get('https://httpbin.org/cookies/set/number/123456789')
r = s.get('https://httpbin.org/cookies')
print(r.text)
- SSL证书验证
网站的HTTPS证书不被CA机构认可
response = requests.get('https://static2.scrape.center/', verify=False)
print(response.status_code)
verify参数验证证书是否有效,False则跳过验证。
urllib3.disable_warnings()
忽略警告
logging.captureWarnings(True)
将警告捕获到日志
response=requests.get('\url',cert=('\.crt','\.key'))
指定客户端密钥和证书
- 超时设置
默认为timeout=None - 身份认证
基本身份认证Basic Authentication
OAuth认证
url='\url'
auth=OAuth1('YOUR_APP_KEY','YOUR_APP_SECRET','USER_OAUTH_TOKEN','USER_OAUTH_TOKEN_SECRET')
request.get(url,auth=auth)
auth参数可直接传元组,默认转为HTTPBasicAuth类
- 代理设置
语法
http://user:password@host:port
支持SOCKS协议
2.3正则表达式
1.实例引入
匹配URL
[a-zA-z]+://[^\s]*
^开头;\s匹配空白字符,*匹配前面任意多个字符。
python的re库
2.match
^Hello\s\d\d\d\s\d{4}\s\w{10}
{4}匹配前面的规则四次
\d 数字 ;\w字母与字符串
输出结果:
SRE_Match对象,成功匹配
<re.Match object; span=(0, 25), match=‘Hello 123 4567 World_This’>
span表示匹配到的对象在原字符串的范围index。
- 匹配目标
()括号将欲提取的子字符串括起来,每个子表达式对应一个group。 - 通用匹配
'^Hello.*Demo$'
.点匹配除换行符外的任意字符。$结尾
.贪婪匹配,会尽可能多地匹配,占用其他表达式
.?非贪婪匹配,尽可能少匹配,可以为空。字符串中间尽量使用非贪婪匹配,若在字符串结尾,可能匹配不到内容。
- 修饰符
result = re.match('^Hello\s(\d+)\sWorld', content,re.S)
re.S是匹配内容包括换行符在内的所有字符。
re.I对大小写不敏感。
- 转义匹配
\转义符
3.search
re.match:如果不是起始位置匹配成功的话,match()就返回none。span(0,)只能从0开始
re.search:依次扫描字符串,直到找到首个符合规则的字符串,返回匹配内容。注意,只匹配第一个
4.findall
搜索整个字符串,返回匹配正则表达式。
5.sub
替换
6.compile
将正则字符串编译封装为正则表达式对象