HTTP和HTTPS
HTTP
超文本传输协议
默认端口号:80
HTTPS # HTTPS比HTTP更安全,但是性能更低
HTTP + SSL(安全套接字层)
默认端口号:443
爬虫
- 爬虫是模拟浏览器发送请求,获取响应
爬虫的流程
- url -->发送请求,获取响应 -->提取数据/提取url -->保存
url形式 -> scheme://host[:port#]/path/…/[?query-string][#anchor]
页面上的数据在哪里
-
当前url地址对应的响应中
-
其他的url地址对应的响应中
- 比如ajax请求中
-
js生成的数据
- 部分数据在响应中
- 全部通过js生成
浏览器渲染出来的页面和爬虫请求的页面并不一样
爬虫只获取当前url地址对应的响应,不会进一步获取js的响应
而当前url地址的elements的内容和url的响应不一样
常用请求头
Host -> (主机和端口号)
Connection -> (链接类型)
Upgrade-Insecure-Requests -> (升级为HTTPS请求)
User-Agent -> (浏览器名称)***
Accept -> (传输文件类型)
Referer -> (页面跳转源)
Accept-Encoding -> (文件编解码格式)
Cookie -> (Cookie)***
x-requested-with :XMLHttpRequest -> (是Ajax 异步请求)
响应状态码(status code)
200:成功
302:重定向,临时转移至新的url
307:重定向,临时转移至新的url
404:not found
500:服务器内部错误
Robots协议(道德层面约束)
网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
例如:https://www.taobao.com/robots.txt
requests模块
import requests
response = requests.get(url)
response的常用方法:
response.text -> 类型:str, 根据HTTP 头部标明的代码自动解码,可能出错
respones.content -> 类型:bytes, 修改编码response.content.deocde(“utf8”)
response.status_code -> 状态码
response.request.headers -> 响应头
response.headers -> 请求头
response.url -> 请求的url
response.request.url -> 响应的url
response = requests.get(url,headers=headers) # 发送带header的请求
response = requests.get(url,params=kw) # 发送带?=参数的请求
response = requests.post("http://www.baidu.com/", data = data,headers=headers) # 发送带POST的请求
url = "..."
headers = {'User-Agent':'...',...}
data = {...}
requests中解决编解码的方法
response.content.decode() # 默认utf-8,大多数情况下推荐
response.content.decode("gbk")
response.encoding=”gbk”
response.text
# 更推荐使用response.content.deocde()的方式获取响应的html页面
判断请求否是成功
assert response.status_code==200
不要刚正面,手机版一般比电脑版的需要的数据更少
使用代理ip
proxies = {
"http": "http://12.34.56.79:9527", # proxies={协议:协议+ip+端口}
"https": "https://12.34.56.79:9527",
}
requests.get("http://www.baidu.com", proxies = proxies)
正向代理和反向代理的区别
- 正向代理:客户端知道最终服务器的地址
- 反向代理:客户端不知道最终服务器的地址
随机代理IP池
准备一堆的ip地址,组成ip池,随机选择一个ip来时用
如何随机选择代理ip,让使用次数较少的ip地址有更大的可能性被用到
- {"ip":ip,"times":0}
- [{},{},{},{},{}],对这个ip的列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个ip,从中随机选择一个
检查ip的可用性
- 可以使用requests添加超时参数,判断ip地址的质量
- 在线代理ip质量检测的网站
发送携带cookie请求
携带一堆cookie进行请求,把cookie组成cookie池
- 不需要cookie的时候尽量不去使用cookie
获取登录后的页面的三种方式
-
requests.session
- 实例化session(session具有的方法和requests一样)
session = requests.session()
- session发送请求post请求,对方服务器设置的cookie会保存在session
session.post(url,data=data,headers=headers)
- session请求登录后能够访问的页面,session能够自动的携带登录成功时保存在其中的cookie
response = session.get(url,headers)
- 实例化session(session具有的方法和requests一样)
-
cookie放在headers中
headers = {"Cookie":"cookie字符串"}
-
cookie转化为字典放在请求方法中
requests.get(url,cookies={"name的值":"values的值"})
使用现有的cookie获取登录后的页面的限制
- cookie过期时间很长的网站
- 在cookie过期之前能够拿到所有的数据,比较麻烦
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
字典推导式,列表推导式
cookies="anonymid=j3jxk555-nrn0wh; _r01_=1; _ga=GA1.2.1274811859.1497951251; "
cookies = {i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
[self.url_temp.format(i * 50) for i in range(1000)]
chrome分析url与json
寻找网页中post的url地址
-
form表单的action属性
-
抓包,寻找js的url地址
- 勾选perserve log按钮,防止页面跳转找不到url
- 寻找post数据,确定参数
- 参数不会变,直接用,比如密码不是动态加密的时候
- 参数会变
- 参数在当前的响应中
- 通过js生成
定位想要的js
- 选择会触发js时间的标签,点击event listener,找到js的位置
- 通过chrome中的search all file来搜索url中关键字
- 添加断点的方式来查看js的操作,通过python来进行同样的操作
request小技巧
-
reqeusts.utils
requests.get(url,cookies={}) reqeusts.utils.dict_from_cookiejar # 把cookie对象转化为字典 reqeusts.utils.cookiejar_from_dict # 把cookie字典转化为对象 requests.utils.quote("...") # url编码 requests.utils.unquote("...") # url解码
-
忽略SSL证书验证
response = requests.get("https://www.12306.cn/mormhweb/", verify=False)
-
设置请求超时时间
response = requests.get(url,timeout=10)
-
配合状态码判断是否请求成功
assert response.status_code == 200
-
retrying模块
@retry(stop_max_attempt_number=3) # 通过装饰器使用 def fun1(): ...
安装第三方模块的三种方法
pip install retrying
- 下载源码解码,进入解压后的目录,执行py文件
***.whl
文件安装方法pip install ***.whl
代理神器Fiddler
抓包工具
Fiddler是一款强大Web调试工具,它能记录所有客户端和服务器的HTTP,HTTPS请求