知识树
基础得不能再基础
http请求的过程
注意:浏览器渲染出来的页面和爬虫请求的页面并不一样。为啥?因为浏览器呈现的内容,除了来自用户手动发起的url请求,还来自于一些js和css文件,这些是存在服务器的。
url的形式
形式 scheme://host[:port#]/path/…/[?query-string][#anchor]
scheme:协议(例如:http, https, ftp)
host:服务器的IP地址或者域名
port:服务器的端口
path:访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)
http://localhost:4000/file/part01/1.2.html
http://item.jd.com/11936238.html#product-detail
http请求的形式
注意:get请求没有请求体
常见http请求头
Host (主机和端口号)
Connection (链接类型) //值为keep-alive
表示这是条长连接,用于会话保持
Upgrade-Insecure-Requests (升级为HTTPS请求)
User-Agent (浏览器名称)
Accept (传输文件类型)
Referer (页面跳转处)
Accept-Encoding(文件编解码格式)
Cookie (Cookie)
x-requested-with: XMLHttpRequest (是Ajax 异步请求)
python3中的字符串
python3的字符串,分两种类型:bytes
(二进制形式)、str
(unicode形式)
在ipython里面(jupyter notebook环境)unicode编码可以直接转换为汉字。
- 应用
爬取网上的图片,将图片保存到本地。
脚本:
1 | import requests |
requests模块的使用
使用模块之前,记得import requests
安装第三方模块的方法
pip3 install 模块名
pip3 install *.whl
- 下载源码压缩包,解压缩后,进入目录,执行
python setup.py install
requests发送get请求
- 普通请求 使用requests模块发起的请求,请求头的User-Agent字段是
1
2import requests
r = requests.get("http://www.baidu.com")python-requests/2.22.0
,太容易被发现了!伪装指数:一颗星。
- 带headers的请求
就是带上http请求头,提升伪装指数。最常用的是带上User-Agent和Cookie字段,需要定义为字典格式。
用法:现在,就伪装成正常用户的User-Agent了。1
2
3import requests
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"}
r = requests.get("http://www.baidu.com",headers=headers)
- 带参数的请求
很多时候,我们需要带上参数,才获取得到想要的数据。requests模块会帮助我们的。
比如我进入百度(用手机模式进行操作,手机模式通常比电脑模式更简洁),搜索【陈奕迅】,通过开发者工具,看到我输入的参数名称是word。找到这个信息和请求url,就可以模仿模拟器了~
把cookie也带上。现在服务器就被骗啦~~1
2
3
4
5import requests
kw = {"word":"陈奕迅"}
headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36",
"Cookie": "BIDUPSID=5B552A67F4809A696EB411EBECB153B5; PSTM=1579323194; BAIDUID=5B552A67F4809A694DD0808B6CBC1E9B:FG=1; delPer=0; BD_HOME=0; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BD_CK_SAM=1; PSINO=2; H_PS_PSSID=1430_21086_30495_30501; H_PS_645EC=8327uw5uHbT5t%2BUS3ka0l7KioqlTqXRxdp1H14anTPhYbz0M8Z9bBpMQA0E; WWW_ST=1579323229822"}
r = requests.get("https://www.baidu.com/s",params=kw,headers=headers)
requests发送post请求
用法:data是字典格式。1
response = requests.post("http://www.baidu.com/",data=data,headers=headers)
- 模拟浏览器发送post请求,以百度翻译为例。
进入手机模式,观察请求发送的特征。我点击【翻译】,浏览器发了两条post请求。- 检测输入的语言
- 将输入内容翻译为英文
- 检测输入的语言
先做个简单的,就模拟第二条post请求,将【下雨了】翻译成英文。
post是这样的,把这部分内容做成字典格式,就可以开始写代码了。
遇到了问题,暂时按下不表,等会儿集中完成爬虫练习。这里是需要用python代码实现一个翻译小工具。
使用代理发送请求
get和post都可以用代理发送请求。这个伪装手段就是隐藏自己的真实IP,相当于改名行走江湖的人。
proxies也是字典格式。代理IP到网上找,一般使用高匿代理。比如这里有代理IP
举例:
1 | proxies = { |
用法很简单,定义proxies字典之后,在requests中添加参数proxies就行了。
使用session获取登录后的页面
为了获取登录之后的页面,我们必须发送带有cookies的请求。
用法:
- 实例化一个session对象
- 让session发送get或者post请求
1 | session = requests.session() |
requests使用的小技巧
- 把cookie对象转化为字典
requests.utils.dict_from_cookiejar(cookies对象)
- 请求SSL证书无效的网站
response = requests.get("https://www.12306.cn/mormhweb/ ",verify=False)
- 设置超时
response = requests.get(url,timeout=10)
- 配合状态码判断是否请求成功
assert就是下断言,预先判定认为条件成立。就像你买彩票,假定自己会中奖。
assert response.status_code == 200
实例操作,先放一下,休息一会儿继续。就另写几篇,一个实验写一篇,包括实验过程和总结。