当前位置: 首页 > news >正文

urllib库的常见用法

先导入三个包:

import urllib.request
import urllib.parse
import http.cookiejar
复制代码

最简单的urlopen()

url = "http://www.baidu.com"         
response = urllib.request.urlopen(url)
print(response.read())
复制代码

1. 构造headers

user_agent = ''
cookie = ''
referer = ''
host = ''
content_type = ''
复制代码

2. 构造Request实例对象

url = 'http://www.baidu.com'
values = {'name' : 'Michael Foord',
          'location' :'Northampton',
          'language' :'Python' }
headers={'User-Agent':user_agent,'Cookie':cookie,'Referer':referer,'Host':host,'Content-Type':content_type}
复制代码

3. HTTP高级方法

①使用Proxy代理

proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'})
opener = urllib.request.build_opener(proxy_handler)
复制代码

②使用cookiejar

cookie_jar = http.cookiejar.CookieJar()
cookie_jar_handler = urllib.request.HTTPCookieProcessor(cookiejar=cookie_jar)

opener.add_handler(cookie_jar_handler)
复制代码

③发送

# 1.安装全局opener,然后利用urlopen打开url   
urllib.request.install_opener(opener)                   
response = urllib.request.urlopen(url)

# 2.直接利用opener实例打开url:
response = opener.open(url)
复制代码

4. 抓取网页

data = urllib.parse.urlencode(values).encode('utf-8')  

req = urllib.request.Request(url,data,headers)
#或req.add_header('Referer', 'http://www.baidu.com')
#  req.add_header('Origin', 'https://passport.weibo.cn')
#  req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X)...')

response = urllib.request.urlopen(req,timeout=10)
the_page = response.read().decode('utf-8')
复制代码

或者这样:

data = urllib.parse.urlencode({"act": "login", "email": "xianhu@qq.com", "password": "123456"})
request1 = urllib.request.Request(url,data=data,headers)    # POST方法
request2 = urllib.request.Request(url+"?%s" % data)         # GET方法
复制代码



其他方法

#抓取网页中的图片:同样适用于抓取网络上的文件。右击鼠标,找到图片属性中的地址,然后进行保存。
response = urllib.request.urlopen("http://ww3.sinaimg.cn/large/7d742c99tw1ee.jpg",timeout=120)
with open("test.jpg", "wb") as file_img:
    file_img.write(response.read())
复制代码

# HTTP认证:即HTTP身份验证
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()     # 创建一个PasswordMgr
password_mgr.add_password(realm=None, uri=url, user='username', passwd='password')   # 添加用户名和密码
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)         # 创建HTTPBasicAuthHandler
opener = urllib.request.build_opener(handler)                       # 创建opner
response = opener.open(url, timeout=10)                             # 获取数据
复制代码

gzip压缩: 在header中加入:'request.add_header('Accept-encoding', 'gzip')' 这是关键:创建Request对象,添加一个 Accept-encoding 头信息告诉服务器你能接受 gzip 压缩数据

然后就是解压缩数据:

import StringIO
import gzip

compresseddata = f.read() 
compressedstream = StringIO.StringIO(compresseddata)
gzipper = gzip.GzipFile(fileobj=compressedstream) 
print gzipper.read()
复制代码

多线程爬取:

from threading import Thread
from Queue import Queue
from time import sleep
# q是任务队列
#NUM是并发线程总数
#JOBS是有多少任务
q = Queue()
NUM = 2
JOBS = 10
#具体的处理函数,负责处理单个任务
def do_somthing_using(arguments):
    print arguments
#这个是工作进程,负责不断从队列取数据并处理
def working():
    while True:
        arguments = q.get()
        do_somthing_using(arguments)
        sleep(1)
        q.task_done()
#fork NUM个线程等待队列
for i in range(NUM):
    t = Thread(target=working)
    t.setDaemon(True)
    t.start()
#把JOBS排入队列
for i in range(JOBS):
    q.put(i)
#等待所有JOBS完成
q.join()
复制代码

相关文章:

  • Hyper-V and “Sandy Bridge” processors from Intel
  • iOS 关于viewController自定义的转场动画
  • Python:使用matplotlib绘制图表
  • html~display的使用
  • linux shell单引号、双引号及无引号区别(考试题答案系列)
  • Apache Oozie Installation
  • 使用Windows兼容包简化向.NET Core的迁移
  • JavaSE应该了解的类库
  • iOS开发 基于原生JS与OC方法互相调用并传值(附HTML代码)
  • 在Vmware中安装archlinux(2008.3core)的流程与心得
  • Android进程间通信之Messenger
  • 小巧Linux发行版本,老机器也不愁
  • 北京云栖大会Tech Insight Workshop:《使用SOFA来快速构建金融级分布式交易系统》篇...
  • CentOS最小化安装(一)
  • hibernate学习笔记3
  • $translatePartialLoader加载失败及解决方式
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • idea + plantuml 画流程图
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • javascript数组去重/查找/插入/删除
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React Native移动开发实战-3-实现页面间的数据传递
  • Service Worker
  • spring学习第二天
  • Yii源码解读-服务定位器(Service Locator)
  • 程序员最讨厌的9句话,你可有补充?
  • 模型微调
  • 七牛云假注销小指南
  • 使用Swoole加速Laravel(正式环境中)
  • 事件委托的小应用
  • 为视图添加丝滑的水波纹
  • 自制字幕遮挡器
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • #if 1...#endif
  • #NOIP 2014# day.1 T2 联合权值
  • #Z0458. 树的中心2
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (翻译)terry crowley: 写给程序员
  • (附源码)计算机毕业设计大学生兼职系统
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (篇九)MySQL常用内置函数
  • (四)汇编语言——简单程序
  • (一)RocketMQ初步认识
  • (转)winform之ListView
  • (转)用.Net的File控件上传文件的解决方案
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .Net 6.0 处理跨域的方式
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net 垃圾回收机制原理(二)