这篇文章主要介绍了python爬虫基础之urllib的使用,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下

一、urllib 和 urllib2的关系

在python2中,主要使用urllib和urllib2,而python3对urllib和urllib2进行了重构,拆分成了urllib.request, urllib.parse, urllib.error,urllib.robotparser等几个子模块,这样的架构从逻辑和结构上说更加合理。urllib库无需安装,python3自带。python 3.x中将urllib库和urilib2库合并成了urllib库。

urllib2.urlopen() 变成了 urllib.request.urlopen()
    urllib2.Request() 变成了 urllib.request.Request()
    python2中的 cookielib 改为 http.cookiejar.
    import http.cookiejar 代替  import cookielib
    urljoin 现在对应的函数是 urllib.parse.urljoin

二、python3下的urllib库

  • request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。

  • error ,即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。

  • parse ,是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。

  • robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。

三、request的基础类

(一)request.urlopen

urlopen方法最主要的参数就是目标网站的url地址,可以使str类型,也可以是一个request对象。

get方法请求如下:

from urllib import request,parse

respones = request.urlopen(http://www.baidu.com/)

post方法请求,需要添加data参数(字典格式),它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 方法可以进行转化,另外如果传递了这个 data 参数,不添加data参数就默认为 GET 方式请求。

from urllib import request,parse

url = "http://www.baidu.com/"

wd = {'wd':'哇哈哈哈'}

data = bytes(parse.urlencode(wd),'utf-8')

respones = request.urlopen(url,data=data)

(二)request.Request

由于单独使用urlopen() 方法的不能添加User-Agent、Cookie等headers信息,需要构建一个 Request 类型的对象,通过构造这个这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。主要参数有:

  • url 参数是请求 URL,这个是必传参数,其他的都是可选参数。

  • data 参数如果要传必须传 bytes(字节流)类型的,如果是一个字典,可以先用 urllib.parse 模块里的 urlencode() 编码。

  • headers 参数是一个字典,这个就是 Request Headers 了,你可以在构造 Request 时通过 headers 参数直接构造,也可以通过调用 Request 实例的 add_header() 方法来添加, Request Headers 最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib,我们可以通过修改它来伪装浏览器。

  • origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。

  • unverifiable 参数指的是这个请求是否是无法验证的,默认是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个 HTML 文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True。

  • method 参数是一个字符串,它用来指示请求使用的方法,比如GET,POST,PUT等等。

通过随机的方法,选择user-agent:

import randomUA_LIST = [

'Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)',

'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',

'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)',

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; Acoo Browser; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Avant Browser)',

'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)',

'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)',

'Mozilla/4.0 (compatible; Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729); Windows NT 5.1; Trident/4.0)',

'Mozilla/4.0 (compatible; Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; Acoo Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727); Windows NT 5.1; Trident/4.0; Maxthon; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.2)',

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)'

]

#随机获取一个user-agent

user_agent = random.choice(UA_LIST)

添加headers头部信息的方法1:

url='http://www.baidu.com/'user_agent = random.choice(UA_LIST)

headers = {

'User-Agent': user_agent

}

req = request.Request(url=url,headers=headers)

respones = request.urlopen(req)

添加headers头部信息的方法2:

url='http://www.baidu.com'

headers = {

'User-Agent': user_agent

}

#添加user-agent的方法2

req = request.Request(url)

#请求添加user-agent

req.add_header("User-Agent",user_agent)

#获取请求的user-agent agent的a要小写

print(req.get_header("User-agent"))

response = request.urlopen(req)print(respones.read().decode('utf-8'))

三、request的高级类

在urllib.request模块里的BaseHandler类,他是所有其他Handler的父类,他是一个处理器,比如用它来处理登录验证,处理cookies,代理设置,重定向等。它提供了直接使用和派生类使用的方法:

  • add_parent(director):添加director作为父类

  • close():关闭它的父类

  • parent():打开使用不同的协议或处理错误

  • defautl_open(req):捕获所有的URL及子类,在协议打开之前调用

Handler的子类包括:

