Python-爬虫(二):request库——爬下网页源码

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真的用不到

序号方法描述
1GET请求指定的页面信息,并返回实体主体
2HEAD类似 GET ,返回响应中无具体内容,用于获取报头
3POST向指定资源提交数据,处理请求(例如提交表单,上传文件),数据被包含在请求体中。POST 请求可能导致新资源建立,已有资源修改
4PUT客户端向服务器传送的数据,来取代指定的文档的内容
5DELETE请求服务器删除指定的页面
6CONNECTHTTP/1.1 协议,预留给能够将连接改为管道方式的代理服务器
7OPTIONS允许客户端查看服务器的性能
8TRACE回显服务器收到的请求,主要用于测试或诊断
9PATCH对 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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值