Requset库——爬取源码
一、安装requests
法一:pip install requests
法二:pycharm-File-Setting-Project Interpreter-选择解释器-加号-搜索-Install
二、Requests库
1、基本请求:requests.get
# The easiest
response = requests.get("https://www.baidu.com/")
print(response.url)
# 自己设置查询参数
payload = {'wd': '桥本环奈', 'rn': '100'}
r = requests.get("http://www.baidu.com/s", params=payload)
print(r.url)
# 设置超时时间,一旦超时还获得响应内容,就提示错误
requests.get('https://www.google.com/search', timeout=0.001)
# 代理访问,防止被封IP。免费代理:http://www.xicidaili.com/nn
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://www.douban.com", proxies=proxies)
# 需要账户和密码的代理
proxies = {
"http": "http://user:pass@10.10.1.10:3128/",
}
# 伪装请求头部。
# 不同的网站对于请求头有不同要求,可以从浏览器-开发者工具-中Network-headers信息,基于此自定义参数
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
r = requests.get('http://www.zhidaow.com', headers = headers)
(1)与get并行的拓展函数
还有一些其他请求方式,for example:
r = requests.post("…")
即下表(对于新手真的不重要,因为除了get真的用不到 )
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似 GET ,返回响应中无具体内容,用于获取报头 |
3 | POST | 向指定资源提交数据,处理请求(例如提交表单,上传文件),数据被包含在请求体中。POST 请求可能导致新资源建立,已有资源修改 |
4 | PUT | 客户端向服务器传送的数据,来取代指定的文档的内容 |
5 | DELETE | 请求服务器删除指定的页面 |
6 | CONNECT | HTTP/1.1 协议,预留给能够将连接改为管道方式的代理服务器 |
7 | OPTIONS | 允许客户端查看服务器的性能 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
9 | PATCH | 对 PUT 方法的补充,对已知资源进行局部更新 |
(2)对get结果的处理与查看
# 获取网页响应的内容
r.text # 可能有转码问题(unicode?utf-8?这个我再琢磨一下)
r.content # 以字节方式去显示,更适合下载图片以及视频
# 网页编码相关
r.encoding # 根据HTTP头部来猜测网页编码
r.encoding = 'utf-8' # 修改编码
# 网页状态码
r.status_code # 200 正常打开; 404 不能正常打开
r = requests.get('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN')
# r.url 显示 u'http://www.zhidaow.com/
# r.status_code 状态码显示是200,实际上是百度搜索结果中的302跳转地址
# r.history 可以看出来实际状态码 (<Response [302]>,) 转移码
r = requests.get('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN', allow_redirects = False) # 禁止跳转,用 status_code 直接出正确状态码
# 响应头内容
r.headers # 以字典形式返回全部内容
# {
# 'content-encoding': 'gzip',
# 'transfer-encoding': 'chunked',
# 'content-type': 'text/html; charset=utf-8';
# ...
# }
r.headers['Content-Type'] #访问部分内容
r.headers.get('content-type') #访问部分内容
# 请求头内容
r.request.headers
(3)JSON处理
Json数据是什么?
- JavaScript Object Notation(JavaScript 对象表示法)
- 数据在名称/值对中
- {名称:值} ,如
"name" : "桥苯环萘"
- 值:可以为 数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或 false)、数组(在中括号中)、对象(在大括号中)、null
- {名称:值} ,如
- 数据由逗号分隔,大括号保存对象,中括号保存数组
- 对象:
{ "name":"菜鸟教程" , "url":"www.runoob.com" }
- 数组:
{ "sites": [ { "name":"菜鸟教程" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ] }
- 对象:
- 菜鸟教程-json
一些方法
requests中r.json() 等价于 json.loads(response.text)
import requests
import json
r = requests.get("http://httpbin.org/get")
print(type(r.text))
print(r.json())
print(json.loads(r.text))
print(type(r.json()))
2、报表请求:requests.post
(1)构造表单请求
- 通过form表单的方式来向服务器传递查询条件,更安全。
- 开发者工具—formdata字段【Chrome的Query String Parameters】—获取表单字段信息—挑选合适登陆方式:
import requests
url = 'https://en.artprecium.com/catalogue/vente_309_more-than-unique-multiples-estampes/resultat'
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "zh",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Cookie": "PHPSESSID=m2hbrvp548cg6v4ssp0l35kcj7; _ga=GA1.2.2052701472.1532920469; _gid=GA1.2.1351314954.1532920469; __atuvc=3%7C31; __atuvs=5b5e9a0418f6420c001",
"Host": "en.artprecium.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
}
# 构造form表单
data = {"IdEpoque": "", "MotCle": "", "Order": "",
"LotParPage": "All", "IdTypologie": ""}
response = requests.post(url=url, data=data, headers=headers, timeout=10)
print(response) # 返回值:<Response [200]>
# 上面是一个电商网站的post请求查询的案例
# 对页面显示商品数量进行更改后,url没有改变,则可以分析此动作由ajax异步加载,或通过post的请求方式来更改。这些,可以通过开发者工具来验证。
(2) 发送JSON数据
- 除了构造表单,还可以利用 post(json={“key”:“value”}) 方式,通过像服务器发送json信息的方式获取正确的请求。
- http://anticvarium.ru/auction/archive,从这个页面中我们可得到一个专场列表页,每个专场中有许多商品,当我们直接去请求每个专场的URL时不会得到任何结果。
- 我们可以从开发者工具中找到他的真实接口,如下图所示:
3、升级操作:request的参数表
可以从request的官方构造文件,观测request的原理:
class urllib.request.Request(url,
data=None, headers={ }, origin_req_host=None,
unverifiable=False, method=None)
# 1、url,用于请求URL,必选
# 2、data,必须bytes类型,字典可先用urllib.parse模块,获得urlencode( )编码
# 3、headers,即请求头,字典类型,也可以调用add_header( )方法添加。最常用功能:修改User-Agent来伪装浏览器。
# 4、origin_req_host,指请求方的host名称或者IP地址
# 5、unverifiable,表示这个请求无法验证,默认是False,即用户没有足够权限来选择接收这个请求的结果。例如,在请求一个HTML文档中的图片时没有自动抓取图像的权限,unverifiable的值就是True
# 6、method,字符串,用来指示请求使用的方法,比如GET、POST和PUT
三、HTML知识补充
1、HTTP 消息结构
- HTTP是基于**客户端/服务端(C/S)**的架构模型
- 客户端请求消息
- 发送一个HTTP请求到服务器
- 请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据
- 一般格式:
- 服务器响应消息
- 响应也由四个部分组成:状态行、消息报头、空行和响应正文
2、HTTP状态码
下面是常见的HTTP状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
3、HTTP content-type
Content-Type(内容类型),定义网络文件的类型和网页的编码
详情
四、致谢
1、https://www.cnblogs.com/lgh344902118/p/6780960.html
2、https://www.cnblogs.com/lei0213/p/6957508.html
3、https://baijiahao.baidu.com/s?id=1624323173955549442&wfr=spider&for=pc
4、https://www.imooc.com/article/48845?block_id=tuijian_wz