目录

正文

1. Python3 使用urllib库请求网络

1.1 基于urllib库的GET请求

请求百度首页www.baidu.com ,不添加请求头信息:

  1. 1 import urllib.requests
  2. 2
  3. 3
  4. 4 def get_page():
  5. 5   url = 'http://www.baidu.com/'
  6. 6   res = urllib.request.urlopen(url=url)
  7. 7   page_source = res.read().decode('utf-8')
  8. 8   print(page_source)
  9. 9
  10. 10
  11. 11 if __name__ == '__main__':
  12. 12   get_page()

输出显示百度首页的源码。但是有的网站进行了反爬虫设置,上述代码可能会返回一个40X之类的响应码,因为该网站识别出了是爬虫在访问网站,这时需要伪装一下爬虫,让爬虫模拟用户行为,给爬虫设置headers(User-Agent)属性,模拟浏览器请求网站。

1.2 使用User-Agent伪装后请求网站

由于urllib.request.urlopen() 函数不接受headers参数,所以需要构建一个urllib.request.Request对象来实现请求头的设置:

  1. 1 import urllib.request
  2. 2
  3. 3
  4. 4 def get_page():
  5. 5   url = 'http://www.baidu.com'
  6. 6   headers = {
  7. 7     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  8. 8   }
  9. 9   request = urllib.request.Request(url=url, headers=headers)
  10. 10   res = urllib.request.urlopen(request)
  11. 11   page_source = res.read().decode('utf-8')
  12. 12   print(page_source)
  13. 13
  14. 14
  15. 15 if __name__ == '__main__':
  16. 16   get_page()

添加headers参数,来模拟浏览器的行为。

1.3 基于urllib库的POST请求,并用Cookie保持会话

登陆ChinaUnix论坛,获取首页源码,然后访问一个文章。首先不使用Cookie看一下什么效果:

  1. 1 import urllib.request
  2. 2 import urllib.parse
  3. 3
  4. 4
  5. 5 def get_page():
  6. 6   url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
  7. 7   headers = {
  8. 8     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  9. 9   }
  10. 10   data = {
  11. 11     'username': 'StrivePy',
  12. 12     'password': 'XXX'
  13. 13   }
  14. 14   postdata = urllib.parse.urlencode(data).encode('utf-8')
  15. 15   req = urllib.request.Request(url=url, data=postdata, headers=headers)
  16. 16   res = urllib.request.urlopen(req)
  17. 17   page_source = res.read().decode('gbk')
  18. 18   print(page_source)
  19. 19
  20. 20   url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  21. 21   res1 = urllib.request.urlopen(url=url1)
  22. 22   page_source1 = res1.read().decode('gbk')
  23. 23   print(page_source1)
  24. 24
  25. 25
  26. 26 if __name__ == '__main__':
  27. 27   get_page()

搜索源码中是否能看见用户名StrivePy,发现登陆成功,但是再请求其它文章时,显示为游客状态,会话状态没有保持。现在使用Cookie看一下效果:

  1. 1 import urllib.request
  2. 2 import urllib.parse
  3. 3 import http.cookiejar
  4. 4
  5. 5
  6. 6 def get_page():
  7. 7   url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
  8. 8   headers = {
  9. 9     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  10. 10   }
  11. 11   data = {
  12. 12     'username': 'StrivePy',
  13. 13     'password': 'XXX'
  14. 14   }
  15. 15   postdata = urllib.parse.urlencode(data).encode('utf-8')
  16. 16   req = urllib.request.Request(url=url, data=postdata, headers=headers)
  17. 17   # 创建CookieJar对象
  18. 18   cjar = http.cookiejar.CookieJar()
  19. 19   # 以CookieJar对象为参数创建Cookie
  20. 20   cookie = urllib.request.HTTPCookieProcessor(cjar)
  21. 21   # 以Cookie对象为参数创建Opener对象
  22. 22   opener = urllib.request.build_opener(cookie)
  23. 23   # 将Opener安装位全局,覆盖urlopen函数,也可以临时使用opener.open()函数
  24. 24   urllib.request.install_opener(opener)
  25. 25   res = urllib.request.urlopen(req)
  26. 26   page_source = res.read().decode('gbk')
  27. 27   print(page_source)
  28. 28
  29. 29   url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  30. 30   res1 = urllib.request.urlopen(url=url1)
  31. 31   page_source1 = res1.read().decode('gbk')
  32. 32   print(page_source1)
  33. 33
  34. 34
  35. 35 if __name__ == '__main__':
  36. 36   get_page()

