• 01Urllib


    1.什么是互联网爬虫?

    在这里插入图片描述
    如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据

    解释1:通过一个程序,根据Url(http://www.taobao.com)进行爬取网页,获取有用信息
    解释2:使用程序模拟浏览器,去向服务器发送请求,获取响应信息

    2.爬虫核心

    1.爬取网页:爬取整个网页  包含了网页中所有得内容
    2.解析数据:将网页中你得到的数据 进行解析
    3.难点:爬虫和反爬虫之间的博弈

    3.爬虫的用途?

    • 数据分析/人工数据集
    • 社交软件冷启动
    • 舆情监控
    • 竞争对手监控
      在这里插入图片描述

    4.爬虫分类?

    4.1通用爬虫
    • 实例
       百度、360、google、sougou等搜索引擎‐‐‐伯乐在线
    • 功能
      访问网页‐>抓取数据‐>数据存储‐>数据处理‐>提供检索服务
    • robots协议
      一个约定俗成的协议,添加robots.txt文件,来说明本网站哪些内容不可以被抓取,起不到限制作用
      自己写的爬虫无需遵守
    • 网站排名(SEO)
      1. 根据pagerank算法值进行排名(参考个网站流量、点击率等指标)
      2. 百度竞价排名
    • 缺点
      1. 抓取的数据大多是无用的
      2. 不能根据用户的需求来精准获取数据
    4.2聚焦爬虫
    • 功能
      根据需求,实现爬虫程序,抓取需要的数据
    • 设计思路
      1. 确定要爬取的url
        如何获取Url
      2. 模拟浏览器通过http协议访问url,获取服务器返回的html代码
        如何访问
      3. 解析html字符串(根据一定规则提取需要的数据)
        如何解析

    5.反爬手段?

    1. User‐Agent:
       User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
    2. 代理IP
      西次代理
      快代理
      什么是高匿名、匿名和透明代理?它们有什么区别?
      1. 使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP。
      2. 使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实IP。
      3. 使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实IP。
    3. 验证码访问
      打码平台
      1. 云打码平台
    4. 动态加载网页 网站返回的是js数据 并不是网页的真实数据
      selenium驱动真实的浏览器发送请求
    5. 数据加密
      分析js代码

    6.urllib库使用

    在这里插入图片描述

    7.请求对象的定制

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

    语法:request = urllib.request.Request()

    
    
    import urllib.request
    
    url = 'https://www.baidu.com'
    
    # url的组成
    # https://www.baidu.com/s?wd=周杰伦
    
    # http/https    www.baidu.com   80/443     s      wd = 周杰伦     #
    #    协议             主机        端口号     路径     参数           锚点
    # http   80
    # https  443
    # mysql  3306
    # oracle 1521
    # redis  6379
    # mongodb 27017
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    # 因为urlopen方法中不能存储字典 所以headers不能传递进去
    # 请求对象的定制
    request = urllib.request.Request(url=url,headers=headers)
    
    response = urllib.request.urlopen(request)
    
    content = response.read().decode('utf8')
    
    print(content)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 扩展:编码的由来

    ‘’‘编码集的演变‐‐‐
    由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc‐kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。
    现代操作系统和大多数编程语言都直接支持Unicode。’‘’

    8.编解码

    1. get请求方式:urllib.parse.quote()
    
    # https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
    
    
    # 需求 获取 https://www.baidu.com/s?wd=周杰伦的网页源码
    
    import urllib.request
    import urllib.parse
    
    
    url = 'https://www.baidu.com/s?wd='
    
    # 请求对象的定制为了解决反爬的第一种手段
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    # 将周杰伦三个字变成unicode编码的格式
    # 我们需要依赖于urllib.parse
    name = urllib.parse.quote('周杰伦')
    
    url = url + name
    
    # 请求对象的定制
    request = urllib.request.Request(url=url,headers=headers)
    
    # 模拟浏览器向服务器发送请求
    response = urllib.request.urlopen(request)
    
    # 获取响应的内容
    content = response.read().decode('utf-8')
    
    # 打印数据
    print(content)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    1. get请求方式:urllib.parse.urlencode()
    
    # urlencode应用场景:多个参数的时候
    
    
    # https://www.baidu.com/s?wd=周杰伦&sex=男
    
    # import urllib.parse
    #
    # data = {
    #     'wd':'周杰伦',
    #     'sex':'男',
    #     'location':'中国台湾省'
    # }
    #
    # a = urllib.parse.urlencode(data)
    # print(a)
    
    
    #获取https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6&sex=%E7%94%B7的网页源码
    
    import urllib.request
    import urllib.parse
    
    base_url = 'https://www.baidu.com/s?'
    
    data = {
        'wd':'周杰伦',
        'sex':'男',
        'location':'中国台湾省'
    }
    
    new_data = urllib.parse.urlencode(data)
    
    # 请求资源路径
    url = base_url + new_data
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    # 请求对象的定制
    request = urllib.request.Request(url=url,headers=headers)
    
    # 模拟浏览器向服务器发送请求
    response = urllib.request.urlopen(request)
    
    # 获取网页源码的数据
    content = response.read().decode('utf-8')
    
    # 打印数据
    print(content)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    1. post请求方式
    
    # post请求---百度翻译
    
    import urllib.request
    import urllib.parse
    
    
    url = 'https://fanyi.baidu.com'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    data = {
        'kw':'spider'
    }
    
    # post请求的参数 必须要进行编码
    data = urllib.parse.urlencode(data).encode('utf-8')
    
    # post的请求的参数 是不会拼接在url的后面的  而是需要放在请求对象定制的参数中
    # post请求的参数 必须要进行编码
    request = urllib.request.Request(url=url,data=data,headers=headers)
    
    # 模拟浏览器向服务器发送请求
    response = urllib.request.urlopen(request)
    
    print(response)
    # # 获取响应的数据
    # content = response.read().decode('utf-8')
    #
    # # 字符串--》json对象
    #
    # import json
    #
    # obj = json.loads(content)
    # print(obj)
    
    
    
    # post请求方式的参数 必须编码   data = urllib.parse.urlencode(data)
    # 编码之后 必须调用encode方法 data = urllib.parse.urlencode(data).encode('utf-8')
    # 参数是放在请求对象定制的方法中  request = urllib.request.Request(url=url,data=data,headers=headers)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    总结:post和get区别?

    • get请求方式的参数必须编码,参数是拼接到url后面,编码之后不需要调用encode方法
    • post请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码之后需要调用encode方法

    案例练习:百度详细翻译

    
    
    import urllib.request
    import urllib.parse
    
    url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
    
    headers = {
        # 'Accept': '*/*',
        # 'Accept-Encoding': 'gzip, deflate, br',
        # 'Accept-Language': 'zh-CN,zh;q=0.9',
        # 'Connection': 'keep-alive',
        # 'Content-Length': '135',
        # 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': 'BIDUPSID=DAA8F9F0BD801A2929D96D69CF7EBF50; PSTM=1597202227; BAIDUID=DAA8F9F0BD801A29B2813502000BF8E9:SL=0:NR=10:FG=1; __yjs_duid=1_c19765bd685fa6fa12c2853fc392f8db1618999058029; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BDUSS=R2bEZvTjFCNHQxdUV-cTZ-MzZrSGxhbUYwSkRkUWk2SkxxS3E2M2lqaFRLUlJoRVFBQUFBJCQAAAAAAAAAAAEAAAA3e~BTveK-9sHLZGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOc7GBTnOxgaW; BDUSS_BFESS=R2bEZvTjFCNHQxdUV-cTZ-MzZrSGxhbUYwSkRkUWk2SkxxS3E2M2lqaFRLUlJoRVFBQUFBJCQAAAAAAAAAAAEAAAA3e~BTveK-9sHLZGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFOc7GBTnOxgaW; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BAIDUID_BFESS=DAA8F9F0BD801A29B2813502000BF8E9:SL=0:NR=10:FG=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; PSINO=2; H_PS_PSSID=34435_31660_34405_34004_34073_34092_26350_34426_34323_22158_34390; delPer=1; BA_HECTOR=8185a12020018421b61gi6ka20q; BCLID=10943521300863382545; BDSFRCVID=boDOJexroG0YyvRHKn7hh7zlD_weG7bTDYLEOwXPsp3LGJLVJeC6EG0Pts1-dEu-EHtdogKK0mOTHv8F_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tR3aQ5rtKRTffjrnhPF3-44vXP6-hnjy3bRkX4Q4Wpv_Mnndjn6SQh4Wbttf5q3RymJ42-39LPO2hpRjyxv4y4Ldj4oxJpOJ-bCL0p5aHl51fbbvbURvD-ug3-7qqU5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIE3-oJqC8hMIt43f; BCLID_BFESS=10943521300863382545; BDSFRCVID_BFESS=boDOJexroG0YyvRHKn7hh7zlD_weG7bTDYLEOwXPsp3LGJLVJeC6EG0Pts1-dEu-EHtdogKK0mOTHv8F_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tR3aQ5rtKRTffjrnhPF3-44vXP6-hnjy3bRkX4Q4Wpv_Mnndjn6SQh4Wbttf5q3RymJ42-39LPO2hpRjyxv4y4Ldj4oxJpOJ-bCL0p5aHl51fbbvbURvD-ug3-7qqU5dtjTO2bc_5KnlfMQ_bf--QfbQ0hOhqP-jBRIE3-oJqC8hMIt43f; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1629701482,1629702031,1629702343,1629704515; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1629704515; __yjs_st=2_MDBkZDdkNzg4YzYyZGU2NTM5NzBjZmQ0OTZiMWRmZGUxM2QwYzkwZTc2NTZmMmIxNDJkYzk4NzU1ZDUzN2U3Yjc4ZTJmYjE1YTUzMTljYWFkMWUwYmVmZGEzNmZjN2FlY2M3NDAzOThhZTY5NzI0MjVkMmQ0NWU3MWE1YTJmNGE5NDBhYjVlOWY3MTFiMWNjYTVhYWI0YThlMDVjODBkNWU2NjMwMzY2MjFhZDNkMzVhNGMzMGZkMWY2NjU5YzkxMDk3NTEzODJiZWUyMjEyYTk5YzY4ODUyYzNjZTJjMGM5MzhhMWE5YjU3NTM3NWZiOWQxNmU3MDVkODExYzFjN183XzliY2RhYjgz; ab_sr=1.0.1_ZTc2ZDFkMTU5ZTM0ZTM4MWVlNDU2MGEzYTM4MzZiY2I2MDIxNzY1Nzc1OWZjZGNiZWRhYjU5ZjYwZmNjMTE2ZjIzNmQxMTdiMzIzYTgzZjVjMTY0ZjM1YjMwZTdjMjhiNDRmN2QzMjMwNWRhZmUxYTJjZjZhNTViMGM2ODFlYjE5YTlmMWRjZDAwZGFmMDY4ZTFlNGJiZjU5YzE1MGIxN2FiYTU3NDgzZmI4MDdhMDM5NTQ0MjQxNDBiNzdhMDdl',
        # 'Host': 'fanyi.baidu.com',
        # 'Origin': 'https://fanyi.baidu.com',
        # 'Referer': 'https://fanyi.baidu.com/?aldtype=16047',
        # 'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
        # 'sec-ch-ua-mobile': '?0',
        # 'Sec-Fetch-Dest': 'empty',
        # 'Sec-Fetch-Mode': 'cors',
        # 'Sec-Fetch-Site': 'same-origin',
        # 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
        # 'X-Requested-With': 'XMLHttpRequest',
    }
    
    data = {
        'from': 'en',
        'to': 'zh',
        'query': 'love',
        'transtype': 'realtime',
        'simple_means_flag': '3',
        'sign': '198772.518981',
        'token': '5483bfa652979b41f9c90d91f3de875d',
        'domain': 'common',
    }
    # post请求的参数  必须进行编码 并且要调用encode方法
    data = urllib.parse.urlencode(data).encode('utf-8')
    
    # 请求对象的定制
    request = urllib.request.Request(url = url,data = data,headers = headers)
    
    # 模拟浏览器向服务器发送请求
    response = urllib.request.urlopen(request)
    
    # 获取响应的数据
    content = response.read().decode('utf-8')
    
    import json
    
    obj = json.loads(content)
    print(obj)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    9.ajax的get请求

    案例:豆瓣电影

    1. 请求豆瓣电影的第一页
    
    # get请求
    # 获取豆瓣电影的第一页的数据 并且保存起来
    
    import urllib.request
    
    url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    # (1) 请求对象的定制
    request = urllib.request.Request(url=url,headers=headers)
    
    # (2)获取响应的数据
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    
    # (3) 数据下载到本地
    # open方法默认情况下使用的是gbk的编码  如果我们要想保存汉字 那么需要在open方法中指定编码格式为utf-8
    # encoding = 'utf-8'
    # fp = open('douban.json','w',encoding='utf-8')
    # fp.write(content)
    
    with open('douban1.json','w',encoding='utf-8') as fp:
        fp.write(content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    1. 请求豆瓣电影的前十页
    
    
    # https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
    # start=0&limit=20
    
    # https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
    # start=20&limit=20
    
    # https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
    # start=40&limit=20
    
    # https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
    # start=60&limit=20
    
    # page    1  2   3   4
    # start   0  20  40  60
    
    # start (page - 1)*20
    
    
    # 下载豆瓣电影前10页的数据
    # (1) 请求对象的定制
    # (2) 获取响应的数据
    # (3) 下载数据
    
    import urllib.parse
    import urllib.request
    
    def create_request(page):
        base_url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&'
    
        data = {
            'start':(page - 1) * 20,
            'limit':20
        }
    
        data = urllib.parse.urlencode(data)
    
        url = base_url + data
    
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
        }
    
        request = urllib.request.Request(url=url,headers=headers)
        return request
    
    
    def get_content(request):
        response = urllib.request.urlopen(request)
        content = response.read().decode('utf-8')
        return content
    
    
    def down_load(page,content):
        with open('douban_' + str(page) + '.json','w',encoding='utf-8')as fp:
            fp.write(content)
    
    
    
    
    # 程序的入口
    if __name__ == '__main__':
        start_page = int(input('请输入起始的页码'))
        end_page = int(input('请输入结束的页面'))
    
        for page in range(start_page,end_page+1):
    #         每一页都有自己的请求对象的定制
            request = create_request(page)
    #         获取响应的数据
            content = get_content(request)
    #         下载
            down_load(page,content)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    10.ajax的post请求

    案例:KFC官网

    # 1页
    # http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
    # post
    # cname: 北京
    # pid:
    # pageIndex: 1
    # pageSize: 10
    
    
    # 2页
    # http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
    # post
    # cname: 北京
    # pid:
    # pageIndex: 2
    # pageSize: 10
    
    import urllib.request
    import urllib.parse
    
    def create_request(page):
        base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
    
        data = {
            'cname': '北京',
            'pid':'',
            'pageIndex': page,
            'pageSize': '10'
        }
    
        data = urllib.parse.urlencode(data).encode('utf-8')
    
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
        }
    
        request = urllib.request.Request(url=base_url,headers=headers,data=data)
    
        return request
    
    def get_content(request):
        response = urllib.request.urlopen(request)
        content = response.read().decode('utf-8')
        return content
    
    
    def down_load(page,content):
        with open('kfc_' + str(page) + '.json','w',encoding='utf-8')as fp:
            fp.write(content)
    
    
    
    if __name__ == '__main__':
        start_page = int(input('请输入起始页码'))
        end_page = int(input('请输入结束页码'))
    
        for page in range(start_page,end_page+1):
            # 请求对象的定制
            request = create_request(page)
            # 获取网页源码
            content = get_content(request)
            # 下载
            down_load(page,content)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    11.URLError\HTTPError

    简介:
    1. HTTPError类是URLError类的子类
    2. 导入的包urllib.error.HTTPError   urllib.error.URLError
    3.http错误:http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出
    了问题。
    4.通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加的健壮,可以通过try‐except进行捕获异常,异常有两类,URLError\HTTPError

    
    import urllib.request
    import urllib.error
    
    # url = 'https://blog.csdn.net/sulixu/article/details/1198189491'
    
    url = 'http://www.doudan1111.com'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    try:
        request = urllib.request.Request(url = url, headers = headers)
    
        response = urllib.request.urlopen(request)
    
        content = response.read().decode('utf-8')
    
        print(content)
    except urllib.error.HTTPError:
        print('系统正在升级。。。')
    except urllib.error.URLError:
        print('我都说了 系统正在升级。。。')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    12.cookie登录

    使用案例:
    1.weibo登陆
    作业:qq空间的爬取

    # 适用的场景:数据采集的时候 需要绕过登陆 然后进入到某个页面
    # 个人信息页面是utf-8  但是还报错了编码错误  因为并没有进入到个人信息页面 而是跳转到了登陆页面
    # 那么登陆页面不是utf-8  所以报错
    
    # 什么情况下访问不成功?
    # 因为请求头的信息不够  所以访问不成功
    
    import urllib.request
    
    url = 'https://weibo.cn/6451491586/info'
    
    headers = {
    # ':authority': 'weibo.cn',
    # ':method': 'GET',
    # ':path': '/6451491586/info',
    # ':scheme': 'https',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    # 'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cache-control': 'max-age=0',
    #     cookie中携带着你的登陆信息   如果有登陆之后的cookie  那么我们就可以携带着cookie进入到任何页面
    'cookie': '_T_WM=24c44910ba98d188fced94ba0da5960e; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WFxxfgNNUmXi4YiaYZKr_J_5NHD95QcSh-pSh.pSKncWs4DqcjiqgSXIgvVPcpD; SUB=_2A25MKKG_DeRhGeBK7lMV-S_JwzqIHXVv0s_3rDV6PUJbktCOLXL2kW1NR6e0UHkCGcyvxTYyKB2OV9aloJJ7mUNz; SSOLoginState=1630327279',
    # referer  判断当前路径是不是由上一个路径进来的    一般情况下 是做图片防盗链
    'referer': 'https://weibo.cn/',
    'sec-ch-ua': '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
    }
    # 请求对象的定制
    request = urllib.request.Request(url=url,headers=headers)
    # 模拟浏览器向服务器发送请求
    response = urllib.request.urlopen(request)
    # 获取响应的数据
    content = response.read().decode('utf-8')
    
    # 将数据保存到本地
    with open('weibo.html','w',encoding='utf-8')as fp:
        fp.write(content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    13.Handler处理器

    为什么要学习handler?
      urllib.request.urlopen(url)
        不能定制请求头
      urllib.request.Request(url,headers,data)
        可以定制请求头
      Handler
        定制更高级的请求头(随着业务逻辑的复杂 请求对象的定制已经满足不了我们的需求(动态cookie和代理不能使用请求对象的定制)

    
    
    # 需求 使用handler来访问百度  获取网页源码
    
    import urllib.request
    
    url = 'http://www.baidu.com'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    request = urllib.request.Request(url = url,headers = headers)
    
    # handler   build_opener  open
    
    # (1)获取hanlder对象
    handler = urllib.request.HTTPHandler()
    
    # (2)获取opener对象
    opener = urllib.request.build_opener(handler)
    
    # (3) 调用open方法
    response = opener.open(request)
    
    content = response.read().decode('utf-8')
    
    print(content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    14.代理服务器

    在这里插入图片描述

    import urllib.request
    
    url = 'http://www.baidu.com/s?wd=ip'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    # 请求对象的定制
    request = urllib.request.Request(url = url,headers= headers)
    
    # 模拟浏览器访问服务器
    # response = urllib.request.urlopen(request)
    
    proxies = {
        'http':'118.24.219.151:16817'
    }
    # handler  build_opener  open
    handler = urllib.request.ProxyHandler(proxies = proxies)
    
    opener = urllib.request.build_opener(handler)
    
    response = opener.open(request)
    
    # 获取响应的信息
    content = response.read().decode('utf-8')
    
    # 保存
    with open('daili.html','w',encoding='utf-8')as fp:
        fp.write(content)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    扩展:

    1. 代理池
    import urllib.request
    
    proxies_pool = [
        {'http':'118.24.219.151:16817'},
        {'http':'118.24.219.151:16817'},
    ]
    
    import random
    
    proxies = random.choice(proxies_pool)
    
    url = 'http://www.baidu.com/s?wd=ip'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    
    request = urllib.request.Request(url = url,headers=headers)
    
    handler = urllib.request.ProxyHandler(proxies=proxies)
    
    opener = urllib.request.build_opener(handler)
    
    response = opener.open(request)
    
    content = response.read().decode('utf-8')
    
    with open('daili.html','w',encoding='utf-8')as fp:
        fp.write(content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    1. 快代理
  • 相关阅读:
    springboot 调用第三方接口的方式(一)使用RestTemplate方法
    R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用residuls函数从模型中提取每个样本点的残差值
    结构重参数化
    第一章 计算机网络概论
    【移动端网页特效】01-触屏事件和常用对象列表
    分支定界、分支切割、分支定价的区别
    Java跨模块无法扫描到controller问题解决
    0079__多线程私有数据pthread_key_create
    linux常用命令
    前端高度变化实现过渡动画
  • 原文地址:https://blog.csdn.net/m0_51366201/article/details/134448213