- 代表重点
爬虫的基本概念
爬虫的定义 *
· 网络爬虫,又称爬虫、网络蜘蛛或网络机器人。就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
· 只要是浏览器能做的事情,原则上爬虫都能做。
爬虫的分类 *
-
通用爬虫:通常指搜索引擎的爬虫
-
流程:抓取网页–>数据存储–>预处理–>提供检索服务、网站排名(pagerank算法)
-
聚焦爬虫:针对特定网站的爬虫
-
流程:url list–>响应内容–>提取数据–>保存数据
| |
|<–提取url
HTTP
- 超文本传输协议
- 默认端口号:80
HTTPS
- HTTP+SSL(安全套接字层)
- 默认端口号:443
HTTPS比HTTP更安全,但性能更低
ROBOTS协议
- Robots协议:网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
- 例如:https://www.taobao.com/robots.txt
浏览器发送请求的流程
- 浏览器通过域名请求–>DNS服务器,DNS服务器解析域名返回IP地址–>浏览器再通过IP地址请求对应的网站–>Web服务器,返回html、css、js页面
爬虫要根据当前url地址对应的响应为准,当前的url地址和elements的内容和url的响应不一样 *
- 因为爬虫只针对当前url地址返回的response内容,而element内容可能通过其他原因进行二次渲染。
- 原因一:当前url地址对应的响应中
- 原因二:其他url地址对应的响应中
- 比如通过ajax请求生成
- 原因三:js生成
- 部分数据在响应中
- 全部通过js生成
url的形式
- scheme://host[:port#]/path/…/[?query-string][#anchor]
- scheme:协议,如http、https、ftp
- host:服务器的ip地址或者域名
- port:服务器的端口,http默认80,https默认443
- path:访问资源的路径
- query-string:参数,发送给http服务器的数据
- anchor:锚,跳转到网页的指定锚点位置
- 如:http://localhost:4000/file/part01/1.2.html 或 http://item.jd.com/11936238.html#product-detail
HTTP常见的请求头 *
- Host:主机和端口号
- Connection:链接类型
- Upgrade-Insecure-Requests:升级为HTTPS请求
- User-Agent:浏览器名称
- Accept:传输文件类型
- Referer:页面跳转处
- Accept-Encoding:文件编解码格式
- Cookie:存储在浏览器的用户个人信息,安全级别低
- x-requested-with:XMLHttpRequest Ajax异步请求
GET方法和POST方法有什么区别?
- 安全性:POST高,GET低
- 参数位置:POST在请求体,而GET在URL
- 大小:POST无限制,GET最大1024B即1KB
响应状态码(status code)
- 200:成功
- 302:临时转移至新的url
- 307:临时转移至新的url
- 404:Not Found
- 500:服务器内部错误
字符串类型
-
bytes:二进制
- 互联网上数据的都是以二进制的方式传输的
-
str:unicode的呈现形式
Unicode UTF8 ASCII的补充
- 字符(Character)是各种文字的符号的总称,包括各国文字、标点符号、图形符号、数字等
- 字符集(Character set)是多个字符的集合
- 字符集包括:ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等
- ASCII编码是1一个字节,而Unicode编码通常是2个字节。
- UTF-8是Unicode的实现方式之一,UTF-8是Unicode的子集,一种变长的编码方式,可以是1,2,3个字节。
str和bytes如何转化
- str使用encode方法转化为bytes
- bytes使用decode方法转化为str
- 编码方式解码方式必须一样,否则就会出现乱码
requests库的基本使用
- requests库是用来发送请求,获取响应的
发送简单的请求
-
response = requests.get(url)
判断请求是否成功
assert response.status_code==200
response的常用方法:
- response.text
- response.content
- response.status_code
- response.requset.headers
- response.headers
发送带header的请求
- 目的:模拟浏览器、欺骗服务器、获取和浏览器一致的内容
- header的形式:字典
- headers={“User-Agent”:“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/54.0.2840.99 Safari/537.36”}
- 用法:requests.get(url, headers=headers)
发送带参数的请求
-
参数的形式:字典
-
如kw={‘wd’:‘python’}
-
用法:requests.get(url, params=kw)
url编码
- https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD
字符串格式化的另一种方式
'老{}人与海'.format(1)
Requests深入
发送POST请求
-
登录注册(POST比GET更安全)
-
需要传输大文本内容的时候
-
因此,爬虫也需要在这两个地方模拟浏览器发送post请求
-
用法:response = requests.post(url,data=data,headers=headers)
-
data的形式:字典
-
sys模块中的sys.argv属性
-
alias模块的运用,需要在bashrc目录下更改
使用代理ip
- 浏 -->(request) 代 -->(requests)Web
- 览
- 器 <-- (response) 理 <–(response)server
- 用法:requests.get(url, proxies= proxies)
- proxies的形式:字典
- 如proxies= {
“http”:“http://12.34.56.78:80”,
“https”:“https://12.34.56.78:443”
} - 目的:让对方服务器以为不是同一个客户端在请求,防止爬虫被发现
- 准备ip池,随机选择一个ip来使用
- 如何随机选择代理ip
- {“ip”:ip, “times”:0}
- [{},{},{}…],对这个ip的列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个ip,从中随机选择一个
- 检查ip的可用性
- 可以使用requests添加超时参数,判断ip地址的质量
- 在线代理ip质量检测的网站
携带cookie请求
- 目的:让对方服务器以为不是同一个客户端在请求,防止爬虫被发现
- 如何随机选择cookie
- {“cookie”:cookie, “times”:0}
- [{},{},{}…],对这个cookie的列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个cookie,从中随机选择一个
- 准备cookie池,随机选择一个cookie来使用
- 检查cookie的可用性
- 可以使用requests添加超时参数,判断cookie的质量
- cookie质量检测
session请求
- requests提供了一个叫做session类,来实现客户端和服务器的会话保持
- 用法:session = requests.session()
response = session.get(url,headers)
cookie和session的区别
- cookie数据存放在客户端浏览器上,session数据放在服务器上
- cookie安全性低,别人可以分析存放在本地的cookie并进行cookie欺骗
- session数据存放在服务器上,安全性高,但一般会有过期时间
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
爬虫处理cookie和session
- 能够请求登录后的页面
- 若请求太快太多,容易被服务器识别为爬虫
- 在不需要cookie的时候尽量不去使用cookie
使用requests提供的session类请求登录之后的网站的思路
- 实例化session
- 先使用session发送请求,登录网站把cookie保存在session中
- 再使用session请求登录之后才能访问的网站,session能够自动的携带登录的cookie进行请求
不发送POST请求,使用cookie获取登录后的页面
- cookie过期时间很长的网站
- 在cookie过期之前能够拿到所有的数据
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
字典推导式,列表推导式
cookies = "a=1; b=2; c=3; d=4"
cookies = {i.split("=")[0], i.split("=")[1] for i in cookies.split("; ")}
[self.url_temp.format(i * 50) for i in range(6)]
获取登录后的三种方式
- 实例化session,使用session发送post请求,再使用session获取登录后的页面
- headers中添加cookie键,值为cookie字符串
- 在请求中添加cookies参数,接收字典形式的cookie,字典形式的cookie中的键是cookie的name对应的值,值是cookie的value对应的值
requests与urllib
- requests的底层实现就是urllib
- requests在python2和python3中通用,方法完全一样
- requests简单易用
- requests能够自动帮助我们解压(gzip压缩的等)网页内容
- requests中文文档:http://docs.python-requests.org/zh_CN/latest/index.html
requests中解决编解码的方法
- response.content.decode()
- response.content.decode(“gbk”)
- response.text
寻找登录的post地址
- 在form表单中寻找action对应的url地址
- post的数据是input标签中name的值作为键,真正的用户名密码作为值得字典,post的url地址就是action对应的url地址
- 抓包
- 勾选perserve log按钮,防止页面跳转找不到url
- 寻找post数据,确定参数
- 参数不变,直接使用。如密码不是动态加密的时候
- 参数会变
- 参数在当前响应中
- 通过js生成
定位js
-
选中带有触发js事件的按钮,点击event listener找到js的位置
-
通过Chrome中的search all file来搜索url中的关键字
-
添加断点的方式来查看js的操作,通过python来进行同样的操作
requests小技巧
- requests.util.dict_from_cookiejar 把cookie对象转化为字典
- 请求SSL证书验证
- response = requests.get(“https://www.12306.cn/mormhweb/”, verify=False)
- 设置超时
- response = requests.get(url.timeout=10)
- 配合状态码判断是否请求成功
- assert response.status_code==200
安装第三方模块
- pip install
- 下载源码解码,进入解压后的目录,
python setup.py install
***.whl
安装方法pip install ***.whl