HTTPDefaultErrorHandler:用来处理http响应错误,错误会抛出HTTPError类的异常
HTTPRedirectHandler:用于处理重定向
HTTPCookieProcessor:用于处理cookies
ProxyHandler:用于设置代理,默认代理为空
HTTPPasswordMgr:永远管理密码,它维护用户名和密码表
HTTPBasicAuthHandler:用户管理认证,如果一个链接打开时需要认证,可以使用它来实现验证功能

(一)ProxyHandler

如果爬虫需要大量爬取网站数据,为了避免被封号,需要使用代理,通过request.build_opener()方法生成一个opener对象,添加代理的方法如下:

from urllib import request

#代理开关,表示是否开启代理

proxyswitch =True

#构建一个handler处理器对象,参数是一个字典类型,包括代理类型和代理服务器IP+PORT

proxyhandler = request.ProxyHandler({"http":"191.96.42.80:3128"})

#如果是带用户名和密码的代理,格式为{"http":"username:passwd@191.96.42.80:3128"}

#不加代理的handler处理器对象

nullproxyhandler = request.ProxyHandler()

if proxyswitch:

opener = request.build_opener(proxyhandler)

else:

opener = request.build_opener(nullproxyhandler)

req = request.Request("http://www.baidu.com/")

response = opener.open(req)

print(response.read().decode("utf-8"))

(二)ProxyBasicAuthHandler

通过密码管理器的方法实现代理服务器功能

from urllib import request

#代理密码管理,也可以管理服务器账户密码

#账户密码

user = "username"

passwd = "passwd"

#代理服务器

proxyserver = "1.1.1.1:9999"

#构建密码管理对象,保存需要处理的用户名和密码

passmgr = request.HTTPPasswordMgrWithDefaultRealm()

#添加账户信息,第一个参数realm是与远程服务器相关的域信息

passmgr.add_password(None,proxyserver,user,passwd)

#构建基础ProxyBasicAuthHandler处理器对象

proxyauth_handler = request.ProxyBasicAuthHandler(passmgr)

opener = request.build_opener(proxyauth_handler)

req = request.Request("http://www.baidu.com/")

response = opener.open(req)

(三)ProxyBasicAuthHandler

通过密码管理器的方法实现web认证登陆功能

#web验证

from urllib import request

test = "test"

passwd = "123456"

webserver = "1.1.1.1"

#构建密码管理器handler

passwdmgr = request.HTTPPasswordMgrWithDefaultRealm()

#添加密码信息

passwdmgr.add_password(None,webserver,test,passwd)

#HTTP基础验证处理器类

http_authhandler = request.HTTPBasicAuthHandler(passwdmgr)

opener = request.build_opener(http_authhandler)

req = request.Request("http://"+webserver)

response = opener.open(req)

四、Cookie处理

通过http.cookiejar中的HTTPCookieProcessor构建cookie处理器对象,处理cookie信息

import http.cookiejar

from urllib import request,parse

#模拟登陆先post账户密码

#然后保存生成的cookie

#通过CookieJar类构件一个coociejar对象,从来保存cookie值

cookie = http.cookiejar.CookieJar()

#构件cookie处理器对象,用来处理cookie

cookie_handler = request.HTTPCookieProcessor(cookie)

#构件一个自定义的opener

opener = request.build_opener(cookie_handler)

#通过自定义的opener的addheaders参数,可以添加HTTP报头参数

opener.addheaders = [("User-Agent","Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)"),]

#需要登陆的接口

url = 'http://www.renren.com/PLogin.do'

#需要登陆的账户密码

data = {

"email":"renren账号",

"password":"密码"

}

#数据处理

data = bytes(parse.urlencode(data),'utf-8')

#第一次是POST请求,通过登陆账户密码,得到cookie

req = request.Request(url,data=data)

#发送第一次POST请求,生成登陆后的cookie

response = opener.open(req)

print(response.read().decode("utf-8"))

#此时的opener已经包含了该链接下的cookie,此时使用该opener就可以直接访问该站点下其他的网页而不需要再登陆了

