爬虫定义
网络爬虫(又叫网页蜘蛛,网络机器人)就是模拟客户端发送网络请求,接受请求响应,一种按照一定的规则,自动地抓取互联网信息的程序
只要浏览器能做的事情,原则上,爬虫都能做
爬虫的分类
1.通用爬虫:通常指搜索引擎的的爬虫
2.聚焦爬虫:针对特定网站的爬虫
robots协议:网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不可以抓取
爬虫要根据当前url地址对应的响应为准,当前url地址的elements的内容和url的对应不一样
网页上的数据来源:1.当前url对应的响应中 2.其他url地址对应的响应中(比如ajax请求) 3.js生成的
响应状态码:200:成功 302:临时转移至新的url 307:临时转移至新的url 404:not found 500:服务器内部错误
bytes型和str型的转换:编码:encode()从str转换到bytes,解码:decode()从bytes转换到str,编码和解码方式必须一致,否则会出现乱码
Requests模块
先导入:import requests
1.response = requests.get('url地址') 拿到响应
2.response.content 得到bytes型数据
3.response.content.decode() 转化成str类型
4.response.text 也能获取网页字符串,不过解码方式是猜的,可能出现乱码
所以解决requests中编解码的方法
1.response.content.decode()
2.response.content.decode('gbk')
3.response.text
从上往下一次尝试,即可
5.response.status_code 获取请求状态
可以通过assert response.status_code == 200 来判断是否成功
6.response.request.headers 请求头
7.response.headers 响应头
8.response.request.url 请求的url
9.response.url 响应的url
10.发送带headers的请求
准备headers = {}的字典,然后将字典传入请求中,response = requests.get('url地址',headers=headers)
11.发送带参数的请求
准备字典kw = {'name':'xiaoming'},传入请求中response = requests.get('url地址',params=kw)
12.发送post请求
1.在登陆注册是(post比get相对安全)
2.需要传输大文本内容的时候(post请求对数据长度没有要求)
准备post_data = {},将post_data传入请求中,response = requests.post('url地址',data=post_data,headers = headers)
13.使用代理
准备proxies={'http':'http://12.34.56.79:9527','https':'https://12.34.56.79:9527'}字典,将proxies传入请求中,response.requests.get('url地址',proxies=proxies)
使用代理的原因:1.让服务器以为不是同一个客户端在请求
2.防止我们的真实地址被泄露,防止被追究责任
14.cookie和session区别
1.cookie数据存放在客户的浏览器上,session数据存放在服务器上
2.cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
3.session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能
4.单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
15.爬虫处理cookie和session
1.带上cookie,session的好处:能够请求到登录之后的页面
2.带上cookie,session的弊端:一套cookie和session往往和一个用户对应,请求太快,请求次数太多,容易被服务器识别为爬虫
3.不需要cookie的时候尽量不要去使用cookie,但为了获取登录后的页面,我们必须发送带cookie的请求
4.携带一堆cookie进行请求,把cookie组成cookie池
5.使用requests提供的session类,来实现客户端和服务器的会话保持
session = requests.session()
session.post('url地址',data=post_data,headers=headers)
response = session.get(url,headers)
6.不发送post请气,使用cookie获取登录后的页面
1.cookie过期时间很长的网站
2.在cookie过期之前能够拿到所有的数据
3.配合其他程序一起使用,其他程序程序获取cookie,当前程序专门请求页面
16.获取登录后页面的三种方式
1.实例化session,使用session发送post请求,在使用它获取登录后的页面
2.headers中添加cookie键,值为cookie字符串
3.在请求方法中添加cookies参数,接受字典形式的cookie,字典形式的cookie中的键是cookie的name对应的值,值为cookie的value对应的值
17.寻找登录的post地址
1.form表单中寻找action对应的url地址
post的数据是input标签中name的值作为键,真正的用户名密码作为值得字典,post的url地址就是action对应的url地址
2.抓包,寻找登录的url地址
勾选perserve log按钮,防止页面跳转找不到url,
寻找post数据,确定参数,
参数不会变,直接用,比如密码不是动态加密的时候,
参数会变,参数在当前的响应中,通过js生成
18.定位想要的js
1.选择会出触发js时间的按钮,点击event listener,找到js的位置
2.通过chrome中的search all file来搜索url中关键字
3.添加断点的方式来查看js操作,通过python来进行同样的操作
19.requests小技巧
1.requests.util.dict_form_cookiejar 把cookie对象转化为字典
2.requests.util.cookiejar_form_dict把字典转化为cookie对象
3.requests.utils.unquote('url地址') 对url地址进行解码
4.requests.utils.quote('url地址') 对url地址进行编码
5.请求ssl证书验证:response = requests.get('url地址',verify=False)
6.设置超时 response = requests.get(url,timeout=10)
20 安装retrying第三方模块:可以让方法执行多次后再选择失败