spider数据挖掘-----3、requests库理解

REquesets库:(比其他http库更简单)
一、简介:
把get等方法写成接口直接调用,有基本完全满足web请求的所有需求,

二、发起请求
每一个请求方法都有一个对应的API,比如GET请求就可以使用get()方法
post()方法,将需要提交的数据传递给data参数即可,POST请求发送form表单数据通过data,发送json数据通过json参数,
json和data不可以同时添加,同时添加会造成json中没有数据
发送数据的json方法是不会形成一个表单的,data方法只会形成表单不形成json数据
请求不再像urllib一样需要去构造各种Request、opener和handler,使用Requests构造的方法,并在其中传入需要的参数即可。
构造一个字典,并在请求时将其传递给params参数(含自动编码功能)
相同的url参数名,但有不同的值,而python的字典又不支持键的重名,那么我们可以把键的值用列表表示
自定义请求的Headers,同样的将字典数据传递给headers参数
自定义Cookies也不用再去构造CookieJar对象,直接将字典递给cookies参数,
requests如果要构造cookieJar,requests构造的可以跨站点跨路径使用,功能更完善
先构造一个类对象,jay=requests.cookies.RequestsCookiesJar()
这个对象有set方法,jay.set(’cookie11‘,’ai‘,domain=’站点‘,path’/cookies(站点中的路径)‘),
如果站点和路径不匹配,就不会把cookie携带上去,如果站点和路径存在就可以跨站点跨路径进行多站点保存cookie
使用代理时,同样构造代理字典,传递给proxies参数,可同时写http和https协议的代理地址
设置访问超时,设置timeout参数即可,不用传字典。基本都会用到,如果不使用,程序可能永远失去响应。只要服务器响应了就不会再去限制时间
requests默认重定向
某些网站需要证书验证,出现sslerror可以设置verify=false来解决
证书验证失败要把verify改成false,关闭后会有警告,用代码可以关闭这个警告,
requests.packages.urllib3.disable_warnings()通过requests调用urllib3库解决警告就不用import urllib3来引入
三、接收响应
response对象的属性
text(自带decode):直接转成字符串,非字节码。text解码不正确的时候,就需要我们自己手动的去指定解码的编码格式。
requests是通过猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,有时猜测不对,就手动解码
手动解码:res.enconde=’utf-8‘(如果换成gbk或ascii码格式,后面接着使用的text也会带入使用)
print(res.text)(重新使用定义res的编码格式,text会立马使用enconde的编码格式)
content(图片数据使用此参数):得到最原始的数据,字节码,当text匹配出来无法用非字节码解释,空的信息时,可以用content。
raw:得到比content更原始的数据,属于来自socket套接字的响应数据。使用前,要在request请求中使用方法stream调成true,raw.read(10)读取大小为10的长度
json():自动转换成字典格式(需要返回的是json数据才能用此方法,否则报错),后接[’headers‘]属于取key的值的方式,
接[’ko‘][’ui‘]是取ko键中的ui键的值(取字典中的字典)
cookie:查看响应的cookie值
request.url:查看请求的url
headers:得到响应头
request.headers:得到请求头
四:session对象
session方法是requests库发起请求的一种方法,该方法会自动保存访问页面得到的cookie值,从而再次访问的时候会自动携带cookie
经典的登录逻辑
功能:自动更新请求头信息,常用在账号登录的时候,先访问登录页url,再访问数据提交的url(该url在登录页面上收集数据用于提交)
session的使用与requests.get相似,使用session的时候要先创建session对象
session=requests.session()创建session对象
session.headers=headers添加请求头,直接对session设置的请求头,后面就不用再在参数中添加请求头方法了
session.get(url)这里requests对象换成了session对象,比requests对象好在,括号里自动更新进请求头,所以不用加headers参数,也不用改cookie
访问页面cookie和页面中的登录url的cookie不一样,所以用session对象会自动的改成正确的set_cookie来进行请求
服务器给cookie为cookie:~~

(这个为session自动更新的内容),请求出示验证的cookie为set.cookie:~~~

requests爬取多页(多个页面)百度图片
经过3个连续的page页面,对比网址发现pn(PageNumber)值有一定的规律,30,60,90,一次爬30张,第二次一共爬60,三次就90每页30张图片
https://cn.bing.com/images/search?q=%E6%9C%BA%E7%94%B2&form=HDRSC2&first=3(这里为页数,把这里用循环改了就可以爬取多页)&tsc=ImageHoverTitle
正则得到网址后在for循环里还要进行对网址发请求才能获取信息,否则只能得到base64的乱码

使用购买的代理ip:
from proxy_dir~~~~~ import proxy ~~~~~
proxymeta=’http~~%~~%~%

(这里需要有用户名和密码的数据,需要用户提前实名核对)‘%{’host‘:proxyHost,‘~’:~,~~·}
proxy={“http”:proxymeta,“https”:proxymeta}这一步和不用购买的ip代理都要有

anaconda:管理python的一个工具,管理python的安装包,各个包之间的位置,使用一些库比单独只有python时使用更方便
创建好anaconda还要创建一个anaconda的虚拟环境,最后记得切换环境
在本地用scrapy的时候和twisted包会不兼容,在anaconda环境使用兼容性要好更多

进入次级网页的代码往往需要构造传入url参数,因为次级网址一般只比初始网站的网址多了些url参数

猜你喜欢

转载自blog.csdn.net/qwe863226687/article/details/114116735
今日推荐