zoukankan      html  css  js  c++  java
  • Python3 urllib模块的使用(转载)

    转:http://www.cnblogs.com/Lands-ljk/p/5447127.html

    1.基本方法

    urllib.request.urlopen(urldata=None[timeout]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

    -         url:  需要打开的网址

    -         data:Post提交的数据

    -         timeout:设置网站的访问超时时间

    直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode()解码,转换成str类型。

    1 from urllib import request
    2 response = request.urlopen(r'http://python.org/') # <http.client.HTTPResponse object at 0x00000000048BC908> HTTPResponse类型
    3 page = response.read()
    4 page = page.decode('utf-8')

    urlopen返回对象提供方法:

    -         read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作

    -         info():返回HTTPMessage对象,表示远程服务器返回的头信息

    -         getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到

    -         geturl():返回请求的url

    2.使用Request

    urllib.request.Request(url, data=None, headers={}, method=None)

    使用request()来包装请求,再通过urlopen()获取页面。

    复制代码
     1 url = r'http://www.lagou.com/zhaopin/Python/?labelWords=label'
     2 headers = {
     3     'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
     4                   r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
     5     'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
     6     'Connection': 'keep-alive'
     7 }
     8 req = urllib.request.Request(url, headers=headers)
     9 page = urllib.request.urlopen(req).read()
    10 page = page.decode('utf-8')
    复制代码

    用来包装头部的数据:

    -         User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言

    -         Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的

    -         Connection:表示连接状态,记录Session的状态。

    3.Post数据

    urllib.request.urlopen(urldata=None[timeout]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

    urlopen()的data参数默认为None,当data参数不为空的时候,urlopen()提交方式为Post。

    复制代码
     1 from urllib import request, parse
     2 url = r'http://www.lagou.com/jobs/positionAjax.json?'
     3 headers = {
     4     'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
     5                   r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
     6     'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
     7     'Connection': 'keep-alive'
     8 }
     9 data = {
    10     'first': 'true',
    11     'pn': 1,
    12     'kd': 'Python'
    13 }
    14 data = parse.urlencode(data).encode('utf-8')
    15 req = request.Request(url, headers=headers, data=data)
    16 page = request.urlopen(req).read()
    17 page = page.decode('utf-8')
    复制代码

    urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)

    urlencode()主要作用就是将url附上要提交的数据。 

    复制代码
    1 data = {
    2     'first': 'true',
    3     'pn': 1,
    4     'kd': 'Python'
    5 }
    6 data = parse.urlencode(data).encode('utf-8')
    复制代码

    经过urlencode()转换后的data数据为?first=true?pn=1?kd=Python,最后提交的url为

    http://www.lagou.com/jobs/positionAjax.json?first=true?pn=1?kd=Python

    Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码

    1 page = request.urlopen(req, data=data).read()

    当然,也可以把data的数据封装在urlopen()参数中

    4.异常处理

    复制代码
     1 def get_page(url):
     2     headers = {
     3         'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
     4                     r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
     5         'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
     6         'Connection': 'keep-alive'
     7     }
     8     data = {
     9         'first': 'true',
    10         'pn': 1,
    11         'kd': 'Python'
    12     }
    13     data = parse.urlencode(data).encode('utf-8')
    14     req = request.Request(url, headers=headers)
    15     try:
    16         page = request.urlopen(req, data=data).read()
    17         page = page.decode('utf-8')
    18     except error.HTTPError as e:
    19         print(e.code())
    20         print(e.read().decode('utf-8'))
    21     return page
    复制代码

    5、使用代理 

    urllib.request.ProxyHandler(proxies=None)

    当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。

    复制代码
     1 data = {
     2         'first': 'true',
     3         'pn': 1,
     4         'kd': 'Python'
     5     }
     6 proxy = request.ProxyHandler({'http': '5.22.195.215:80'})  # 设置proxy
     7 opener = request.build_opener(proxy)  # 挂载opener
     8 request.install_opener(opener)  # 安装opener
     9 data = parse.urlencode(data).encode('utf-8')
    10 page = opener.open(url, data).read()
    11 page = page.decode('utf-8')
    12 return page
    复制代码
  • 相关阅读:
    Windows server 2016 解决“无法完成域加入,原因是试图加入的域的SID与本计算机的SID相同。”
    Windows Server 2016 辅助域控制器搭建
    Windows Server 2016 主域控制器搭建
    Net Framework 4.7.2 覆盖 Net Framework 4.5 解决办法
    SQL SERVER 2012更改默认的端口号为1772
    Windows下彻底卸载删除SQL Serever2012
    在Windows Server2016中安装SQL Server2016
    SQL Server 创建索引
    C#控制台或应用程序中两个多个Main()方法的设置
    Icon cache rebuilding with Delphi(Delphi 清除Windows 图标缓存源代码)
  • 原文地址:https://www.cnblogs.com/waylon/p/6800090.html
Copyright © 2011-2022 走看看