Cookie
Requests通过会话信息来获取cookie信息
Cookie的五要素:
Name value domain path expires
打印cookie的五大要素
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)
打印结果:
, , , ]> 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信息,如何访问网站:
import requests url = 'http://httpbin.org/cookies' r = requests.get(url, cookies={'key1': 'value1', 'key2': 'value2'}) print(r.text)
结果:
{ "cookies": { "key1": "value1", "key2": "value2" } }
请求到我的IP地址:
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属性。
西刺代理
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)
请求结果:
您的IP地址 您的IP是:[139.208.187.142] 来自:吉林省延边朝鲜族自治州 联通
如果代理需要账户和密码,则需这样:
proxies = { "http": "http://user:[email protected]:3128/", }
requests的中文乱码问题:
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
python2: import urllib import urllib2
python3: import urllib
Request方法:
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对象:
urllib2.Request
python3中接收request对象:
urllib.request.Request()
python3 对这个方法重新进行了封装。
(2)ullib模板可以提供运行urlencode的方法,该方法用于GET查询字符串的生成,urllib2不具备这样的功能,而且urllib.quote等一系列qoute和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是为什么有时候urllib和urllib2一起使用的原因。(quote 是用来给url转码的)
举例:
python2中使用urllib.encode
data = {"key1":"hello", "key2":"world"} d = urllib.encode(data)
作用:等同于域名后面的参数 www.**.com?key1=hello&key2=world
python3中使用parse.urlencode
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()编码
方法解释:
urllib.request.urlopen(url, data=None, timeout=None) url 需要打开的网站 data psot提交的数据 Timeout 网站访问的超时时间
但是没法伪装我们的头信息
from urllib import request req = request.Request(url, headers=headers, data=data) html = request.urlopen(req).read()
如果不自己添加信息,只需要加头信息,即添加一个字典形式的头信息即可访问,如下:
... ... 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同样可以实现添加头信息,请求页面:
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())