Cookie

Requests通过会话信息来获取cookie信息

Cookie的五要素:

    Name   value   domain   path  expires


打印cookie的五大要素

1
2
3
4
5
6
7
8
9
10
11
12
import  requests
url  =  "http://www.hao123.com"
=  requests.session()
=  s.get(url)
print  (r.cookies)
for  cook  in  r.cookies:
     print  (cook.name)
     print  (cook.value)
     print  (cook.domain)
     print  (cook.path)
     print  (cook.expires)
     print  ( "#"  *  30 )


打印结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<RequestsCookieJar[<Cookie BAIDUID=C425EDB0B83699C89BDA3D02B25C53BA:FG=1  for  .hao123.com/>, <Cookie hz=0  for  .www.hao123.com/>, <Cookie ft=1  for  www.hao123.com/>, <Cookie v_pg=normal  for  www.hao123.com/>]>
BAIDUID
C425EDB0B83699C89BDA3D02B25C53BA:FG=1
.hao123.com
/
1548337791
##############################
hz
0
.www.hao123.com
/
None
##############################
ft
1
www.hao123.com
/
1516809599
##############################
v_pg
normal
www.hao123.com
/
None
##############################

你只要获得了登陆页的cookies,你就可对网站进行合理的请求和访问了。

使用已知cookie信息,如何访问网站:

1
2
3
4
import  requests
url  =  'http://httpbin.org/cookies'
=  requests.get(url, cookies = { 'key1' 'value1' 'key2' 'value2' })
print (r.text)

结果:

1
2
3
4
5
6
{
     "cookies" : {
     "key1" "value1" ,
     "key2" "value2"
     }
}

请求到我的IP地址:

1
2
3
4
5
6
7
import  requests
url  =  "http://2017.ip138.com/ic.asp"
=  requests.session()
=  s.get(url = url)
print  (r.encoding)
r.encoding  =  "gbk"
print  (r.text)


代理访问:

采集时为避免被封IP,经常会使用代理。

requests也有相应的proxies属性。

西刺代理

1
2
3
4
5
6
7
import  requests
proxies  =  {
"http" "http://139.208.187.142:8118"
}
r1  =  requests.get( "http://2017.ip138.com/ic.asp" , proxies = proxies)
r1.encoding  =  "gbk"
print  (r1.text)

请求结果:

1
2
3
4
5
6
<html>
< head >
<meta http-equiv= "content-type"  content= "text/html; charset=gb2312" >
<title> 您的IP地址 < /title >
< /head >
<body style= "margin:0px" ><center>您的IP是:[139.208.187.142] 来自:吉林省延边朝鲜族自治州 联通< /center >< /body >< /html >

如果代理需要账户和密码,则需这样:

1
2
3
proxies  =  {
     "http" "http://user:pass@10.10.1.10:3128/" ,
}


requests的中文乱码问题:

1
2
3
4
5
6
7
import  requests
param  =  { "key1" "hello" "key2" "world" }
url  =  'https://www.baidu.com/'
=  requests.get(url = url)
print (r.encoding)               #ISO-8859-1默认使用的是这个
r.encoding  =  "utf-8"
print (r.text)

这样就可以正常显示了


总结:

Requests给你提供的所有接口,在传输数据的时候,都可以以key:value的形式进行传输,这个也是为什么特别使用requests的原因

如果你使用urllib,那么你就没有这么幸运了,很多事情都需要你自己去处理,并不可以直接通过dict的形式进行传输,需要进行装换。



Urllib 模块

在python2和python3上有差异

在python2上,urllib和urllib2各有各的功能,虽然urllib2是urllib的包装、升级版,但是urllib2还是不能完全替代urllib,而在python3中,则全部封装成1个类:urllib

1
2
3
python2:
import  urllib
import  urllib2
1
2
python3:
import  urllib


Request方法:

1
2
import  urllib.request
urllib.request.Request(url, data = None , headers  =  {}, method =  None )


先看看python2中的urllib2和urllib的区别

(1)urllib2可以接收一个request对象,并以此可以来设置一个url的headers,但是urllib只可以接收一个url,这就意味着你不能通过urllib伪装自己的请求头。

举例:

python2中接收request对象:

1
urllib2.Request


python3中接收request对象:

1
urllib.request.Request()

python3 对这个方法重新进行了封装。


(2)ullib模板可以提供运行urlencode的方法,该方法用于GET查询字符串的生成,urllib2不具备这样的功能,而且urllib.quote等一系列qoute和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是为什么有时候urllib和urllib2一起使用的原因。(quote 是用来给url转码的)

举例:

python2中使用urllib.encode

1
2
data  =  { "key1" : "hello" "key2" : "world" }
=  urllib.encode(data)

作用:等同于域名后面的参数 www.**.com?key1=hello&key2=world


python3中使用parse.urlencode

1
2
3
4
5
6
7
8
9
10
11
from  urllib  import  parse
import  urllib.request
url  =  "www.hao123.com"
data  =  { "key1" : "hello" "key2" : "world" }
ndata  =  parse.urlencode(data)     #将数据转化成一个字典形式
print  (ndata)
#打印结果:key1=hello&key2=world
#继续往下:
req  =  urllib.request.Request(url = url, data = ndata.encode( "utf-8" ))
res  =  urllib.request.urlopen(req)
print  (res.read().decode( "utf-8" ))

【注意】:urlencode()主要作用就是将url附上要提交的数据。Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码


方法解释:

1
2
3
4
urllib.request.urlopen(url, data = None , timeout = None )
url         需要打开的网站
data            psot提交的数据
Timeout          网站访问的超时时间

但是没法伪装我们的头信息

1
2
3
from  urllib  import  request
req  =  request.Request(url, headers = headers, data = data)
html  =  request.urlopen(req).read()


如果不自己添加信息,只需要加头信息,即添加一个字典形式的头信息即可访问,如下:

1
2
3
4
5
6
... ...
headers  =  { "User-Agent" :
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36" }
req  =  urllib.request.Request(url = url, headers = headers)
res  =  urllib.request.urlopen(req)
print  (res.read().decode( "utf-8" ))


分享链接:时下流行的浏览器User-Agent大全

http://blog.csdn.net/u012175089/article/details/61199238


同理,python2同样可以实现添加头信息,请求页面:

1
2
3
4
5
6
7
8
import  urllib
import  urllib2
headers  =  { "User-Agent" :
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36" }
url  =  "https://www.qiushibaike.com"
req  =  urllib2.Request(url, headers = headers)
res  =  urllib2.urlopen(req)
print  (res.read())