• 路飞学城Python-Day142


    第2节:UA身份伪装
    反爬机制
    User-Agent:请求载体的身份标识
    通过不同的手段的当前的请求载体是不一样的,请求信息也是不一样的,常见的请求信息都是以键和值的形式存在
    浏览器的开发者工具
    NetWork-抓包工具
    ResponseHeaders-响应头信息
    RequestHeaders-请求头信息
    User-Agent(UA):请求载体标识
    网站会检查请求的UA,如果发现请求的UA是爬虫程序,则拒绝提供网站数据
    反反爬机制:伪装爬虫程序的请求的UA
    import urllib.request
    url = 'http://www.baidu.com/'
    # UA伪装
    # 1.自制定一个请求对象
    headers = {
    #     存储任意的请求头信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
    }
    # 该请求对象进行了成功的伪装
    req = urllib.request.Request(url=url, headers=headers)
    # 2.针对自制定的请求对象发起请求
    res = urllib.request.urlopen(req)
    print(res.read())
     
    第2节:post请求
    爬取百度翻译的结果
    network里的xhr就是全部是基于ajax的请求
    import urllib.request
    import urllib.parse
    # 1.制定url
    url = 'https://fanyi.baidu.com/sug'
    # post请求所携带的参数处理流程
    # 1.将请求参数封装到字典中
    data = {
        'kw': '西瓜',
    }
    # 2.使用parse中的url encode进行编码处理
    data = urllib.parse.urlencode(data)
     
    # 3.将步骤2的编码结果转换为byte类型
    data = data.encode()
     
    # 2.发起post请求
    # urlopen中的data表示的就是经过处理之后的post的请求参数
    req = urllib.request.urlopen(url=url, data=data)
    # print(req.read())
    with open('./百度翻译.txt', 'wb') as fp:
        fp.write(req.read())

    urllib的高级操作简介
    三.urllib模块的高级操作
        1.代理
          - 什么是代理:代理就是第三方代替本体处理相关事务。例如:生活中的代理:代购,中介,微商......
      - 爬虫中为什么需要使用代理?
         一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理IP,每隔一段时间换一个代理IP,就算IP被禁止,依然可以换个IP继续爬取。
       - 代理的分类:
        正向代理:代理客户端获取数据。正向代理是为了保护客户端防止被追究责任。
        反向代理:代理服务器提供数据。反向代理是为了保护服务器或负责负载均衡。
    import urllib.request
    import urllib.parse
     
    #1.创建处理器对象,在其内部封装代理ip和端口
    handler=urllib.request.ProxyHandler(proxies={'http':'95.172.58.224:52608'})
    #2.创建opener对象,然后使用该对象发起一个请求
    opener=urllib.request.build_opener(handler)
     
     
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    }
     
    request = urllib.request.Request(url, headers=headers)
     
    #使用opener对象发起请求,该请求对应的ip即为我们设置的代理ip
    response = opener.open(request)
     
    with open('./daili.html','wb') as fp:
    fp.write(response.read())
        2.cookie
             引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如:
    import urllib.request
    import urllib.parse
    #指定url
    #自定义请求头信息
    headers={
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    #自定义请求对象
    request = urllib.request.Request(url=url,headers=headers)
    #发起请求
    response = urllib.request.urlopen(request)
     
    with open('./renren.html','w') as fp:
    fp.write(response.read().decode())
    【注意】上述代码中,我们爬取到的是登录首页面,而不是张三的个人主页也面。why?首先我们来回顾下cookie的相关概念及作用
            - cookie概念:当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie。
            - cookie作用:我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。 
            - 经过cookie的相关介绍,其实你已经知道了为什么上述案例中爬取到的不是张三个人信息页,而是登录页面。那应该如何抓取到张三的个人信息页呢?
      思路:
        1.我们需要使用爬虫程序对人人网的登录时的请求进行一次抓取,获取请求中的cookie数据
        2.在使用个人信息页的url进行请求时,该请求需要携带 1 中的cookie,只有携带了cookie后,服务器才可识别这次请求的用户信息,方可响应回指定的用户信息页数据
    cookiejar对象:
    - 作用:自动保存请求中的cookie数据信息
    - 注意:必须和handler和opener一起使用
    cookiejar使用流程:
    - 创建一个cookiejar对象
    import http.cookiejar
    cj = http.cookiejar.CookieJar()
    - 通过cookiejar创建一个handler
    handler = urllib.request.HTTPCookieProcessor(cj)
    - 根据handler创建一个opener
    opener = urllib.request.build_opener(handler)
    - 使用opener.open方法去发送请求,且将响应中的cookie存储到openner对象中,后续的请求如果使用openner发起,则请求中就会携带了cookie
    使用cookiejar实现爬取人人网个人主页页面数据:
    #使用cookiejar实现人人网的登陆
    import urllib.request
    import urllib.parse
    import http.cookiejar
    cj = http.cookiejar.CookieJar() #请求中的cookie会自动存储到cj对象中
    #创建处理器对象(携带cookiejar对象的)
    handler=urllib.request.HTTPCookieProcessor(cj)
    #创建opener对象 (携带cookiejar对象)
    opener=urllib.request.build_opener(handler)
     
    #要让cookiejar获取请求中的cookie数据值
    #自定义一个请求对象,让该对象作为opener的open函数中的参数
    data={
    "icode":"",
    "domain":"renren.com",
    "key_id":"1",
    "captcha_type":"web_login",
    "password":"40dc65b82edd06d064b54a0fc6d202d8a58c4cb3d2942062f0f7dd128511fb9b",
    "rkey":"41b44b0d062d3ca23119bc8b58983104",
    }
    data=urllib.parse.urlencode(data).encode()
    request=urllib.request.Request(url,data=data)
    opener.open(request)
     
    #获取当前用户的二级子页面
    #该次请求中就携带了cookie
    resonse=opener.open(s_url)
     
    with open('./renren.html','wb') as fp:
    fp.write(resonse.read())
     

    request简介
    1.什么是request模块
    request是python原生的一个基于网络请求的模块,模拟浏览器发起请求
    request模块功能更强大,开发效率高,掌握了request模块就是掌握了网络爬虫的半壁江山!
    2.为什么要用request模块
    urllib中有一些不便于操作的地方,使用urllib必须手动处理url的编码方式,比如quate()手动编码,有的url有很多组参数的,每一组都需要进行编码会很不方便
    urllib还需要手动处理post请求的参数,url.encode()对字典进行处理,之后还要进行doceode操作
    urllib处理cookie和代理的时候比较繁琐
        -创建一个cookie对象,
        -创建一个handler对象
        -创建一个opener对象,通过opener发起请求,这时才会携带cookie
    处理代理操作的流程
        -创建一个handler对象,见代理ip和端口封装到该对象中
        -基于handler对象再去创建opener对象,
    request模块会自动处理编码问题,简化了更多的cookie和代理的操作
    3.request如何被使用
    -安装request模块
    -1.指定url
    -2.使用request模块发起请求
    -3.获取响应数据
    -4.进行持久化存储
    4.通过5个基于request模块的爬虫项目对该模块进行系统学习和巩固
    -1.request发起get请求
    -2.request发起post请求
    -3.request发起ajax请求
    -4.request发起ajax的post请求
    -5.综合项目,所有基础知识点练习

    requsts-get请求1
     
     
    # 爬取搜狗首页的数据
    import requests
    # 1.指定url
    url = 'https://www.sogou.com/'
    # 2.发起get请求
    res = requests.get(url=url)
    # 3.获取响应中的数据值
    # text获取相应页面中的字符串形式
    page_data = res.text
    # print(page_data)
    # 4.持久化操作
    with open('./sougou.html', 'w', encoding='utf-8') as fp:
        fp.write(page_data)

    requests(response常用属性)
     
    # 爬取搜狗首页的数据
    import requests
    # 1.指定url
    url = 'https://www.sogou.com/'
    # 2.发起get请求
    res = requests.get(url=url)
    # 3.获取响应中的数据值
    # content获取的是response对象中的byte类型的页面数据
    # print(res.content)
    # status_code表示网页的响应状态码,返回响应状态码,查属性的结果,响应成功或失败
    # print(res.status_code)
    # 获取响应头信息(字典的形式)
    # print(res.headers)
    # 获取的是响应对象中的url,获取请求的url,返回的是请求中指定的url
    # print(res.url)

    requests模块带参get请求方式1
    # 获取搜狗搜索结果对应页面数据
    import requests
    url = 'https://www.sogou.com/web?query=周杰伦&ie=utf-8'
     
    res = requests.get(url=url)
     
    # print(res.text)
     
    with open('./Jay.html', 'w', encoding='utf-8') as fp:
        fp.write(res.text)
     

     
     
    requests模块带参get请求方式2
    # 获取搜狗搜索结果对应页面数据
    import requests
     
    url = 'https://www.sogou.com/web'
    # 将参数封装到字典中
    params = {
        'query': '周杰伦',
        'ie': 'utf-8',
    }
    res = requests.get(url=url, params=params)
     
    # print(res.text)
     
    with open('./Jay2.html', 'w', encoding='utf-8') as fp:
        fp.write(res.text)

    requests模块get请求自定义请求头信息
     
     
     
     
     
     
    import requests
    # 自定义请求头信息
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
    }
     
     
    url = 'https://www.sogou.com/web'
    # 将参数封装到字典中
    params = {
        'query': '周杰伦',
        'ie': 'utf-8',
    }
    res = requests.get(url=url, params=params, headers=headers)
     
    # print(res.text)
     
    with open('./Jay3.html', 'w', encoding='utf-8') as fp:
        fp.write(res.text)
     

    request模块的post请求
     
     
    # 登录豆瓣网,获取登陆成功后的页面数据
    import requests
    # 指定url
    url = 'https://accounts.douban.com/login'
    # 封装post请求的参数
    data = {
    'source': 'movie',
    'redir': 'https://movie.douban.com/',
    'form_email': 'a873245193@sina.com',
    'form_password': 'dota2009',
    'login': '登录'
    }
    headers = {
    #     存储任意的请求头信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
    }
    # 发起post请求
    req = requests.post(url=url, data=data, headers=headers)
    # 3.获取响应对象中的页面数据
    page_text = req.text
    # 4.持久化操作
    with open('./douban.html', 'w', encoding='utf-8') as fp:
        fp.write(page_text)
     
     
    requests模块ajax的get请求
     
     
    import requests
     
    url = 'https://movie.douban.com/j/chart/top_list?'
    # 封装ajax中get请求携带的参数
    params = {
        'type': '13',
        'interval_id': '100:90',
        'action': '',
        'start': '0',
        'limit': '2000',
    }
    headers = {
        #     存储任意的请求头信息
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
    }
    req = requests.get(url=url, params=params, headers=headers)
    print(req.text)
     
     
    requests模块处理ajax的post请求
     
    # 爬取肯德基餐厅的位置数据
    import requests
     
    # 1.指定url
    post_url = r'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    # 2.处理post请求的参数
    data = {
        'cname': '',
        'pid': '',
        'keyword': '江苏',
        'pageIndex': '1',
        'pageSize': '10',
    }
    headers = {
        #     存储任意的请求头信息
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
    }
    req = requests.post(url=post_url, data=data, headers=headers)
    print(req.text)
     
    request模块综合练习
     
     
    import requests
    # 爬取搜狗、知乎某一个词条对应的一定范围表示的页面数据
    # 获取前3页页面数据
    # 1.指定url
    url = 'https://zhihu.sogou.com/zhihu'
    params = {
        'query': '人工智能',
        'page':'6',
        'ie':'utf8',
    }
    headers = {
        #     存储任意的请求头信息
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
    }
    req = requests.get(url=url, params=params, headers=headers)
    # print(req.text)
    with open('./人工智能.html', 'w', encoding='utf-8') as fp:
        fp.write(req.text)
     
    request模块的cookie操作
     
    # cookie
    # 基于用户的数据
    # 爬取豆瓣网的个人主页页面数据
    # cookie作用,服务端使用cookie来记录客户端的状态信息
    # 1.执行登录操作
    # 2.发起个人请求主页请求时,需要将cookie携带到该请求中
    # session也可以使用来发起请求,该cookie对象会自动存储在session中
    import requests
     
    session = requests.session()
    login_url = 'https://www.douban.com/accounts/login'
    data = {
        'source': 'movie',
        'redir': 'https://movie.douban.com/',
        'form_email': 'a873245193@sina.com',
        'form_password': 'dota2009',
        'login': '登录',
    }
    headers = {
        #     存储任意的请求头信息
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
    }
    res = session.post(url=login_url, data=data, headers=headers)
    print(res.text)
    with open('./dou.html', 'w', encoding='utf-8') as fp:
        fp.write(res.text)
     
     
     
    requests模块的代理操作
     
     
    # -代理操作,使用第三方代替本体去操作事务
    # -为什么要使用代理?
    # 反爬操作有关联
    # 设置代理ip防止门户网站封禁ip,使用代理是一种反反爬的手段
    # 代理分类
    # -正向代理 代替客户端获取数据
    # -反向代理 代替服务器端提供数据
    # 4.免费代理ip的网站提供商
    # -www.goubanjia.com
    # -快代理
    # -西祠代理
     
    Win a contest, win a challenge
  • 相关阅读:
    validation 参数效验框架
    小酌一下:Maven
    小酌一下:git 常用命令
    小酌一下:anaconda 基本操作
    小酌一下:Win10 解决fetch_20newsgroups下载速度巨慢
    学习笔记:Python3 异常处理
    学习笔记:Python3 面向对象
    学习笔记:Python3 函数式编程
    学习笔记:Python3 函数
    学习笔记:Python3 高级特性
  • 原文地址:https://www.cnblogs.com/pandaboy1123/p/9925511.html
Copyright © 2020-2023  润新知