几个概念
- get请求
查询参数会直接在url显示出来
在请求后不会对服务器资源产生影响 - post请求
查询参数不会显示在url地址之上的
在请求后会对服务器资源产生影响 - url 全球统一资源定位符
https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%B9%3A%E4%B8%AD%E7%BE%8E%E5%85%B3%E7%B3%BB%E4%BA%89%E5%8F%96%E9%87%8D%E5%90%AF%E5%AF%B9%E8%AF%9D&rsv_idx=2&tn=baiduhome_pg&usm=2&ie=utf-8&rsv_cq=csdn&rsv_dl=0_right_fyb_pchot_20811_01&rsf=c9a1639423ea9690341c6aeae54731a0_1_10_1&rqid=d968f17f0001c1b3
https : 网络协议
www.baidu.com :主机名 省略了端口 443
s?wd=%E4%B8%AD%E6%96%B9%3A%E4%B8%AD%E7%BE%8E%E5%85%B3%E7%B3%BB%E4%BA%89%E5%8F%96%E9%87%8D%E5%90%AF%E5%AF%B9%E8%AF%9D&rsv_idx=2&tn=baiduhome_pg&usm=2&ie=utf-8&rsv_cq=csdn&rsv_dl=0_right_fyb_pchot_20811_01&rsf=c9a1639423ea9690341c6aeae54731a0_1_10_1&rqid=d968f17f0001c1b3
访问资源的路径
anchor : 锚点 资源定位标志
浏览器去请求服务器资源的时候除了数字英文符号之外其他全部会转化为十六进制百分号
User-Agent 用户代理 记录了用户的操作系统、浏览器等,为了让用户更好地获取Html页面效果
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Gecko 内核(火狐最先推出)
Referer当前请求是从哪一个url过来的,一般也可以作为一个反爬的方式
- 状态码
- 200 请求成功
- 301 永久重定向 www.360buy.com / www.jd.com
- 302 临时重定向 https://www.zhihu.com / https://www.zhihu.com/signin?next=%2F
- 404 请求失败(服务器无法根据客户端的请求找到资源(网页))
- 500 服务器内部请求
- 开发者工具介绍
- Elemants 元素 网页源代码,可以在里面提取和分析数据,但是有些数据是经过处理的并不准确
- Consule 控制台(打印信息)
- Sources 信息来源(整个网站加载的文件)
- Network 网络工作(信息抓包) 可以看到很多的网络请求
爬虫网络请求模块
-
python内置的抓包工具——urllib
-
使用原因:
- 1.有些比较老的爬虫项目用的就是这个
- 2.有的时候就是爬取一些数据的时候需要urllib来配合requests来使用
- 3.先将内置的了解清楚
- 4.urllib在某些方面作用还是比较强大的
-
urllib.request模块的使用
- urllib.request.urlopen(‘网址’)作用:向网站发起一个请求并获得响应
- 字节流 = response.read() 读取出的数据是以字节的形式出现的
import urllib.request url = 'https://www.baidu.com' resp = urllib.request.urlopen(url) print(resp.response.read()) # b'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>\r\n</body>\r\n</html>'
- 字符串 = response.read().decode(‘utf-8’) 读取出的数据是以字符串的形式出现的
import urllib.request url = 'https://www.baidu.com' resp = urllib.request.urlopen(url) res = resp.read().decode('utf-8') print(res) 结果: <html> <head> <script> location.replace(location.href.replace("https://","http://")); </script> </head> <body> <noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript> </body> </html>
- urllib.request.Request(‘网址’,headers=‘字典’) 支持重构User-Agent 将User-Agent赋予在一个字典当中
urlopen()不支持重构User-Agent
import urllib.request url = 'https://www.baidu.com' hea = { 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57' } resp = urllib.request.Request(url, headers = hea) req = urllib.request.urlopen(resp) res = req.read().decode('utf-8') print(res)
-
urllib.parse模块的使用
- urlencode(‘字典’)。我们在向网址发送请求时代码中不能出现未注释的汉字,网址中的关键词部分是由十六进制和符号组成的,如果我们想要使用汉字来转化成十六进制编码可以使用urlencode(),注意括号里一定要是字典。
import urllib.parse wb = {'wb':'徐霞客'} wbi = urllib.parse.urlencode(wb) print(wbi)
- quote(‘字符串’)。quote同样是中文转换工具,只不过转换的是字符串
import urllib.parse key = '徐霞客' wb = urllib.parse.quote(key) print(wb)