手动添加cookie

过于简单,不作细述

  1. header = {
  2. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
  3. 'Cookie':'cna=tuxEE3P7Ah4CATsurIJv/hNX; thw=cn; miid=82973328358325713; hng=CN%7Czh-CN%7CCNY%7C156; enc=kRhiJJnvm93D0rrXU7wRBAaqd%2FIu5LOUzL12ixGWG7mDUwOyqHNGcPQhxt%2BpZYJvk7OKyIoTwXjjdWJS7nXYpw%3D%3D; UM_distinctid=168d4da25ce206-02459feb9-3b664008-1fa400-168d4da25cf36b; v=0; _tb_token_=eb3533565b383; unb=652498984; sg=54b; t=d67352809c9dfb1dc94c606e4d904faf; _l_g_=Ug%3D%3D; skt=0457744f2cebfa42; cookie2=59fbade39ff2795b3bae1040d518612d; cookie1=ACi9bWtE9Swd%2B7nwwIWMZefTwl6qKUcepd4lYB%2B9GhY%3D; csg=d905bd39; uc3=vt3=F8dByEzaZ25JtIrFM94%3D&id2=VWojfdPOsPRO&nk2=FPjanhY%2Fn9CxQYviMZUN&lg2=WqG3DMC9VAQiUQ%3D%3D; existShop=MTU1MDgzNDUxNg%3D%3D; tracknick=wangmin69323585; lgc=wangmin69323585; _cc_=V32FPkk%2Fhw%3D%3D; dnk=wangmin69323585; _nk_=wangmin69323585; cookie17=VWojfdPOsPRO; tg=0; mt=ci=9_1; ubn=p; ucn=unshyun; l=bBSQZo7cvM7X8RE2BOfalurza77OwIRb4PVzaNbMiICPOafeSQ1lWZZhyqLwC3GVw1YpR3JY9i9vBeYBqSf..; isg=BH9_ASiVH9kGVR1_dokonvm8DlMJZNMGQCRZRRFMpi51IJ-iGTF1VsqyYrB7fat-; uc1=cart_m=0&cookie14=UoTZ5OgAB6aJAA%3D%3D&lng=zh_CN&cookie16=U%2BGCWk%2F74Mx5tgzv3dWpnhjPaQ%3D%3D&existShop=true&cookie21=VT5L2FSpdet1EftGlDZ1Vg%3D%3D&tag=8&cookie15=UtASsssmOIJ0bQ%3D%3D&pas=0'
  4. }
  5. #构建请求对象
  6. request = urllib.request.Request(url,headers=header)

持续携带cookie

cookiejar 会自动带着coolie去访问网站

`首先请求登录页面,获得cookie,这个时候cookiejar会自动保存我们的cookie

然后再去访问个人中心`

  1. import urllib.request
  2. from http import cookiejar
  3. import urllib.parse
  4. url_login = 'https://www.yaozh.com/login' #登录页面
  5. url_personcent = 'https://www.yaozh.com/member/'#登录成功,个人中心页面 因为为登录前不会有个人中心,这里不一定非要设置个人中心,你也可以设置只要是登录才可以访问的页面也可,这样就可以这么cookiejar带着cookie的
  6. login_form_data = { #切记如下的一个不能少,我们只需要抓请求包即可,复制到这里,所以不一定只是这些参数,也不一定就需要如下参数,看抓包的结果就行
  7. 'username': 'Sparky',
  8. 'pwd': '198248.zcc',
  9. 'formhash':'5515EFBA25',
  10. 'backurl': 'https%3A%2F%2Fwww.yaozh.com%2F'
  11. }
  12. headers = {
  13. "User-Agent":"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"
  14. }
  15. login_str = urllib.parse.urlencode(login_form_data).encode('utf-8') #参数 将来 需要转译 转码; 2. post请求的 data要求是bytes
  16. data = urllib.request.Request(url_login,headers=headers,data=login_str) #不是访问,只是添加相关参数headers,data信息
  17. cookjar = cookiejar.CookieJar()
  18. handler = urllib.request.HTTPCookieProcessor(cookjar)
  19. opener = urllib.request.build_opener(handler)
  20. datas = opener.open(data) ## 如果登录成功, cookjar自动保存cookie
  21. url_cen = urllib.request.Request(url_personcent,headers=headers) #Request不是访问,而是指定url添加相关参数
  22. response = opener.open(url_personcent) ## 如果登录成功,表示我们已经成功让cookijar携带我们的cookie了
  23. data = response.read().decode('utf-8')
  24. with open('01cook_3.html', 'w',encoding='utf-8') as f:
  25. f.write(data)

