zoukankan      html  css  js  c++  java
  • urllib模块的使用

    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 = request.Request(url, headers=headers)
     9 page = 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 pageurlllib
  • 相关阅读:
    ExecuteScalar requires the command to have a transaction when the connection assigned to the command is in a pending
    如何从vss中分离程序
    String or binary data would be truncated
    the pop3 service failed to retrieve authentication type and cannot continue
    The POP3 service failed to start because
    IIS Error he system cannot find the file specified _找不到页面
    pku2575Jolly Jumpers
    pku2940Wine Trading in Gergovia
    pku3219二项式系数
    pku1029false coin
  • 原文地址:https://www.cnblogs.com/zqpeng/p/8100234.html
Copyright © 2011-2022 走看看