什么是网络爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端发送网络请求,接收请求响应,是一种按照一定的规则,自动地抓取互联网信息的程序。
只要是浏览器能做的事情,原则上,爬虫都能够做
爬虫的更多用途
- 12306抢票软件
- 网站上的投票
- 短信轰炸
通用爬虫和聚焦爬虫工作流程
分析网页上的数据存放在哪
- 当前url地址对应的响应中
- 其他url地址对应的响应中
- 例如ajax请求
- js生成的
- 部分数据在url地址对应的响应中
- 全部通过js生成
即爬虫爬取数据时,要以当前url地址对应的响应为准,因为ajax、jsDOM操作等因素的影响,当前url地址的elements的内容和url地址的响应可能不一致
使用IP代理
- 准备一批IP代理地址,组成IP池,随机选择一个IP来使用
- 如何随机使用代理IP,使用算法,让使用次数少的IP地址有更大的可能性被用到。思路为:记录使用次数,提取使用次数少的一定量IP代理,再对这一小部分IP代理进行随机提取
- {“ip”:ip,“times”:0}
- [{},{},{},{},{}…{}],将字典放入列表中再按使用次数进行排序
- 选取使用数量最少的N(N根据代理池的大小取值)个IP,从中随机选择一个
- 检查IP代理的可用性
- 可以使用requests添加超时参数,判断IP代理的质量
- 使用在线IP代理质量检测的网站
爬虫处理cookie和session
- 带上cookie、session的好处
- 能够请求到登录之后的页面
- 带上cookie、session的缺点
- 由于一套cookie和session往往跟一个用户对应,请求太快,请求次数太多,容易被服务器识别为爬虫
- 如果不带上cookie、session请求太快,请求次数太多,也容易被服务器识别为爬虫;那么我们到底应不应该带上cookie、session?具体情况具体分析
- 先使用不带cookie的版本,如果并没被服务器拉黑,也就意味着该网站服务器并未针对cookie设置反爬虫机制;这时候我们就不要使用携带cookie的版本了。即不需要cookie、session的时候尽量不使用cookie,不仅仅是因为反爬虫的缘故,使用cookie需要大量的账号获取cookie构建cookie池,会浪费大量的开发成本
- 但是如果网站设置了用户权限,我们必须使用携带cookie、session的版本
http请求携带cookie属性
- 跟IP池所用到的策略一致
使用requests提供的session类来发送post请求登录之后的网站的思路
- 实例化session
- 先使用session发生请求,登录到网站,把cookie保持在session中
- 再使用session请求登录之后才能访问的网站,session能够自动的携带登录成功保存在其中的cookie,进行请求
#不使用post请求,使用cookie获取登录后的页面 - cookie过期时间很长的网站
- 在cookie过期之前能够拿到所需的数据(比较麻烦,下次启动需要更新cookie)
- 配合其他程序一同使用,其他程序负责获取cookie,当前程序负责获取数据
#字典推导式,列表推导式
cookie=’_zap=9e43678a-c3b1-4603-b051-3eb5a3fdc164; d_c0=“AFBvhzI5mA-PTgSPrhnBvo6BJgaiC0DnXFA=|1560693579”; tgw_l7_route=66cb16bc7f45da64562a077714739c11; _xsrf=pjA4CLL27yXESC5jZTHWjkveEzJ5B1E6; tst=r; q_c1=ff3073c8158f424f8313179c1cc74e69|1561194908000|1561194908000; capsion_ticket=“2|1:0|10:1561195716|14:capsion_ticket|44:ODg1NDAzMzUwODI3NDgyZTk5ZWMzZTkxMzE2YjMzYmQ=|e44fa8fd1a2b4eef17e369763b4d87e4c9665cf08b88823549c43ba8e3c90964”; z_c0=“2|1:0|10:1561195726|4:z_c0|92:Mi4xMjJTZ0NRQUFBQUFBVUctSE1qbVlEeVlBQUFCZ0FsVk56a0w3WFFDUTBfaHN1aVNCY3kxWktieTBDUkNzSWtMVEF3|97a4e872cd5a425d82a61d1ac5da3224d8f91c59d4555255a1ae867046e2b92d”’
cookies={i.split("=")[0]:i.split("=")[1] for i in cookie.split(";")}
获取登陆后的页面的三种方式
- 实例化seesion,使用session发送post请求,再使用他获取登陆后的页面
- headers中添加cookie字段与值
- 在请求方法中添加cookies参数,接受字典类型的cookie
response.text和response.content的区别(基于python3版本,不支持python2版本)
-
response.text
- 类型:str
- 解码类型: 根据HTTP 头部对响应的编码作出有根据的推测, 推测的文本编码
- 如何修改编码方式:response.encoding=”gbk”
-
response.content
- 类型:bytes
- 解码类型: 没有指定
- 如何修改编码方式:response.content.deocde(“utf8”)
#requests中解决编码问题的方法
- request.content.decode()使用utf-8编码格式可以解决绝大部分网站编码问题
- request.content.decode(‘gbk’)使用gbk编码格式可以解决一部分utf-8不能解决的网站编码问题
- request.text 虽然智能识别编码格式经常出错,但是总有正确的时候,前面两种不能解决时,不妨试试。