结果显示登陆成功后,再访问其它文章时,显示为登陆状态。若要将Cookie保存为文件待下次使用,可以使用MozillaCookieJar对象将Cookie保存为文件。

  1. 1 import urllib.request
  2. 2 import urllib.parse
  3. 3 import http.cookiejar
  4. 4
  5. 5
  6. 6 def get_page():
  7. 7 url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
  8. 8 headers = {
  9. 9 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  10. 10 }
  11. 11 data = {
  12. 12 'username': 'StrivePy',
  13. 13 'password': 'XXX'
  14. 14 }
  15. 15 postdata = urllib.parse.urlencode(data).encode('utf-8')
  16. 16 req = urllib.request.Request(url=url, data=postdata, headers=headers)
  17. 17 filename = 'cookies.txt'
  18. 18 # 创建CookieJar对象
  19. 19 cjar = http.cookiejar.MozillaCookieJar(filename)
  20. 20 # 以CookieJar对象为参数创建Cookie
  21. 21 cookie = urllib.request.HTTPCookieProcessor(cjar)
  22. 22 # 以Cookie对象为参数创建Opener对象
  23. 23 opener = urllib.request.build_opener(cookie)
  24. 24 # 临时使用opener来请求
  25. 25 opener.open(req)
  26. 26 # 将cookie保存为文件
  27. 27 cjar.save(ignore_discard=True, ignore_expires=True)

会在当前工作目录生成一个名为cookies.txtcookie文件,下次就可以不用登陆(如果cookie没有失效的话)直接读取这个文件来实现免登录访问。例如不进行登陆直接访问其中一篇文章(没登陆也可以访问,主要是看抬头是不是登陆状态):

  1. 1 import http.cookiejar
  2. 2
  3. 3
  4. 4 def get_page():
  5. 5 url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  6. 6 filename = 'cookies.txt'
  7. 7 cjar = http.cookiejar.MozillaCookieJar(filename)
  8. 8 cjar.load(ignore_discard=True, ignore_expires=True)
  9. 9 cookie = urllib.request.HTTPCookieProcessor(cjar)
  10. 10 opener = urllib.request.build_opener(cookie)
  11. 11 res1 = opener.open(url1)
  12. 12 page_source1 = res1.read().decode('gbk')
  13. 13 print(page_source1)
  14. 14
  15. 15
  16. 16 if __name__ == '__main__':
  17. 17 get_page()

结果显示是以登陆状态在查看这篇文章。

1.4 基于urllib库使用代理请求

使用代理可以有效规避爬虫被封。

  1. 1 import urllib.request
  2. 2
  3. 3
  4. 4 def proxy_test():
  5. 5 url = 'http://myip.kkcha.com/'
  6. 6 headers = {
  7. 7 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  8. 8 }
  9. 9 request = urllib.request.Request(url=url, headers=headers)
  10. 10 proxy = {
  11. 11 'http': '180.137.232.101:53281'
  12. 12 }
  13. 13 # 创建代理Handler对象
  14. 14 proxy_handler = urllib.request.ProxyHandler(proxy)
  15. 15 # 以Handler对象为参数创建Opener对象
  16. 16 opener = urllib.request.build_opener(proxy_handler)
  17. 17 # 将Opener安装为全局
  18. 18 urllib.request.install_opener(opener)
  19. 19 response = urllib.request.urlopen(request)
  20. 20 page_source = response.read().decode('utf-8')
  21. 21 print(page_source)
  22. 22
  23. 23
  24. 24 if __name__ == '__main__':
  25. 25 proxy_test()

抓取到的页面应该显示代理IP,不知道什么原因,有时候能正常显示,有时候跳转到有道词典广告页!!!问题有待更进一步研究。

