这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」
过年期间嘛,节日快乐,天天开心 之前的几天,了解了urllib的基本用法,确实不太好使用,requests是对urllib的进一步封装,因此在使用上显得更加的便捷.好那就继续学这个更加强大的,request库
详细代码ref:code
安装request库
pip3 install requests
就这一行就行,不然就直接在pycharm引入,选择让它安装就好了
快速使用
requests的get方法
import requests
r = requests.get("https://wwww.baidu.com")
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text[:100])
print(r.cookies)
得到的结果:
<class 'requests.models.Response'>
200
<class 'str'>
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charse
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
可以看到,跟以前的urllib-urlopen那个方法要简单许多,直接就能拿到状态码啊,页面代码啊,感觉比urllib更强一步,确实越封装越好用
GET 请求
HTTP中最常见请求之一就是get请求
基本用法
import requests
r = requests.get("https://www.httpbin.org/get")
print(r.text)
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "www.httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-61f93837-57bb3b503a4f2a10700e0796"
},
"origin": "218.102.252.223",
"url": "https://www.httpbin.org/get"
}
这个网站可以看到请求的细节, 返回的结果中包含请求头,URL,IP等信息,其实我们在发送get请求的时候,会有参数,那么怎么怎么添加参数呢,在urllib这个库中,用了拼接参数的方法,requests怎么拼呢:
import requests
data = {
"name":"flynt",
"age":"24"
}
r = requests.get("https://www.httpbin.org/get",params=data)
print(r.text)
得到的响应:
import requests
data = {
"name":"flynt",
"age":"24"
}
r = requests.get("https://www.httpbin.org/get",params=data)
print(r.text)
{
"args": {
"age": "24",
"name": "flynt"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "www.httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-61f939fa-25549b256ce067d407d59200"
},
"origin": "218.102.252.223",
"url": "https://www.httpbin.org/get?name=flynt&age=24"
}
就我的理解,确实是封装的,跟urllib的用法真的是异曲同工之妙,但是不同的是,是JSON格式的,所以我们可以直接可以调用JSON方法比如:
print(r.json())
咱们得到的响应:
{'args': {'age': '24', 'name': 'flynt'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'www.httpbin.org', 'User-Agent': 'python-requests/2.26.0', 'X-Amzn-Trace-Id': 'Root=1-61f93d3d-0d77b8c55f6eb3477087f602'}, 'origin': '218.102.252.223', 'url': 'https://www.httpbin.org/get?name=flynt&age=24'}
是不是一模一样,调用JSON方法可以将返回的结果转化为字典
需要注意,如果返回的结果不是JSON 那么就会出现解析错误 json.decoder.JSONDecodeError
抓取网页
我们去请求一个页面去试一下:
import re
import requests
r = requests.get("https://ssr1.scrape.center/")
patten = re.compile("<h2.*?>(.*?)</h2>",re.S)
# 这个是为了 如果你的结果为空的话,看看是正则表达式的问题,还是,请求的问题
#print(r.text)
titles = re.findall(patten,r.text)
print(titles)
得到的结果:
['霸王别姬 - Farewell My Concubine', '这个杀手不太冷 - Léon', '肖申克的救赎 - The Shawshank Redemption', '泰坦尼克号 - Titanic', '罗马假日 - Roman Holiday', '唐伯虎点秋香 - Flirting Scholar', '乱世佳人 - Gone with the Wind', '喜剧之王 - The King of Comedy', '楚门的世界 - The Truman Show', '狮子王 - The Lion King']
不要问我正则表达式咋写的,还没学到呢 目前这样就完成了提取所有的电影标题 OK,今天就学到这了