一、urllib库(内置官方标准库,built-in),python3中整合了1和2代
1、urllib.request请求模块(爬虫进行伪装的核心部分)
构造网络请求,可以添加Headers,proxy等
(1)发起简单的网络请求:
urlopen方法:urllib.request.urlopen(url(必须有), data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url:可以是字符串也可以是request对象
data可以写GET(直接显示在请求上)或POST(form表单不会在url进行显示,表单为data=b“~~~~~~”),GET安全性低于POST
timeout:如果超出这个时间还没响应就会报错,以秒为单位,当赋予很快的速度,程序跟不上就会报错
*后面的都要强制以关键字参数的形式传入
cafile中的ca是管理颁发证书的机构,经过认证才有,有公证的作用
返回值:请求后都会返回一个urllib.response对象,包含一些属性和方法,供我们处理结果
响应属性:read(只能用一次)字节串,所有内容 getcode获取状态码 info获取响应头信息
(2)添加Headers(构建更加完整的请求联合urlopen方法来使用,只用urlopen方法只能用两种方法(有data的时候用post),用request对象能用4种)
其中的User-Agent是告诉服务端,自己用的是什么服务器
Request是一个发送完整网络请求的对象,然后返回请求对象。其中带Headers
Headers: “User-Agent”:“Python-urllib/3.6”需要是字典的形式
request.urlopen(request.Request······)
返回一个urllib.response的对象,其中的方法有read(只能使用一次,加入多条打印会返回空字符) readline()info() geturl()getcode()
(3)操作cookie(登录时使用,会话技术,爬虫要伪装不用操作cookie)
创建cookie对象–创建cookie处理器–以cookie处理器为参数创建Openner对象–使用这个openner来发送请求,User-Agent说明自己是友好的代理服务器
cookie会过期,有时限性
(4)使用代理(最安全的请求方式)
url=“http~~~~~/ip(ip代理)”,如果操作cookie进行爬虫请求容易被封IP,为了伪装得更好,还要添加Headers请求头,不加Headers请求成功的可以不用写
代理地址(指http通过什么地址进行代理)–代理处理器(这里往后与cookie类似)–创建Openner对象,
创建对象后使用了代理,查看返回值read会发现地址已经变成了代理地址
2、urllib.error异常处理模块(请求不能被正常处理时,所进行的处理)
URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理
HTTPError:是URLError的子类,主要包含三个属性Code、reason、headers,
可以用try和except检查错误,except error.HTTPError as e: print(e.Code),
可以检查到被服务端检测到是爬虫不被访问所反馈回来的错误原因等信息,然后通过URLError或HTTPError进行错误分析
3、urllib.parse:url解析模块(和请求模块一样重要,在构造特殊url时进行解析)
url只能包含ascii字符,
单个参数转码:
parse.quote()转译ascii码,parse.unquote()转回原意
多个参数转码:
parse.urlencode()
parse.parse_qs()将它转回字典
4、urllib.robotparse:robots.txt解析模块
robots.txt是网站的一个公告,爬虫可以不遵守,但解析模块可以了解到内容,一般在网址之后加robots.txt就可以看到
Robots协议(网络爬虫排除标准),网站一般都写着不让任何爬虫访问。但爬虫一般不会遵守
User-agent: Baiduspider表示为百度爬虫进行的爬取
Disallow: /baidu表示为不允许爬取百度目录下的所有数据
二、urllib3库(第三方的标准库,非官方。先建立连接池来进行后续的操作,可以和urllib相互补充)
用于HTTP客户端的python库,100%测试覆盖率(非常稳定的库)
先实例化一个管理池的对象,然后发送一个请求
其中的请求方式为http(管理池对象).request(“GET”,“~~~”)同样使用了request模块
request方法:
源码:request(self,method,url,fields(相当于urllib的data)=None,headers=None,**urlopen_kw(自定义的关键字参数))
url:只能是字符串形式,不能是request对象,即不再是Request(url(这里可以是request对象))格式,而是http.request(url(这里不是request对象))
返回值:和urllib一样是respones对象
print(“status”,respones.status)打印字符串status和respones对象的状态码
使用代理形式和urllib类似,这里不用http管理池对象了,而是换成了proxy对象,proxy=urllib3.proxyManager(“http~~~”)
res=proxy.request(“get,~~~~”)
stream方法可以指定量的提取大量数据
Request data:
get、head、delete请求,可以通过提供字典类型的参数fields来加查询参数(不是添加表单(只能由post递交),是加参数),一般在url后面接着
post和input请求,需要通过url编码将参数变成正确格式再拼接到url中,传递表单是可以通过fields参数添加:fields={’field‘:‘·······’}
get中的fields内容会变成参数,post中的fields内容会变成表单
通过json模块,loads为转字典数据类型的方法json.loads(~~~~~)[“json”(先loads再进行的提取,提取json数据,
如果是form,就是提取form表单的数据)]
如果是【‘fields’】是提取文件上传的内容,提取多种数据,可以并列写在后面
文件上传:Files
图片上传:binary data
response对象和urllib的类似,同样提供了相应的属性,其中的data属性为返回数据
响应返回的是json数据,就可以通过json模块
响应返回的是二进制的数据,通过stream来处理更好
三、urllib3下载百度图片
爬虫一般开发流程
向page页发送请求,得到图片对应的url,然后提取图片的url,再通过图片的url去得到图片资源,然后保存(数据持久化,保存到目录可以用到os库)
写正则提取的要在源码里也有,才能使用,data-imgurl用不了可以用其他的url键,比如thumbURL
提取图片用到for循环加入的enumerate(),for后接多一个变量,用来接收enumerate容器中枚举对象的下标
os.mkdir(“cat”)命令用于创建目录。
img_name=‘cat/’+str(inedx)=‘jpg’
“wb” 以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件
使用HTTPBin测试HTTP库 :http://httpbin.org
http://httpbin.org/get访问该网址在后面输入get,是会得到用户请求的信息,其中的ip未经处理的是用户的本地ip地址
http://httpbin.org/get?name=‘·······’这里get后加?是一种格式,给请求传参数,然后可以通过一些方法来查看返回值是怎样的
bytes字节串:存储字节(0-255)
str字符串:存储Unicode字符(0-65535)
if ‘\’ in img_url:
img_url = img_url.replace("\", “”) 剔除\,将\转成空的,变成不带\的http,然后就可以使用了
for index,img_url in enumerate(imgs_url):提取的数据存储前要枚举,否则图片会覆盖已经有图片的文件
os模块创建文件夹
针对反爬机制,可以通过进入图片网页查看源代码,找XHR下的请求头或请求url这两种方法来避开安全协议