2. Python3 使用requsets库访问网络

2.1 基于requests库的GET请求

GET方式请求http://httpbin.org测试网站。

  1. 1 import requests
  2. 2
  3. 3
  4. 4 def request_test():
  5. 5 url = 'http://httpbin.org/get'
  6. 6 response = requests.get(url)
  7. 7 print(type(response.text), response.text)
  8. 8 print(type(response.content), response.content)
  9. 9
  10. 10
  11. 11 if __name__ == '__main__':
  12. 12 request_test()

直接得到响应体。

  1. 1 <class 'str'> {"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"121.61.132.191","url":"http://httpbin.org/get"}
  2. 2
  3. 3 <class 'bytes'> b'{"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"121.61.132.191","url":"http://httpbin.org/get"}\n

GET方法中传递参数的三种方式:

  • 将字典形式的参数用urllib.parse.urlencode()函数编码成url参数:

    1. 1 import urllib.parse
    2. 2
    3. 3 if __name__ == '__main__':
    4. 4 base_url = 'http://httpbin.org/'
    5. 5 params = {
    6. 6 'key1': 'value1',
    7. 7 'key2': 'value2'
    8. 8 }
    9. 9 full_url = base_url + urllib.parse.urlencode(params)
    10. 10 print(full_url)
    1. 1 http://httpbin.org/key1=value1&key2=value2
  • 直接在urllib.request.get()函数中使用params参数:
    1. 1 import requests
    2. 2
    3. 3 if __name__ == '__main__':
    4. 4 payload = {
    5. 5 'key1': 'value1',
    6. 6 'key2': 'value2'
    7. 7 }
    8. 8 response = requests.get('http://httpbin.org/get', params=payload)
    9. 9 print(response.url)
    1. 1 http://httpbin.org/key1=value1&key2=value2
  • url直接包含参数:
    1. 1 http://httpbin.org/get?key2=value2&key1=value1

2.2 基于requests库的POST请求,并用session保持会话

登陆ChinaUnix论坛,获取首页源码,然后访问一个文章。首先不使用Session看一下什么效果:

  1. 1 import requests
  2. 3
  3. 4
  4. 5 def get_page():
  5. 6   url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
  6. 7   headers = {
  7. 8     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  8. 9   }
  9. 10   data = {
  10. 11     'username': 'StrivePy',
  11. 12     'password': 'XXX'
  12. 13   }
  13. 14   response = requests.post(url=url, data=data, headers=headers)
  14. 15   page_source = response.text
  15. 16   print(response.status_code)
  16. 17   print(page_source)
  17. 18
  18. 19   url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  19. 20   response1 = requests.get(url=url1, headers=headers)
  20. 21   page_source1 = response1.text
  21. 22   print(response1.status_code)
  22. 23   print(page_source1)
  23. 24
  24. 25
  25. 26 if __name__ == '__main__':
  26. 27   get_page()

结果显示访问其它文章时为游客模式。接下来用session来维持会话看一下效果:

  1. 1 import requests
  2. 2
  3. 3
  4. 4 def get_page():
  5. 5   url = 'http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LcN2z'
  6. 6   headers = {
  7. 7     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  8. 8   }
  9. 9   data = {
  10. 10     'username': 'StrivePy',
  11. 11     'password': 'XXX'
  12. 12   }
  13. 13   session = requests.session()
  14. 14   response = session.post(url=url, data=data, headers=headers)
  15. 15   page_source = response.text
  16. 16   print(response.status_code)
  17. 17   print(page_source)
  18. 18
  19. 19   url1 = 'http://bbs.chinaunix.net/thread-4263876-1-1.html'
  20. 20   response1 = session.get(url=url1, headers=headers)
  21. 21   page_source1 = response1.text
  22. 22   print(response1.status_code)
  23. 23   print(page_source1)
  24. 24
  25. 25
  26. 26 if __name__ == '__main__':
  27. 27   get_page()

结果显示访问其它文章时,显示为登陆状态,会话保持住了。使用session的效果类似于urllib库临时使用opener或者将opener安装为全局的效果。

2.3 基于requests库使用代理请求

在requests库中使用代理:

  1. 1 import requests
  2. 2
  3. 3
  4. 4 def proxy_test():
  5. 5 url = 'http://myip.kkcha.com/'
  6. 6 headers = {
  7. 7 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
  8. 8 }
  9. 9 proxy = {
  10. 10 'https': '61.135.217.7: 80'
  11. 11 }
  12. 12 response = requests.get(url=url, headers=headers, proxies=proxy)
  13. 13 print(response.text)
  14. 14
  15. 15
  16. 16 if __name__ == '__main__':
  17. 17 proxy_test()

这个请求到的代码显示IP还是本地的网络IP,代理没起作用,具体原因有待研究。

urllib和requests库的更多相关文章

  1. Python使用urllib,urllib3,requests库+beautifulsoup爬取网页

    Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...

  2. 从0开始学爬虫10之urllib和requests库与github/api的交互

    urllib库的使用 # coding=utf-8 import urllib2 import urllib # htpbin模拟的环境 URL_IP="http://10.11.0.215 ...

  3. urllib、requests库整理

  4. Python3 urllib库和requests库

    1. Python3 使用urllib库请求网络 1.1 基于urllib库的GET请求 请求百度首页www.baidu.com ,不添加请求头信息: import urllib.requests d ...

  5. requests库和urllib包对比

    python中有多种库可以用来处理http请求,比如python的原生库:urllib包.requests类库.urllib和urllib2是相互独立的模块,python3.0以上把urllib和ur ...

  6. 【Python爬虫】HTTP基础和urllib库、requests库的使用

    引言: 一个网络爬虫的编写主要可以分为三个部分: 1.获取网页 2.提取信息 3.分析信息 本文主要介绍第一部分,如何用Python内置的库urllib和第三方库requests库来完成网页的获取.阅 ...

  7. Requests库上传文件时UnicodeDecodeError: 'ascii' codec can't decode byte错误解析

    在使用Request上传文件的时候碰到如下错误提示: 2013-12-20 20:51:09,235 __main__ ERROR 'ascii' codec can't decode byte 0x ...

  8. 【Python爬虫实战--1】深入理解urllib;urllib2;requests

    摘自:http://1oscar.github.io/blog/2015/07/05/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3urllib;urllib2;reques ...

  9. python WEB接口自动化测试之requests库详解

    由于web接口自动化测试需要用到python的第三方库--requests库,运用requests库可以模拟发送http请求,再结合unittest测试框架,就能完成web接口自动化测试. 所以笔者今 ...

随机推荐

  1. 关于Android file.createNewFile() 失败的问题

    [关于Android file.createNewFile() 失败的问题] 需要注意的是:要先对设计的文件路径创建文件夹 , 然后在对文件进行创建. 参考:http://blog.csdn.net/ ...

  2. asp.net MVC 导出excle(转)

    转载网址: http://www.cnblogs.com/imr3/articles/2856109.html 还是放到自己这边比较保险. ExportExcel Code public FileRe ...

  3. oracle 简单输出语句与赋值

    输出: declare stuName varchar2(30); stuAge number; begin stuName:='jack'; stuAge:=30; dbms_output.put_ ...

  4. python--第六天总结

    执行系统命令  可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 co ...

  5. Django项目的创建与管理和pycharm与Github的秘密

    随笔 - 174  文章 - 21  评论 - 19 Django项目创建与管理   1.主题 这部分教程主要介绍如何通过Pycharm创建.管理.运行一个Django工程.对于Django模块的相关 ...

  6. 并查集和树的一些性质 hdu1325

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325 题意是每次输入一对数字n,m表示一条树边,并且n是m的父亲,直到n==0&&m= ...

  7. PAT1066(AVL树)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  8. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  9. MAP使用方法集合

    一.整理: 看到array,就要想到角标. 看到link,就要想到first,last. 看到hash,就要想到hashCode,equals. 看到tree,就要想到两个接口.Comparable, ...

  10. Lua面试题目

    1.Lua的特性 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里. 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提 ...