• 【Python爬虫】urllib库——尚硅谷


    1.urllib库的使用

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

    response 服务器返回的数据

     response的数据类型是HttpResponse

    字节-->字符串

            解码decode

    字符串-->字节

            编码encode

    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.获取响应中的页面源码 content内容的意思
    8. #read方法 返回的是字节式的二进制数据
    9. #我们要将二进制数据转换为字符串
    10. #二进制-->字符串 解码 decode('编码的格式')
    11. content=response.read().decode('utf-8') #这一步非常重要
    12. #4.打印数据
    13. print(content)

    read()        字节形式读取二进制 扩展:rede(5)返回前几个字节

    readline()  读取一行

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

    getcode()  获取状态吗

    geturl()      获取url

    getheaders() 获取headers

    urllib.request.urlretrieve()

    1. import urllib.request
    2. url='http://www.baidu.com'
    3. #模拟浏览器向服务器发送请求
    4. response=urllib.request.urlopen(url)
    5. #一个类型和六个方法
    6. # response 是HTTPResponse的类型
    7. print(type(response))
    8. #按照一个字节一个字节去读
    9. # content=response.read()
    10. # print(content)
    11. #返回多少个字节
    12. # content = response.read(5) #只读五个字节
    13. # print(content)
    14. # #只读取一行
    15. # content = response.readline()
    16. # print(content)
    17. # #读取多行
    18. # content = response.readlines()
    19. # print(content)
    20. # #获取状态码 如果是200了,那么就证明我们的逻辑没有错
    21. # print(response.getcode())
    22. #
    23. # #返回url地址
    24. # print(response.geturl())
    25. #
    26. # #获取是一个状态信息
    27. # print(response.getheaders())
    28. #一个类型 HTTTPResponse
    29. #六个方法 read readline readlines getcode geturl getheaders

    请求页面

    请求图片

    请求视频

    1. import urllib.request
    2. #下载网页
    3. url_page='http://www.baidu.com'
    4. # url代表的是下载的路径 filename文件的名字
    5. # 在python中 可以变量的名字,也可以直接写值
    6. # urllib.request.urlretrieve(url_page,'baidu.html')
    7. #下载图片
    8. # url_img='https://image.so.com/view?src=imageonebox&q=LISA&obx_type=360pic_new_strong&correct=LISA&ancestor=list&cmsid=9cc840c2046491a3c774ae2f7fa315f4&cmras=0&cn=0&gn=0&kn=50&crn=0&bxn=0&fsn=110&cuben=0&pornn=0&manun=50&adstar=0&clw=241#id=8bc223c645b45b276ae559e1ab81c72f&currsn=0&ps=129&pc=129'
    9. # urllib.request.urlretrieve(url=url_img, filename='lisa.png')
    10. #下载视频

    2.请求对象的定制

    爬虫是模拟浏览器向服务器发送请求的过程,定制对象是一种反爬虫的手段

    需要使用headers定制操作系统

    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. headers={
    15. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    16. }
    17. # 因为urlopen方法中不能存储字典,所以headers不能传递进去
    18. # 请求对象的定制
    19. # 注意 因为参数顺序的问题,不能直接写url 和 headers 中间还有data 所以我们需要关键词传参
    20. request=urllib.request.Request(url=url,headers=headers)
    21. response=urllib.request.urlopen(request)
    22. content=response.read().decode('utf8')
    23. print(content)
    24. # response = urllib.request.urlopen(url)
    25. #
    26. # content = response.read().decode('utf8')
    27. #
    28. # print(content)

    1.get请求的quote方法(把中文转换成unicode编码)

    1. #需求 获取https://www.baidu.com/s?wd=周杰伦的源码
    2. #https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
    3. import urllib.request
    4. import urllib.parse
    5. url='https://www.baidu.com/s?wd='
    6. #请求对象的定制是为了解决反爬的一种手段
    7. headers={
    8. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    9. }
    10. #要将周杰伦三个字变成unicode编码
    11. #我们需要依赖于urllib.parse
    12. name=urllib.parse.quote('周杰伦')
    13. print(name)
    14. url=url+name
    15. print(url)
    16. #请求对象的定制
    17. request=urllib.request.Request(url=url,headers=headers)
    18. #模拟浏览器向服务器发送请求
    19. response=urllib.request.urlopen(request)
    20. #获取响应内容
    21. content=response.read().decode('utf-8')
    22. #打印数据
    23. print(content)

    2.get请求的urlencode方法

    适用于多个参数的情况之下,直接定义为一个字典形式

    1. #urlencode应用场景:多个参数的时候
    2. #https://www.baidu.com/s?wd=周杰伦&sex=男、
    3. import urllib.parse
    4. import urllib.request
    5. #
    6. # data={
    7. # 'wd':'周杰伦',
    8. # 'sex':'男',
    9. # 'location':'中国台湾省'
    10. # }
    11. # a=urllib.parse.urlencode(data)
    12. # print(a)
    13. base_url='https://www.baidu.com/s?'
    14. data={
    15. 'wd':'周杰伦',
    16. 'sex':'男',
    17. 'location':'中国台湾省'
    18. }
    19. new_data=urllib.parse.urlencode(data)
    20. url=base_url+new_data
    21. headers={
    22. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    23. }
    24. #请求对象的定制
    25. request=urllib.request.Request(url=url,headers=headers)
    26. #模拟浏览器向服务器发送请求
    27. response=urllib.request.urlopen(request)
    28. #获取网页源码的数据
    29. content=response.read().decode('utf-8')
    30. #打印数据
    31. print(content)

    3.post请求百度翻译

    注意:post请求的参数 必须进行编码
    POST的请求参数是不会拼接在url后面的,而是需要放在请求对象定制的参数中
    
    1. #post请求
    2. import urllib.request
    3. import urllib.parse
    4. url='https://fanyi.baidu.com/sug'
    5. headers={
    6. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    7. }
    8. data={
    9. 'kw':'spider'
    10. }
    11. #post请求的参数 必须进行编码
    12. data=urllib.parse.urlencode(data).encode('utf-8')
    13. print(data)
    14. #POST的请求参数是不会拼接在url后面的,而是需要放在请求对象定制的参数中
    15. #post请求的参数,必须要进行编码
    16. request=urllib.request.Request(url=url,data=data,headers=headers)
    17. print(request)
    18. #模拟浏览器向服务器发送请求
    19. response=urllib.request.urlopen(request)
    20. #获取响应的数据
    21. print(response)
    22. #获取响应的数据
    23. content=response.read().decode('utf-8')
    24. print(content)
    25. #字符串转换成json对象
    26. import json
    27. obj=json.loads(content)
    28. print(obj)

    4.ajax的get请求豆瓣电影的第一页

    保存信息到文件之中一共有两种方式

    1.

    1. fp=open('douban.json','w',encoding='utf-8')
    2. fp.write(content)
    3. fp.close()

    2.

    1. with open('douban1.json','w',encoding='utf-8') as fp:
    2. fp.write(content)
    3. fp.close()

    1. #get请求
    2. #获取豆瓣电影的第一页的数据 并且保存起来
    3. import urllib.request
    4. url='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20'
    5. headers={
    6. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    7. }
    8. #1.请求对象定制
    9. request=urllib.request.Request(url=url,headers=headers)
    10. #2.获取响应的数据
    11. response=urllib.request.urlopen(request)
    12. content=response.read().decode('utf-8')
    13. print(content)
    14. #3.数据下载到本地
    15. #open方法默认情况使用的是gbk的编码 如果我们要想保存汉字 那么需要在open方法中指定编码格式utf-8
    16. # encoding='utf-8'
    17. # fp=open('douban.json','w',encoding='utf-8')
    18. # fp.write(content)
    19. # fp.close()
    20. # import json
    21. # obj=json.loads(content)
    22. # print(obj)
    23. with open('douban1.json','w',encoding='utf-8') as fp:
    24. fp.write(content)
    25. fp.close()

    5.Ajax的get请求豆瓣电影的前10页

    需要用到函数把其分段进行循环输出

    1. import urllib.request
    2. import urllib.parse
    3. #https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20
    4. #https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=20&limit=20
    5. #https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=40&limit=20
    6. #page 1 2 3 4
    7. #start 0 20 40 60
    8. #start (page-1)*20
    9. #下载豆瓣电影前10页的数据
    10. #1.请求对象的定制
    11. #2.获取响应的数据
    12. #3.下载数据
    13. def create_request(page):
    14. base_url='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&'
    15. data={
    16. 'start':(page-1)*20,
    17. 'limit':20
    18. }
    19. data=urllib.parse.urlencode(data)
    20. url=base_url+data
    21. print(url)
    22. headers = {
    23. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    24. }
    25. request=urllib.request.Request(url=url,headers=headers)
    26. return request
    27. def get_content(request):
    28. response=urllib.request.urlopen(request)
    29. content=response.read().decode('utf-8')
    30. return content
    31. def down_load(page,content):
    32. with open('douban_'+str(page)+'.json','w',encoding='utf-8') as fp:
    33. fp.write(content)
    34. #程序的入口
    35. if __name__ == '__main__':
    36. start_page=int(input('请输入起始页码'))
    37. end_page=int(input('请输入结束页码'))
    38. for page in range(start_page,end_page+1):
    39. # 每一页都有自己的请求对象的定制
    40. request=create_request(page)
    41. # 获取响应的数据
    42. content=get_content(request)
    43. # 下载
    44. down_load(page,content)

    6.ajax的post请求肯德基官网

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

    7.微博的cookie登录

    1. #适用场景:数据采集的时候,需要绕过登录,然后进入到某个页面
    2. import urllib.request
    3. url='https://weibo.com/u/5494282906'
    4. headers={
    5. # 'authority': 'weibo.com',
    6. # 'method': 'GET',
    7. # 'path': '/ajax/profile/info?uid=5494282906',
    8. # 'scheme': 'https',
    9. 'accept': 'application/json, text/plain, */*',
    10. # 'accept-encoding': 'gzip, deflate, br',
    11. 'accept-language': 'zh-CN,zh;q=0.9',
    12. 'client-version': '2.34.75',
    13. # cookie中携带着你的登录信息 如果有登陆之后的cookie 那么我们就可以携带者cookie进入到任何页面
    14. 'cookie': 'SINAGLOBAL=4321438772735.1265.1638876314958; UOR=,,www.huya.com; XSRF-TOKEN=0Y1gSmTH7wyvdhpyilfV_vlf; PC_TOKEN=10a79267b9; login_sid_t=356705c36e6e3ef551138a832110c242; cross_origin_proto=SSL; WBStorage=4d96c54e|undefined; _s_tentry=weibo.com; Apache=2620855400086.0684.1659428891597; ULV=1659428891603:5:1:1:2620855400086.0684.1659428891597:1658372773115; wb_view_log=1920*10801; SUB=_2A25P7JBkDeRhGeNK4lYT-CzFyzqIHXVsm4asrDV8PUNbmtANLVfxkW9NSS8zowa0jAsEWFtjMyrrJhhbJb1BXURy; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WhSQTOOaS3AEmM3FHDZyNqZ5JpX5KzhUgL.Fo-X1KBE1hz4ehq2dJLoIE-LxKnLBoqL1h-LxKMLB.2LBKMLxK.L1hML1K2LxKML12eLBoxu; ALF=1690964916; SSOLoginState=1659428917; WBPSESS=U2WFjk9l_oENTuN-ANFxmzGiwhSrHzYTavgzgmNaP5OU_qgTbyEYEFAvw7wHHNGa2WHU1KDVGkSTJwj61IcxVEYa22hAhm0IFE0Ig-zzZSCZhGbs0dG4VRbdhnYzcsjhdnx-e4jptHJ2HLHmIs7HIQ==',
    15. # referer 判断当前路径是不是由上一个路径进来的 一般情况下是做图片防盗链
    16. 'referer': 'https://weibo.com/u/5494282906',
    17. 'sec-fetch-dest': 'empty',
    18. 'sec-fetch-mode': 'cors',
    19. 'sec-fetch-site': 'same-origin',
    20. 'server-version': 'v2022.08.01.2',
    21. 'traceparent': '00-2841b7aa70142fce9b3da2c5022e1be5-4a79deee3f4f0e4e-00',
    22. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 QIHU 360SE',
    23. 'x-requested-with': 'XMLHttpRequest',
    24. 'x-xsrf-token': '0Y1gSmTH7wyvdhpyilfV_vlf',
    25. }
    26. #请求对象的定制
    27. request=urllib.request.Request(url=url,headers=headers)
    28. #模拟浏览器向服务器发送请求
    29. response=urllib.request.urlopen(request)
    30. #获取相应数据
    31. content=response.read().decode('utf-8')
    32. #将数据存储到本地
    33. fp=open('weibo.html','w',encoding='utf-8')
    34. fp.write(content)
    35. fp.close()

    8.handle处理器的基本使用

    1. #需求 需要handler来访问百度 获取网页源码
    2. import urllib.request
    3. url = 'https://baidu.com'
    4. headers = {
    5. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    6. }
    7. request=urllib.request.Request(url=url,headers=headers)
    8. #handler build_opener open
    9. # 1.获取hanlder对象
    10. handler=urllib.request.HTTPHandler()
    11. # 2.获取opener对象
    12. opener=urllib.request.build_opener(handler)
    13. # 3.调用Open方法
    14. response=opener.open(request)
    15. content=response.read().decode('utf-8')
    16. print(content)

    9.代理服务器

    1.代理的常用功能

    1.突破自身ip访问限制,访问国外站点

    2.访问一些单位或团体内部资源

    扩展:某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址免费代理服务器,就可以用于对教育网开房的各类FTP下载上传,以及各类资料查询共享等服务

    3.提高访问速度

    扩展:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区取出信息,传给用户,以提高访问速度

    4.隐藏真实ip

    扩展:上王者也可以通过这种方法隐藏自己的ip,以免遭受攻击

    2.代码配置代理

    创建Reuqest对象

    创建ProxyHandler对象

    handler对象创建opener对象

    使用opener.open函数发送请求

    1. import urllib.request
    2. url='http://www.baidu.com/s?wd=ip'
    3. headers = {
    4. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    5. }
    6. #请求对象定制
    7. request=urllib.request.Request(url=url,headers=headers)
    8. #模拟浏览器访问服务器
    9. #response=urllib.request.urlopen(request)
    10. proxies={
    11. 'http':'221.4.241.198:9091'
    12. }
    13. #handler build_opener open
    14. handler=urllib.request.ProxyHandler(proxies=proxies)
    15. opener=urllib.request.build_opener(handler)
    16. response=opener.open(request)
    17. #获得相应信息
    18. content=response.read().decode('utf-8')
    19. #保存
    20. fp=open('daili.html','w',encoding='utf-8')
    21. fp.write(content)
    22. fp.close()

  • 相关阅读:
    OpenCV入门9:图像增强和图像滤波
    数组排序,实现中间数字最大,向两边越来越小的排序
    做外贸站群效果怎么样?独立站站群是什么?
    【Java EE初阶二十五】简单的表白墙(一)
    食品饮料行业渠道商管理系统解决方案:实现渠道数字化营销布局
    a-入门Api
    JSON+<boost/property_tree/json_parser.hpp>+<boost/property_tree/ptree.hpp>
    Java IO:流简介说明
    PDBADMIN 的作用,命名,重建 以及能否DROP
    根目录挂载的/dev/mapper/centos-root分区扩容
  • 原文地址:https://blog.csdn.net/qq_48108092/article/details/126097408