• urllib库的使用


    目录

    1、urllib的使用

    2、一个类型和六个方法

     2.1、一个类型

     2.2、六个方法

     2.3、下载图像、视频

    3、请求对象的定制

     3.1、编解码

      3.1.1、get请求方式

      3.1.2、Post请求方式

     3.2、ajax请求

      3.2.1、ajax的get请求

      3.2.2、ajax的post请求

     3.3、cookie登录

    4、使用代理

     4.1、handler代理

     4.2、handler代理IP地址修改

     4.3、代理池


    1、urllib的使用

     urllib.request.urlopen() 模拟浏览器向服务器发送请求:

     1)定义需要访问的url地址

     2)模拟浏览器向服务器发送请求

     3)获取响应的页面源码

    1. # 使用urllib获取百度首页源码
    2. import urllib.request
    3. # 1、定义一个url 需要访问的地址
    4. url = 'http://www.baidu.com'
    5. # 2、模拟浏览器向服务器发送请求 response就是响应
    6. response = urllib.request.urlopen(url)
    7. # 3、获取响应中的页面源码
    8. # read方法 返回的是字节形式的二进制数据 -> 需要转换为字符串
    9. # 解码:二进制->字符串 decode('编码的格式')
    10. content = response.read().decode('utf-8')
    11. # 4、打印数据
    12. print(content)

    2、一个类型和六个方法

     2.1、一个类型

      1)代码:

    1. # 使用urllib获取百度首页源码
    2. import urllib.request
    3. # 1、定义一个url 需要访问的地址
    4. url = 'http://www.baidu.com'
    5. # 2、模拟浏览器向服务器发送请求 response就是响应
    6. response = urllib.request.urlopen(url)
    7. # 一个类型和六个方法
    8. print(type(response))

      2)输出:

      3)response的数据类型是HttpResponse:

    • 字节‐‐>字符串 解码decode
    • 字符串‐‐>字节 编码encode

     2.2、六个方法

    1. read() 字节形式读取二进制 扩展:rede(5)返回前几个字节
    2.  readline() 只能 读取一行

    3. readlines() 一行一行读取 直至结束

    4. getcode() 获取状态码 (判断书写逻辑是否正确,返回200表示正常)

    5. geturl() 获取url地址

    6. getheaders() 获取header 

    1. # 使用urllib获取百度首页源码
    2. import urllib.request
    3. # 1、定义一个url 需要访问的地址
    4. url = 'http://www.baidu.com'
    5. # 2、模拟浏览器向服务器发送请求 response就是响应
    6. response = urllib.request.urlopen(url)
    7. # 按照一个字节一个字节的方式进行读取
    8. content = response.read()
    9. # 返回5个字节
    10. content = response.read(5)
    11. # 读取一行数据
    12. content = response.readline()
    13. # 按照一行一行的方式进行读取
    14. content = response.readlines()
    15. # 返回状态码 如果是200证明没有错
    16. print(response.getcode())
    17. # 返回url地址
    18. print(response.geturl())
    19. # 获取响应头等状态信息
    20. print(response.getheaders())

     2.3、下载图像、视频

    1. import urllib.request
    2. # 下载网页
    3. url_page = 'http://www.baidu.com'
    4. # url代表的是下载的路径 filename文件的名字
    5. urllib.request.urlretrieve(url_page, 'baidu.html')
    6. # 下载图片
    7. url_img = 'https://img0.baidu.com/it/u=1309359181,3567527426&fm=253&fmt=auto&app=138&f=JPEG?w=281&h=499'
    8. urllib.request.urlretrieve(url_img, 'lisa.jpg')
    9. # 下载视频
    10. url_video = 'https://vd3.bdstatic.com/mda-kjtx64epufgk8zw5/sc/cae_h264_nowatermark/1604104149/mda-kjtx64epufgk8zw5.mp4?v_from_s=hkapp-haokan-hnb&auth_key=1659543870-0-0-4dd2d6b9e96b8193a5e2ec3a86177452&bcevod_channel=searchbox_feed&pd=1&cd=0&pt=3&logid=3270589526&vid=6647036806223333961&abtest=103747_2-103890_2&klogid=3270589526'
    11. urllib.request.urlretrieve(url_video, 'lisa.mp4')

    3、请求对象的定制

    UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统 及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等

    UA反爬虫:在进行爬虫时候,程序模仿浏览器操作,但是反爬虫机制在响应爬虫请求时候需要进行UA识别,这时候就需要将UA参数传进我们的爬虫程序中

    1. import urllib.request
    2. url = 'https://www.baidu.com'
    3. # url的组成
    4. # https://www.baidu.com/s?wd=周杰伦
    5. # http/https www.baidu.com 80/443 s wd = 周杰伦 #
    6. # 协议 主机 端口号 路径 参数 锚点
    7. # http 80
    8. # https 443
    9. # mysql 3306
    10. # oracle 1521
    11. # redis 6379
    12. # mongodb 27017
    13. headers = {
    14. 'User-Agent': ''
    15. }
    16. # 因为urlopen方法中不能存储字典 所以headers不能传递进去
    17. # 请求对象的定制
    18. request = urllib.request.Request(url=url,headers=headers)
    19. response = urllib.request.urlopen(request)
    20. content = response.read().decode('utf8')
    21. print(content)

     3.1、编解码

      3.1.1、get请求方式

      1)urllib.parse.quote():quote方法能够将汉字转换成unicode编码的格式,适用于单个参数

    1. import urllib.request
    2. url = 'https://cn.bing.com/search?q='
    3. # 模拟浏览器访问——解决ua反爬
    4. headers = {
    5. 'User-Agent': ''
    6. }
    7. # 将周杰伦三个字变成unicode编码
    8. # 我们需要依赖于urllib.parse
    9. name = urllib.parse.quote('猪猪侠')
    10. url = url + name
    11. # 请求对象的定制
    12. request = urllib.request.Request(url=url, headers=headers)
    13. # 模拟浏览器向服务器发送消息
    14. response = urllib.request.urlopen(request)
    15. content = response.read().decode('utf8')
    16. # 打印数据
    17. print(content)

      2)urllib.parse.urlencode():urlencode方法也可以将汉字转换成unicode编码,适用于多个参数

    1. # urlencode的应用场景:多个参数的时候
    2. import urllib.request
    3. base_url = 'https://cn.bing.com/search?'
    4. data = {
    5. 'q': '周杰伦',
    6. 'sex': '男',
    7. 'location': '中国台湾省'
    8. }
    9. new_data = urllib.parse.urlencode(data)
    10. url = base_url + new_data
    11. headers = {
    12. 'User-Agent': ''
    13. }
    14. request = urllib.request.Request(url=url, headers=headers)
    15. response = urllib.request.urlopen(request)
    16. context = response.read().decode('utf-8')
    17. print(context)

      3.1.2、Post请求方式

     post请求方式与get请求方式区别

    1)get请求方式的参数必须编码:

            参数是拼接到url后面编码之后,不需要调用encode方法

                    url = base_url + new_data

                    new_data = urllib.parse.urlencode(data)

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

    2)post请求方式的参数必须编码:

            参数是放在请求对象定制的方法中,编码之后需要调用encode方法:

                    url = 'https://fanyi.baidu.com/sug'

                    data = urllib.parse.urlencode(data).encode('utf8')

                    request = urllib.request.Request(url=url, data=data, headers=headers)

             

    1. import urllib.request
    2. url = 'https://fanyi.baidu.com/sug'
    3. headers = {
    4. 'User-Agent': ''
    5. }
    6. data = {
    7. 'kw': 'spider'
    8. }
    9. # post请求方式的参数,必须要进行编码 data = urllib.parse.urlencode(data).encode('utf8') 编码之后必须调用encode方法
    10. # post请求方式的参数,不会拼接在url后,而是放在请求对象定制的参数中
    11. data = urllib.parse.urlencode(data).encode('utf8')
    12. # post参数放在请求对象定制的方法中
    13. request = urllib.request.Request(url=url, data=data, headers=headers)
    14. response = urllib.request.urlopen(request)
    15. context = response.read().decode('utf8')
    16. print(context)

     3.2、ajax请求

      3.2.1、ajax的get请求

      1)获取豆瓣电影第一页

    1. # get请求
    2. # 获取豆瓣电影的第一页数据 并且保存起来
    3. import urllib.request
    4. url = "https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action="
    5. headers = {
    6. 'User-Agent': ''
    7. }
    8. # 请求对象的定制
    9. request = urllib.request.Request(url=url, headers=headers)
    10. # 获取响应的数据
    11. response = urllib.request.urlopen(request)
    12. content = response.read().decode('utf8')
    13. # 数据下载到本地(open方法默认为gdk版本,如果需要保存汉字,需要设置编码为utf8)
    14. fp = open('douban.json', 'w', encoding='utf8')
    15. fp.write(content)

      2)获取豆瓣电影前十页

    1. # https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20
    2. # https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=100&limit=20
    3. import urllib.parse
    4. import urllib.request
    5. def create_request(page):
    6. base_url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action="
    7. data = {
    8. 'start': (page - 1) * 20,
    9. 'limit': '20'
    10. }
    11. data = urllib.parse.urlencode(data)
    12. url = base_url + data
    13. headers = {
    14. 'User-Agent': ''
    15. }
    16. request = urllib.request.Request(url=url, headers=headers)
    17. return request
    18. def get_content(request):
    19. reponse = urllib.request.urlopen(request)
    20. content = reponse.read().decode('utf8')
    21. return content
    22. def down_load(page, content):
    23. with open('douban' + str(page) + '.json', 'w', encoding='utf8') as fp:
    24. fp.write(content)
    25. if __name__ == '__main__':
    26. start_page = int(input('请输入起始的页码'))
    27. end_page = int(input('请输入结束的页码'))
    28. for page in range(start_page, end_page):
    29. # 请求对象定制
    30. request = create_request(page)
    31. # 获取响应的数据
    32. content = get_content(request)
    33. # 下载
    34. down_load(page, content)

      3.2.2、ajax的post请求

    1. import urllib.request
    2. import urllib.parse
    3. def create_request(page):
    4. base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
    5. data = {
    6. 'cname': '北京',
    7. 'pid': '',
    8. 'pageIndex': page,
    9. 'pageSize': '10'
    10. }
    11. data = urllib.parse.urlencode(data).encode('utf8')
    12. headers = {
    13. 'User-Agent': ''
    14. }
    15. request = urllib.request.Request(url=base_url, headers=headers, data=data)
    16. return request
    17. def get_content(request):
    18. reponse = urllib.request.urlopen(request)
    19. content = reponse.read().decode('utf8')
    20. return content
    21. def down_load(page, content):
    22. with open('kfc' + str(page) + '.json', 'w', encoding='utf8') as fp:
    23. fp.write(content)
    24. if __name__ == '__main__':
    25. start_page = int(input('请输入起始页码'))
    26. end_page = int(input('请输入结束页码'))
    27. for page in range(start_page, end_page + 1):
    28. # 请求对象的定制
    29. request = create_request(page)
    30. # 获取网页源码
    31. content = get_content(request)
    32. # 下载
    33. down_load(page, content)

     3.3、cookie登录

    cookie中携带者个人登录信息,如果有登录之后的cookie,那么我们可以携带者cookie进入到任何页面

    1. # 适用的场景:在数据采集的时候,需要绕过登录,直接采集数据
    2. # 个人信息页面是utf8,但是还是报编码错误,因为并没有进入个人信息页面,而是跳转到了登陆页面
    3. # 那么登录页面不是utf8,所以报错
    4. # 请求头信息不够,所以访问不成功
    5. import urllib.request
    6. url = 'https://weibo.com/u/3554714072'
    7. # 模拟浏览器访问——解决ua反爬
    8. headers = {
    9. # :authority: weibo.com
    10. # :method: GET
    11. # :path: /
    12. # :scheme: https
    13. 'accept': '',
    14. # 可能会导致编码错误
    15. # 'accept-encoding': '',
    16. 'accept-language': '',
    17. 'cache-control': '',
    18. 'client-version': '',
    19. 'cookie': '',
    20. # referer 判断当前路径是不是由上一个路径进来,一般情况下,做图片防盗链
    21. 'referer': '',
    22. 'sec-ch-ua': '',
    23. 'sec-ch-ua-mobile': '',
    24. 'sec-ch-ua-platform': '',
    25. 'sec-fetch-dest': '',
    26. 'sec-fetch-mode': '',
    27. 'sec-fetch-site': '',
    28. 'sec-fetch-user': '',
    29. 'upgrade-insecure-requests': '',
    30. 'user - agent': ''
    31. }
    32. # 因为urlopen方法中不能存储字典,所以headers不能传递进去
    33. # 请求对象的定制(因为参数顺序的问题,不能直接写url和headers)
    34. request = urllib.request.Request(url=url, headers=headers)
    35. response = urllib.request.urlopen(request)
    36. content = response.read().decode('utf8')
    37. with open('weibo.html', 'w', encoding='utf8') as fp:
    38. fp.write(content)

    4、使用代理

     4.1、handler代理

    1. import urllib.request
    2. url = 'http://www.baidu.com/'
    3. headers = {
    4. 'User-Agent': ''
    5. }
    6. request = urllib.request.Request(url=url, headers=headers)
    7. # 获取handler对象
    8. handler = urllib.request.HTTPHandler()
    9. # 获取opener对象
    10. build_opener = urllib.request.build_opener(handler)
    11. # 调用open方法
    12. response = build_opener.open(request)
    13. content = response.read().decode('utf8')
    14. print(content)

     4.2、handler代理IP地址修改

    1. import urllib.request
    2. url = 'http://www.baidu.com/s?wd=ip'
    3. headers = {
    4. 'Accept': '',
    5. 'Accept-Language': '',
    6. 'Cache-Control': '',
    7. 'Connection': '',
    8. 'Cookie': '',
    9. 'Host': '',
    10. 'sec-ch-ua': '',
    11. 'sec-ch-ua-mobile': '',
    12. 'sec-ch-ua-platform': '',
    13. 'Sec-Fetch-Dest': '',
    14. 'Sec-Fetch-Mode': '',
    15. 'Sec-Fetch-Site': '',
    16. 'Sec-Fetch-User': '',
    17. 'Upgrade-Insecure-Requests': '',
    18. 'User-Agent': ''
    19. }
    20. request = urllib.request.Request(url=url, headers=headers)
    21. # response = urllib.request.urlopen(request)
    22. proxise = {
    23. 'http': ''
    24. }
    25. handler = urllib.request.ProxyHandler(proxies=proxise)
    26. opener = urllib.request.build_opener(handler)
    27. response = opener.open(request)
    28. context = response.read().decode('utf8')
    29. with open('daili.html', 'w', encoding='utf8') as fp:
    30. fp.write(context)

     4.3、代理池

    1. import urllib.request
    2. url = 'http://www.baidu.com/s?wd=ip'
    3. headers = {
    4. 'Accept': '',
    5. 'Accept-Language': '',
    6. 'Cache-Control': '',
    7. 'Connection': '',
    8. 'Cookie': '',
    9. 'Host': '',
    10. 'sec-ch-ua': '',
    11. 'sec-ch-ua-mobile': '',
    12. 'sec-ch-ua-platform': '',
    13. 'Sec-Fetch-Dest': '',
    14. 'Sec-Fetch-Mode': '',
    15. 'Sec-Fetch-Site': '',
    16. 'Sec-Fetch-User': '',
    17. 'Upgrade-Insecure-Requests': '',
    18. 'User-Agent': ''
    19. }
    20. request = urllib.request.Request(url=url, headers=headers)
    21. # response = urllib.request.urlopen(request)
    22. proxise_pool = [
    23. {'http': ''},
    24. {'http': ''},
    25. ]
    26. import random
    27. proxies = random.choice(proxise_pool)
    28. handler = urllib.request.ProxyHandler(proxies=proxies)
    29. opener = urllib.request.build_opener(handler)
    30. response = opener.open(request)
    31. context = response.read().decode('utf8')
    32. with open('daili.html', 'w', encoding='utf8') as fp:
    33. fp.write(context)

  • 相关阅读:
    Java并发编程 | 从进程、线程到并发问题实例解决
    这是什么代码帮我看看
    c语言基础
    CH1-模型训练优化
    vantajs使用
    【2022 MS MARCO】【阿里】HLATR:基于混合列表感知Transformer重排的多阶段文本检索增强 ( .feat PRM:个性化的推荐重排)
    项目实战——配置git环境与项目创建
    java基础入门(一)
    vue3ref引用以及$nextTick()
    【Java】中的String、StringBuffer和StringBuilder的区别
  • 原文地址:https://blog.csdn.net/weixin_44302046/article/details/126150859