爬虫的基础知识
1.什么是爬虫
·爬虫就是根数客户运(测宽格)发送网络请求,获取响应,按照规则提取数据的程序
·模以客户课(测宽档)发送网络请求:照看浏览器发送一模一样的请求,获取和湖览器一模一样的数据
2.爬虫的数据去哪了
·呈现出来:展示在网页上,或者是展示在app上
·进行分析:从数据中寻找一些规律,比如我们可以利用百度指数来进行相关结果的分析
3.需要的软件和环境
·python3
。黑马python基础班15天视屏:http://yun.itheima.com/course/214.html
。基础语法(字符串,列表,字典,判断和循环)
。函数(函数的创建和调用)
。面向对象(如何创建一个类,如何使用这个类)
·pycham
。python编辑器
Pycharm与jupyter book之间的区别在于:
jupyter book没有自动补齐等功能。
·chrome浏览器
。分析网络请求用的
4.浏览器的请求
·url
。在chrome中点击检查,点到network,重新刷新后就会显示出来,
。url=请求的协议+网站的域名+资源的路径+参数
以搜索“船只”为例,搜索后获得的url如下所示:
https(请求的协议)://www.baidu.com(网站的域名)/s(资源的路径)?wd=%E8%88%B9%E5%8F%AA&rsv_spt=1&rsv_iqid=0xdfd52ecb000256f4&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=13&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&inputT=3457&rsv_sug4=3458(参数)。
将上述url中的参数部分放在解码工具中进行解码即可得到:
wd=船只&rsv_spt=1&rsv_iqid=0xdfd52ecb000256f4&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=13&rsv_sug1=17&rsv_sug7=100&rsv_sug2=0&inputT=3457&rsv_sug4=3458,即%E8%88%B9%E5%8F%AA&rsv_spt=1被解码成汉字“船只”
- ·测览器请求ur地址
- 当前url对应的响应+js+cs8+图片-》elements中的内容
- 爬虫请求url地址
- 当前url对应的响应
- elements的内容和爬虫获取到的urt地址的响应不同,爬虫中需要以当前un地址对应的响应为准提取数据
- 当前urt地址对应的响应在哪里
- 从netwwork中找到当前的uri地址,点击response
- 在页面上右键显示网页源码
url=请求的协议(http或者https)+网站的域名+资源的路径+参数;
浏览器请求的url地址:当前ulr对应的响应+js+css+图片——elements的内容
爬虫请求的url地址:只有当前ulr对应的响应
elemens的内容和爬虫获取到的url地址的响应不同,爬虫中需要以当前url地址对应的响应为准提取数据,
当前url地址对应的响应为准提取数据:从network找到当前的url地址,点击response;
或者在页面上右击点击显示网页源码,但是对于网页页面更新非常快的网页,这两个地方的内容可能会出现不一样。
5.HTTP 和HTTPS
http:超文本传输协议,客户端和服务端之间约定了一个协议,以明文形式传输,效率更高,但是不安全,
https:https=http+ssl(安全套接字层),在每次传输数据之前数据先加密,然后到服务器后再解密,效率地,安全。
http协议之请求:
headers:
请求方法:geting求和post请求方法
cookie:
请求体:get请求没有请求体,post请求有请求体。
get请求和post请求之间的区别:
get请求没有请求体,post有,get请求把数据放到url地址中
post请求常用于登陆注册
post请求携带的数据量比get请求大、多,常用于大文本的传输
HTTP协议之响应:
1.请求行
·2.请求头
·User-Agont用户代理:对方服务器能够通过user_agent知道当前请求对方资源的是什么浏览器
·如果我们需要模拟手机版的浏览器发送请求,对应的就需要把user_agent改成手机版
·Cookie:用来存储周户信息,每次请求会被携得上发送给对方的浏览器
·要获取登最后才能访问的页面
·对方的服务器会通过Cookie来判新是我们是一个爬虫
3.请求体
·携带数据
·get请求没有请求体
·post请求有请求体
·HTTP协议之响应
。1.响应头
·Set-Cookie:对方服务器通过该字段设置cooke到本地
。2.响应体
·地址对应的响应
5.requests模块的学习
使用前
·pipinstal requests
发送get,post请求,获取响应
·response= requests.get(url),发送get请求,请求url地址对应的响应
·response= reqeusts.post(url,data={请求体的字典})发送post请求,请求url地址对应的响应
6.response的方法
·response.text
。该方式往往会出规乱码,出现乱码使用response.encoding='utf-8'
·response.content.decode(),注意这里decode中默认的是utf-8类型的字符,所以不用写成decode(utf-8)
。把响应的二进制字节流转化为str类型
response.requests.url ,发送请求的url地址
response.url ,response响应的url地址
response.requests.headers ,请求头
response.headers ,响应头
7.获取网页源码的正确打开方式(通过下面三种方式一定可以获取网页的源码字符串)
·1.response.content.decode()
·2.response.content.decode('gbk')
·3.response.text,注意response.text是指requests模块通过对请求头的分析来猜出来的网页源码,但是由于网页源码都很规范,所以一般都能够猜对。
8.发送带header的请求(为了模拟浏览器获取和浏览器一模一样的内容)
Headers={
'User-Agent': 'Mozilla/5.0(iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, likeGecko) Version/11.0 Mobile/15A372 Safari/604.1
'}
注意由于爬虫是伪装成浏览器去完成获取对方服务器的某些信息,但是爬虫始终不是浏览器,因此很容易被对方的服务器识破,因此为了模拟的更为真实,不仅需要加上url,还需要加上User-Agent,如果不够还要加上Referer、甚至是cookie等信息,直至成功为止;但是大部分情况下带上User-Agent就可以)
Response=requests.get(url,headers=headers)
9.使用超时参数
requests.get(url,headers=headers,timeout=3)#3秒内必须返回响应,否则会报错,为了减少网络波动的影响就需要retrying模块。
10.retrying模块的学习
pipinstall retrying
from retrying importretry
@retry(stop_max_attempt_numbers=3)
def func():
print("this is funcl")
raiseValueError("this is test error")
11.处理cookie相关的请求
·人人网{'email:"mr_mao-hacker@163.com","password":"alarmchime}
·直接携带cookie请求url地址
。1.cookie放在headers中
headers={"user-Agent":...…",“Cookie":"cookie字符串“}
。2.cookie字典传给cookies参数
·requests.get(url,cookies=cookie_dict)
·先发送post请求,获取cookle,带上cookie请求登录后的页面
。1.seesion=requests.session()#session具有的方法和requests一样
。2.session.post(url,data,headers)#服务器设置在本地的cookie会保存在session中
。3.session.get(url)#会带上之前保存在session中的cookie,能够请求成功
使用超时参数
处理cookie相关的请求
第二课程
数据提取方法
json
·数据交换格式,看起来像python类型(列表,字)的字符串
·使用ison之前需要导入·
.哪里会返回json的数据
。流程器切换到手机版
。抓包app
·json.loads
。把json字符串转化为python类型,把json类型转化为字典
。json.loads(json字特串)
·json.dumps
。把python类型转化为json字符串,把字典类型转换为json,一般字典类型的文件无法写入本地,此时就需要先将字典类型的文件转换为json然后再写入本地
。json.dumps({})
。json.dumps(ret1,.enaureascli=False,indent=2)
·ensure ascl:让中文显示成中文
·indent:能够让下一行在上一行的基础上空格
·豆瓣电视爬虫案例
注意在写爬虫的时候尽量将谷歌浏览器切换到手机模式,因为在手机模式下更容易出现json类型。
技巧:在切换到手机模式下的时候可以直接先打开百度搜索页面,然后就切换到手机模式,此时就会出现手机浏览器上常见的浏览模式。
xpath和lxml
·xpath
。一门从html中提取数据的语言
·xpath语法
。xpathhelper插件:帮助我们从elcnents中定位数据
。1.选择节点(标签)
·/html/head/head:能够选中html下的head下的所有的meta标签
。2.//:您够从任意节点开始选择
·//li:当前页面上的所有的li标签
·/html/head//linkhead下的所有的link标签
。3.@符号的用途
·选择具体某个元素://div[class='feed']/ul/1i
·选择class=feed'的div下的ul下的li
·a/@href:选择a的href的值
。4.获取文本:
·/a/text():获取a下的文本
·/a//text():获取a下的所有的文本
。5.点前
·"/a"当前节点下的a标签
·lxml
。安装:pip installlxml
。使用