PYTHON 七月 26, 2019

3.登录相关、代理

文章字数 5.5k 阅读约需 5 mins. 阅读次数 1000000


URLError


URLError是HTTPError的父类型:

出现URLError的错误原因:

  • 没有网
  • 服务器连接失败
  • 找不到指定的服务器
import urllib.request
import urllib.error

url = 'http://www.basjdfkjgkfjgfjhd.com.cn'
try:
    re = urllib.request.urlopen(url)
    print('here')
except urllib.error.URLError as e:
    print(e.reason)

    # [Errno 11001] getaddrinfo failed

Handler处理器、自定义Opener


  • 高级功能的处理:使用代理和cookie
#向百度发起一个请求
url='http://www.baidu.com/'
#1.创建一个Handler处理器对象
handler=urllib.request.HTTPHandler()
#2,通过处理器对象生成一个Opener对象
opener=urllib.request.build_opener(handler)
#opener作用:发起请求
request=urllib.request.Request(url)

response=opener.open(request)
print(response.read())
# <http.client.HTTPResponse at 0x7dbd780>

代理


  • 生活:中介,代购
  • 程序: 正向代理:代理客户端获取数据 反向代理:代理服务器提供数据
#使用代码的形式设置客户端代理
#创建处理器对象
handler=urllib.request.ProxyHandler(proxies={'http':'112.95.224.58:80'})
#2。创建opener对象,然后使用该对象发起一个请求
opener=urllib.request.build_opener(handler)
url='https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=IP&oq=%25E8%25A5%25BF%25E5%2588%25BA%25E4%25BB%25A3%25E7%2590%2586&rsv_pq=fee3639900007be7&rsv_t=0d8cHJ8skuhEa3sCpORP%2FnTD7xO8gLUHq1Azm%2FXGJmqWlTIM3GuMWBSzjTg&rqlang=cn&rsv_enter=1&inputT=1271&rsv_sug3=12&rsv_sug1=6&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1271'

response=opener.open(url)

with open('./daili.html','wb') as fp:
    fp.write(response.read())


cookie是什么?

  • http协议,无状态
  • 网站登录时候的时候,用来记录用户身份的
#模拟登陆-cookie
#人人网案例:进入需要登录才可以访问的网页,则可以带着cookie值进行访问
url='http://www.renren.com/289676607/profile'
headers={
    "Cookie": "anonymid=jl1x24dy-u0udsq; depovince=BJ; _r01_=1; __utma=151146938.1794929042.1534809369.1534809369.1534809369.1; __utmz=151146938.1534809369.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _de=0832477C7D3BDE6C8C7E21AC68FA766C7DE1374C26B60001; ln_uact=www.zhangbowudi@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20120418/1315/h_main_0Rbs_563500058dec2f76.jpg; jebe_key=626a9db1-7655-44f4-a1f2-6f69b1e0e681%7C55b0a29313d4d905d984b3769dc164d4%7C1534809469266%7C1%7C1534809477953; jebecookies=56edc7c2-4deb-4e27-8742-b6393274dfc7|||||; JSESSIONID=abcH2ScyV4I-2baIjJBvw; ick_login=9fc272ea-6b5d-4898-ae49-9813f4d7331b; p=0c58e07ece2863c4a02deda63944262a7; first_login_flag=1; t=e39afe60de96d0a877661965f4b7bacf7; societyguester=e39afe60de96d0a877661965f4b7bacf7; id=289676607; loginfrom=syshome; wp_fold=0; xnsid=a47161ec"
}
request=urllib.request.Request(url,headers=headers)
response=urllib.request.urlopen(request)
with open('./renren.html','wb') as fp:
    fp.write(response.read())

cookiejar对象


  • 作用:
    自动保存请求中的cookie数据信息

  • 注意:
    必须和handler和opener一起使用

  • 创建一个cookiejar对象

    • import http.cookiejar
    • cj = http.cookiejar.CookieJar()
  • 通过cookiejar创建一个handler

    • handler = urllib.request.HTTPCookieProcessor(cj)
  • 根据handler创建一个opener

    • opener = urllib.request.build_opener(handler)
  • 再往下所有的操作都是用opener.open方法去发送请求,因为这里面带着cookie过去了

  • 代码:

      #使用cookiejar实现人人网的登陆
      import urllib.request
      import urllib.parse
      import http.cookiejar
      cj = http.cookiejar.CookieJar() #请求中的cookie会自动存储到cj对象中
      #创建处理器对象(携带cookiejar对象的)
      handler=urllib.request.HTTPCookieProcessor(cj)
      #创建opener对象 (携带cookiejar对象)
      opener=urllib.request.build_opener(handler)
    
      #要让cookiejar获取请求中的cookie数据值
      url='http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201873958471'
      #自定义一个请求对象,让该对象作为opener的open函数中的参数
      data={
          "email":"www.zhangbowudi@qq.com",
          "icode":"",
          "origURL":"http://www.renren.com/home",
          "domain":"renren.com",
          "key_id":"1",
          "captcha_type":"web_login",
          "password":"40dc65b82edd06d064b54a0fc6d202d8a58c4cb3d2942062f0f7dd128511fb9b",
          "rkey":"41b44b0d062d3ca23119bc8b58983104",
          'f':"https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DpPKf2680yRLbbZMVdntJpyPGwrSk2BtpKlEaAuKFTsW%26wd%3D%26eqid%3Deee20f380002988c000000025b7cbb80"
      }
      data=urllib.parse.urlencode(data).encode()
      request=urllib.request.Request(url,data=data)
      opener.open(request)
    
      #获取当前用户的二级子页面
      s_url='http://www.renren.com/289676607/profile'
      resonse=opener.open(s_url)
    
      with open('./renren.html','wb') as fp:
          fp.write(resonse.read())
    

上一篇:
下一篇:
0%