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"
s
=
requests.session()
r
=
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'
r
=
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"
s
=
requests.session()
r
=
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/'
r
=
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"
}
d
=
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())
|