学习使用 Urllib2库

urllib2是python2.7自带的模块(不需要下载),它支持多种网络协议,比如 FTP、HTTP、HTTPS等

urllib2在python3.x中被改为urllib.request

学习目的

利用urllib2提供了一个接口 urlopen函数

urllib2 官方文档

https://docs.python.org/2/library/urllib2.html

urlopen

  1. urlopen(url, data, timeout,....)

(1)第一个参数url即为URL,第一个参数URL是必须要传送的

(2)第二个参数data是访问URL时要传送的数据,data默认为空None

(3)第三个timeout是设置超时时间,timeout默认为 60s(socket._GLOBAL_DEFAULT_TIMEOUT)

GET请求方式

以传智播客官方网站 http://www.itcast.cn

  1. import urllib2
  2. response = urllib2.urlopen('http://www.itcast.cn/')
  3. data = response.read()
  4. print data
  5. print response.code

保存成 demo.py,进入该文件的目录,执行如下命令查看运行结果,感受一下。

  1. python demo.py

Urllib2库的基本使用 - 图1

如果我想添加 Header信息怎么办? 利用 urllib2.Request类

利用urllib2.Request方法,可以用来构造一个Http请求消息

help(urllib2.Request)

Urllib2库的基本使用 - 图2

正则:headers 转dict

  1. ^(.*):\s(.*)$
  2. "\1":"\2",
  1. # -*- coding: utf-8 -*-
  2. import urllib2
  3. get_headers={
  4. 'Host': 'www.itcast.cn',
  5. 'Connection': 'keep-alive',
  6. 'Pragma': 'no-cache',
  7. 'Cache-Control': 'no-cache',
  8. 'Upgrade-Insecure-Requests': '1',
  9. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
  10. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  11. #此处是压缩算法;不便于查看,要做解压
  12. #'Accept-Encoding': 'gzip, deflate, sdch',
  13. 'Accept-Language': 'zh-CN,zh;q=0.8',
  14. 'Cookie': 'pgv_pvi=7044633600; tencentSig=6792114176; IESESSION=alive; pgv_si=s3489918976; CNZZDATA4617777=cnzz_eid%3D768417915-1468987955-%26ntime%3D1470191347; _qdda=3-1.1; _qddab=3-dyl6uh.ireawgo0; _qddamta_800068868=3-0'
  15. }
  16. request = urllib2.Request("http://www.itcast.cn/",headers=get_headers)
  17. #request.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')
  18. response = urllib2.urlopen(request)
  19. print response.code
  20. data = response.read()
  21. print data

提问:为什么这两种写法都对?

一个headers没写,另一个写了都好使;原因是web服务器能够理解请求数据,并且没有做验证机制


POST请求方式

抓取拉钩招聘信息

http://www.lagou.com/jobs/list_?px=new&city=%E5%85%A8%E5%9B%BD#order

  1. # -*- coding: utf-8 -*-
  2. import urllib2
  3. import urllib
  4. proxy_handler = urllib2.ProxyHandler({"http" : 'http://192.168.17.1:8888'})
  5. opener = urllib2.build_opener(proxy_handler)
  6. urllib2.install_opener(opener)
  7. Sum = 1
  8. output = open('lagou.json', 'w')
  9. for page in range(1,Sum+1):
  10. formdata = 'first=false&pn='+str(page)+'&kd='
  11. print '运行到第 (%2d) 页面' %(page)
  12. send_headers={
  13. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
  14. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  15. 'Accept': 'application/json, text/javascript, */*; q=0.01',
  16. ' X-Requested-With': 'XMLHttpRequest'
  17. }
  18. request =urllib2.Request('http://www.lagou.com/jobs/positionAjax.json?px=new&needAddtionalResult=false',headers=send_headers)
  19. #request.add_header('X-Requested-With','XMLHttpRequest')
  20. #request.headers=send_headers
  21. request.add_data(formdata)
  22. print request.get_data()
  23. response = urllib2.urlopen(request)
  24. print response.code
  25. resHtml =response.read()
  26. #print resHtml
  27. output.write(resHtml+'\n')
  28. output.close()
  29. print '-'*4 + 'end'+'-'*4

Urllib2库的基本使用 - 图3

提出一个问题,

  • 如果要采集的是 拉钩招聘网站 北京>>朝阳区>>望京以这个网站为例,该如何理解这个url

http://www.lagou.com/jobs/list_?px=default&city=%E5%8C%97%E4%BA%AC&district=%E6%9C%9D%E9%98%B3%E5%8C%BA&bizArea=%E6%9C%9B%E4%BA%AC#filterBox

urlencode编码/解码在线工具

  1. # -*- coding: utf-8 -*-
  2. import urllib2
  3. import urllib
  4. query = {
  5. 'city':'北京',
  6. 'district':'朝阳区',
  7. 'bizArea':'望京'
  8. }
  9. print urllib.urlencode(query)
  10. page =3
  11. values = {
  12. 'first':'false',
  13. 'pn':str(page),
  14. 'kd':'后端开发',
  15. }
  16. formdata = urllib.urlencode(values)
  17. print formdata

小结

Content-Length: 是指报头Header以外的内容长度,指 表单数据长度

X-Requested-With: XMLHttpRequest :表示Ajax异步请求

Content-Type: application/x-www-form-urlencoded

表示:提交的表单数据 会按照name/value 值对 形式进行编码

例如:

  1. name1=value1&name2=value2...

name 和 value 都进行了 URL 编码(utf-8、gb2312)

在线测试字符串长度