异常处理

urllib模块中的urllib.error子模块,包含了URLError 、 HTTPError

URLError

  1. import urllib.request
  2. import urllib.error
  3. url = 'https://blog.csdn.net/weixin_43362002/article/details/10' #不存在的url
  4. try:
  5. data = urllib.request.urlopen(url).read().decode('utf-8')
  6. print(data)
  7. except urllib.error.URLError as e:
  8. print(e.reason)

运行结果如图

图片.png

HTTPError

  1. import urllib.request
  2. import urllib.error
  3. url = 'https://blog.csdn.net/weixin_43362002/article/details/10' #不存在的url
  4. try:
  5. data = urllib.request.urlopen(url).read().decode('utf-8')
  6. print(data)
  7. except urllib.error.HTTPError as e:
  8. print(e.code)
  9. print(e.reason)
  10. print(e.headers)

运行结果如图
图片.png

Response响应

requests模块—-比urllib更方便

接下来的内容都是围绕这个模块展开的

基本使用

  1. Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 哦!

简单来说,和urllib一个性质,只是代码用起来相对简介,还有其他新的功能,这里只是简单介绍一些,更全内容上有链接

  1. import requests
  2. url = 'https://www.baidu.com/'
  3. data = requests.get(url)
  4. print(data.headers) #获取响应头
  5. print(data.request.headers) #获取请求头
  6. print(data.status_code) #获取响应状态码
  7. print(data.cookies) #获取请求的cookie
  8. print(data.request.method) #获取请求方式
  9. #还有许多,你可以去了解

自动转译

  1. requests模块发送请求有dataparams两种携带参数的方法。
  2. paramsget请求中使用,datapost请求中使用。
  3. import requests
  4. requests.get('http://www.dict.baidu.com/s', params={'wd': 'python'}) #GET参数实例
  5. requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '测试POST'}) #POST参数实例

说起来就是在网址后面添加参数而已,只是get请求用params,post请求用data

  1. import requests
  2. url = 'https://www.baidu.com/s?'
  3. params = {
  4. 'wd':'动漫'
  5. }
  6. data = {
  7. 'wd':'动漫'
  8. }
  9. headers = {
  10. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0'
  11. }
  12. url_GET = requests.get(url,params=params,headers=headers)
  13. url_POST = requests.post(url,data=data)
  14. print(url_GET)
  15. print(url_POST)

可以看到我没有对中文进行处理,即自动转译

用json转为字典

忽略第三方证书ssl

核心语句:verify=False

  1. import requests
  2. url = 'https://www.12306.cn/index/'
  3. headers = {
  4. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
  5. }
  6. # 因为hhtps 是有第三方 CA 证书认证的
  7. # 但是 12306 虽然是https 但是 它不是 CA证书, 他是自己 颁布的证书
  8. # 解决方法 是: 告诉 web 忽略证书 访问
  9. #verify=False忽略第三方证书认证
  10. response = requests.get(url=url, headers=headers, verify=False)
  11. #
  12. data = response.content.decode()
  13. print(data)

我还以为是我没有成功,因为报错的缘故,但去网上一查发现这是成功,要想去除报错,可以采用如下方法
取消控制台输出的InsecureRequestWarning警告

图片.png

session 类 可以自动保存cookies

前面有介绍cookiejar会自动保存cookies,你会发现前面调用包urllib
其实前面说的清楚,两个库是一个性质,功能上都差不多,只不过这个更加简洁,我们继续望下去看

  1. import requests
  2. # 请求数据url
  3. member_url = 'https://www.yaozh.com/member/'
  4. headers = {
  5. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
  6. }
  7. # session 类 可以自动保存cookies === cookiesJar
  8. session = requests.session()
  9. # 1.代码登录
  10. login_url = 'https://www.yaozh.com/login'
  11. login_form_data = {
  12. 'username':'xiaomaoera12',
  13. 'pwd': 'lina081012',
  14. 'formhash': '54AC1EE419',
  15. 'backurl': 'https%3A%2F%2Fwww.yaozh.com%2F',
  16. }
  17. login_response = session.post(login_url,data=login_form_data,headers=headers)
  18. print(login_response.content.decode())
  19. # 2.登录成功之后 带着 有效的cookies 访问 请求目标数据
  20. data = session.get(member_url,headers=headers).content.decode()
  21. print(data)

核心总结

  1. 1.verify参数—第三方证书
  2. response = requests.get(url=url, headers=headers, verify=False)
  3. verify=False忽略第三方证书
  4. 2.session自动保存cookies
  5. session = requests.session()