爬虫的用途
- 爬虫的数据为数据分析或人工智能提供服务,训练数据
- 为网站做数据展示
- 微博、贴吧等社交属性的数据,舆情分析,用于公关
- 金融数据(股票信息),投资决策
- 12306 抢票
- 网站上的投票
- 短信轰炸:找 60 个注册的网站,模拟实现让每个网站发送短信验证码,进行循环,每秒发送一个,实现短信轰炸
爬虫的概念
模拟浏览器发送请求,获取请求响应
爬虫流程
url –> 发送请求,获取响应 –> 提取数据 –> 保存 ,获取响应 –> 提取 url 地址,继续请求
pagerank 算法, 网页排名
robots 协议
限制搜索引擎爬虫爬取的数据范围,但只是道德层面的约束
http 和 HTTPS 的复习
url的形式
url的形式:scheme://host[:port#]/path/…/[?query-string][#anchor]
- scheme:协议(例如:http, https, ftp)
- host:服务器的IP地址或者域名
- port:服务器的端口(如果是走协议默认端口,80 or 443)
- path:访问资源的路径
- query-string:参数,发送给http服务器的数据
- anchor:锚(跳转到网页的指定锚点位置)
爬虫只能发送一次请求,浏览器发现数据不全会自己通过 ajax 进行多次请求
爬虫拿不到 js 中的内容
get 和 post 的区别:
- 直观的就是语义上的区别,get用于获取数据,post用于提交数据。
- get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制),而post无限制
- GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接,而POST请求会把请 求的数据放置在HTTP 请求体中。
- 更多资料,请查看post请求和get请求的区别
字符串编解码
python3 默认编码方式 utf-8
str –> bytes encode() 编码,默认是 utf-8
bytes –> str decode() 解码,默认是 utf-8
requests
resp = request.get(url)
resp.content # bytes 数据,最原始的数据
resp.text # 根据响应头部进行规律的推测,然后自动进行解码后的内容
resp.encodeing = 'utf-8' # 可以自己指定编码方式
浏览器 – https 协议 --网站
爬虫 – http协议 — 网站
请求头:
- User-Agent: 告诉服务器,访问者的身份标识
- cookies: 保持会话
- Referer: 页面跳转处
json 格式转换为 python 类型,不叫转换为 python 字典
代理
用户知道服务器 ip 就是正向代理 VPN 客户端被代理
用户不知道服务器 ip 就是反向代理 Nginx 服务器被代理
发送 post 请求
data = {"从浏览器中 formdata 的位置寻找"}
requests.post(url, data=data)
使用代理
网站可以根据 ip 访问的频率来判断是否是爬虫,访问太快会被屏蔽
可以使用代理
proxies = {“协议”: “协议 + ip + 端口”}
requests.get(url, proxies=proxies)
代理
Nginx
UWSGI uWSGI
u 大写是协议,小写是服务器
谷歌提供的三个论文之一:
一致性哈希 实现负载均衡
cookie
cookie 设置的时候要设置 domain=.baidu.com
Session 类用来保持 cookie
代理
- 透明代理(Transparent Proxy):透明代理虽然可以直接“隐藏”你的IP地址,但是还是可以从HTTP_X_FORWARDED_FOR来查到你是谁。
- 匿名代理(Anonymous Proxy):别人知道你用了代理,但是无法知道你真实 IP
- 混淆代理(Distorting Proxies):别人还是能知道你在用代理,但是会得到一个假的 IP 地址,伪装的更逼真
- 高匿代理(Elite proxy或High Anonymity Proxy):别人根本无法发现你是在用代理
cookie 和 session
- cookie 有大小限制, cookie 在单个站点最多存 20 个,session 不存在限制,服务器硬盘多大就可以存多少;
- cookie 存在客户端,不安全,session 存在服务器,安全
- 都是用作会话保持
Flask 原生的 session 是存在客户端的,它的 session 是依赖于 cookie 中的
只不过是用 base64 进行加密 ,可逆
requests 中 Session 类
使用该类可以保持登录状态,每次请求都会带上 cookie,让爬虫更像浏览器
requests进行携带cookie登录
- cookie字符串放在headers中
- 把cookie字典交给requests请求方法的cookies
优先使用 headers 中的 cookie
没找到才会去用参数中的 cookies
Preserve log: 控制台按钮,持续日志
<> 尖括号括起来的是对象
寻找登录接口的方法
- form 表单 action 对应的 url 地址
- 用户名和密码的 input 标签中,name 的值作为键,用户名和密码作为值的字典,作为 post data
- 通过抓包,定位 url 地址
- form data
- form data
分析js,获取加密的数据
- 观察变化
- 定位js
- 通过event listener定位js的位置
- 通过搜索url地址中的关键字,通过chrome的search all file来进行搜索
- 进行分析
- 通过添加断点的方式分析js
- 执行js
- 完全的使用python模拟js的执行过程
requests处理ssl证书
requests.get(url,verify=False)
获取响应中的cookie,转化为字典
response = requests.get(url,headers=headers)
requests.utils.dict_from_cookiejar(response.cookies)
超时参数的使用
requests.get(url, timeout=3)
retrying 模块的使用
- from retrying import retry
- 通过装饰器的方式使用 retry,进行异常捕获,重新执行被装饰的函数
数据的分类
- 结构化数据
- json,xml
- 直接使用模块转化为python类型
- 非结构化数据
- html
- re,xpath
json模块的使用
json.loads:json字符串转化为python类型
json.dumps : python类型转化为json字符串
json.load: 包含json字符串的类文件对象转化为python类型
json.dump: 把p需求:爬取苏宁易购所有下所有图书和图书分类信息