python-urllib模块,Requests模块初学

python-urllib模块,Requests模块初学

  • 1.urllib模块,Requests模块简介
  • 2.urllib模块,Requests模块方法简单应用
  • 3.项目实战

1.urllib模块,Requests模块简介

Urllib模块: 一个基于HTTP访问请求的Python内置模块库 。
包括以下子模块:1. urllib.request 请求模块2. urllib.error 异常处理模块3. urllib.parse url解析模块4. urllib.robotparser robots.txt 解析模块。
urlib.request 模块的主要作用是向互联网服务器发送请求,并获取网络服务器的反馈数据信息。


Requests 模块:一个基于 urllib 模块简单易用的第三方网络HTTP请求模块库。
Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。
它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 访问操作需求。

2.urllib模块,Requests模块方法简单应用

urllib模块

#1.定义一个地址
url="http://www.chinasofti.com/r/cms/www/default/css/jquery.fullpage.css"
resp=urllib.request.urlopen(url)#urlopen( ) 函数的作用是与指定的网络资源建立一个连接(主要通过网址,即 url,Uniform Resource Location)      
print(resp.geturl())        #获取请求url地址
print(resp.getcode())       #获取返回码(200正常)
print(resp.info())          # 获取网页返回信息

if resp.getcode()==200:     #如果获取成功
    with open("video-js.css",'w',encoding='utf-8') as fp:
        fp.write(resp.read().decode('utf-8'))  #我们使用 response.read( ) 函数可以轻松获取指定网页的源代码。(建议使用decode()函数设置字符集,防止中文乱码)
    pass

Requests模块

import requests         #引入requests模块

#定义url
#get请求
url='https://movie.douban.com/subject_search'
resp=requests.get(url,params={'search_text':'哪吒','cat':'1002'})  #以GET请求方式向服务器发送请求并获取服务器响应的数据集对象。
print(resp.status_code)  #获取服务器反馈的状态码使用 resposne对象的status_code属性即可输出。
print(resp.content.decode('utf-8')) #r.content 字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
resp.close()   #关闭请求

#post请求
url='https://httpbin.org/post'
resp=requests.post(url,data={'name':'alvin'}) #以POST请求带json请求参数并方式向服务器发送请求并获取服务器响应的数据集对象。
print(resp.status_code)
print(resp.text)  #获取服务器反馈的资源数据使用 resposne对象的text属性即可得到
print(resp.json())  #r.json() #Requests中内置的JSON解码器
resp.close()

3.项目实战:爬取百度图片

#批量采集百度图库图片数据
import time
import requests

import re
import urllib.request,urllib.response
import threading
import sys
from day17.demo04 import *
#实现多线程下载器
#定义下载器下载
class DownLoader(threading.Thread):
    def __init__(self,url,fileName):
        threading.Thread.__init__(self)
        self.__url=url
        self.__fileName=fileName
        pass
    #重写run方法
    def run(self):
        try:
        #获得资源文件名称和资源信息(封装在响应头)
            fileName,headers=urllib.request.urlretrieve(self.__url)
            print('正在下载:')
            urllib.request.urlretrieve(self.__url,self.__fileName,self.download)
            print('下载完成')
        except Exception as e:
            logger.error('下载文件失败')
            print(e)
        pass

    @staticmethod
    def download(bockNum,blockSize,contentLength):
        p=100*bockNum*blockSize/contentLength
        if p>100:
            p=100
        sys.stdout.write('下载进度{0}%'.format(p))
        sys.stdout.flush()
        pass
    pass


if __name__=='__main__':
    import uuid
    def decode_url(url):
        """
        对百度加密后的地址进行解码\n
        :param url:百度加密的url\n
        :return:解码后的url
        """
        table = {'w': "a", 'k': "b", 'v': "c", '1': "d", 'j': "e", 'u': "f", '2': "g", 'i': "h",
                 't': "i", '3': "j", 'h': "k", 's': "l", '4': "m", 'g': "n", '5': "o", 'r': "p",
                 'q': "q", '6': "r", 'f': "s", 'p': "t", '7': "u", 'e': "v", 'o': "w", '8': "1",
                 'd': "2", 'n': "3", '9': "4", 'c': "5", 'm': "6", '0': "7",
                 'b': "8", 'l': "9", 'a': "0", '_z2C$q': ":", "_z&e3B": ".", 'AzdH3F': "/"}
        url = re.sub(r'(?P_z2C\$q|_z\&e3B|AzdH3F+)', lambda matched: table.get(matched.group('value')), url)
        return re.sub(r'(?P[0-9a-w])', lambda matched: table.get(matched.group('value')), url)
    pn = 0
    gsm=1

    # 初始化url地址
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

    # 通过对比两个网址可以发现只有pn和gsm的值发生了改变。pn代表的是页数,rn代表每页显示的图片数量。gsm是pn 的 16位显示。
    while True:
        url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=" \
              "&fp=result&queryWord=%E5%8A%A8%E6%BC%AB%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=" \
              "utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%8A%A8%E6%BC%AB%E5%9B%BE%E7%89%87&s" \
              "=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=" \
              "1e&1565850898082=".format(pn,gsm)
        try:
            response=requests.get(url,headers=headers)
            #print(response)
            obj=response.json()
            #print(obj)

            for temp in obj['data']:
                if temp.get('middleURL'):
                    imgURL=temp['middleURL']
                    downloader=DownLoader(imgURL,str(uuid.uuid4())+'.jpg')
                    downloader.start()
                    pass
                pass
            time.sleep(10)
            pn+=30
            gsm+=2
        except Exception as e:
            logger.error('URL地址访问数据异常'+url)
            print(e)

        if pn==120:
            break
            pass

你可能感兴趣的:(python-urllib模块,Requests模块初学)