opener.open(http://www.renren.com/PLogin.doxxxxxxxxxxxxx)

以上就是python爬虫基础之urllib的使用的详细内容

  1. 欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

    万水千山总是情,点个【在看】行不行

  2. *声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事

python 使用socks 爬虫_python爬虫基础之urllib的使用相关推荐

  1. 菜鸟python爬虫_Python爬虫学习-基础爬取

    编译环境:python v3.5.0, mac osx 10.11.4 第三方库:针对网页解析,python有丰富的第三方库如: BeautifulSoup, urllib, requests etc ...

  2. hadoop 爬虫_python爬虫知识点梳理:带你全面入门python爬虫

    今天主要跟大家谈谈爬虫,尤其是刚入门的伙伴,少走弯路!文末附全套的视频版Python学习教程,含爬虫教程!希望大家能够把文字部分看完!做一个梳理! 在学习爬虫之前我们需要明白的一个问题: 爬虫能做什么 ...

  3. 快速学python爬虫_Python爬虫丨应当如何快速高效学习

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:小小科 ( 想要学习Python?Python学习交流 ...

  4. python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)

    本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...

  5. origin和python有什么不同_python爬虫之git的使用(origin说明)

    1.首先我们回忆两个命令 #git remote add origin 远程仓库链接 #git push -u origin master 我们一起看看这个命令,git是git的一级命令,push就是 ...

  6. python大作业爬虫_Python爬虫学习-爬取大规模数据(10w级)

    编译环境:python v3.5.0, mac osx 10.11.4 python爬虫基础知识: Python爬虫学习-基础爬取 了解数据库 MongoDB 数据库是储存数据的地方,可以将如下的字典 ...

  7. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  8. python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫

    什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...

  9. python二手交易平台代码_PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)...

    说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...

最新文章

  1. Science论文:诺奖经济学家的经典决策模型,被AI挑战
  2. 自定义Docker容器的 hostname
  3. 1104冒泡排序语法树
  4. 数据中心节能环保政策汇总分析:2022年新建大型数据中心PUE需达到1.4以下
  5. 应届生程序员,业务和技术孰轻孰重,如何找到适合自己的方向
  6. SpringCloud 配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类
  7. spring boot 使用视图modelandview
  8. payara 创建 集群_在Payara Server和GlassFish中配置密码
  9. zabbix服务器与客户端(Linux+Windows)的搭建
  10. silverlight经典案例
  11. python 信号量 semaphore
  12. 北京大学计算机学院周磊,马秀莉-北京大学信息科学技术学院
  13. 【语音编辑】基于matlab语音编辑【含Matlab源码 539期】
  14. 李炎恢php学习视频教程下载
  15. 高等数学在计算机中的应用论文1500字,高等数学论文1500字_大一高等数学论文3000字_高等数学论文三千...
  16. 泛微云桥任意文件读取漏洞[尽快升级]
  17. 两条平滑曲线相乘_圆锥曲线中两条相交直线的斜率之积为定值,这点你可能不会用...
  18. smartbi服务器缓存文件,Smartbi Config页面介绍 - Smartbi V9 帮助文档
  19. 《简明python教程》笔记一
  20. css3图片倾斜3D效果

热门文章

  1. 潜在狄利克雷分配(LDA,Latent Dirichlet Allocation)模型(一)
  2. 流数据机器学习平台SAMOA简介
  3. R语言普通最小二乘回归分析
  4. mysql删除数据库恢复_详解MySQL数据库恢复误删除数据
  5. 计算机教案计算机的组成,计算机的组成 教案
  6. ubuntu下 pip3 install 出现 urllib3.exceptions.ReadTimeoutError:的解决办法
  7. MFC libraries are required for this project. Install them from the Visual Studio installer (Individu
  8. 视频目标检测跟踪--Detect to Track and Track to Detect
  9. GO语言教程4:defer(延迟语句)详解
  10. LeetCode 300. Longest Increasing Subsequence--O(n log n)--Java,C++,Python解法