zoukankan      html  css  js  c++  java
  • 简单的爬虫

    urllib

    • python 中自带的一个基于爬虫的模块
    • 作用: 可以使用代码 模拟浏览器发起请求。 request parse
    • 使用流程:
      • 指定url
      • 针对指定的url 发起请求
      • 获取服务器响应的数据
      • 持久化存储
    In [12]:
     
    # 需求: 爬去指定词条的,url 数据
    import urllib.request
    import urllib.parse
    # 1. 指定url,只能使用ascll 编码格式。 所以如果带有中文。 需要进行,编码格式的转换. 
    # url 特性: url中不可以存在 fei1 ASCLL 编码的字符数据。
    url = 'https://www.baidu.com/s?wd='
    word = urllib.parse.quote("阿纯")  # 对特殊字符进行,特殊字符的转码。
    url += word
    print(url)  # https://www.sogou.com/web?query=%E9%98%BF%E7%BA%AF
    # 2. 发起请求,  且返回响应对象。
    response = urllib.request.urlopen(url=url)
    # 3. 使用相应对象,read 获取响应对象中,存储的页面 html 文档数据。(格式为 byte)
    html_text = response.read()
    # 4. 持久化存储, 保存到磁盘
    with open("./chun.html", "wb") as f:
        f.write(html_text)
    print("donwload")

    上述代码,不能够。顺利进行爬取,想来是因为, 有了反爬机制

    • 反爬机制: 检查请求的UA, 如果是一个正常的请求,就会正常的响应。 如果不是浏览器的 UA 可能就会被认为是一个 爬虫程序发起的请求, 从而拒绝提供网站数据。
      • User-Agent: 请求载体的身份标识。(通过爬虫发送请求,请求载体就是爬虫程序。 模拟成浏览器请求载体。)
      • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
    • 反反爬虫机制: 伪装爬虫的请求UA。使浏览器认为,这是一个正常的请求。
    In [19]:
     
    import urllib.request
    import urllib.parse
    url = 'https://www.baidu.com/s?wd='
    word = urllib.parse.quote("啊纯")
    url += word
    # UA 伪装:
    #1. 自制定一个请求对象:headers 赋值一个字典格式的数据
    headers = {
        # 存储任意的请求头,信息
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'
    }
    request = urllib.request.Request(url=url,headers=headers)
    # 2.针对自制定的请求对象,发起请求
    response = urllib.request.urlopen(request) 
    html_text = response.read()
    with open("./chun.html", "wb") as f:
        f.write(html_text)
    # ok 到此, 简单的爬去已经完成。 而且 都是基于 GET 请求的方式, 发送的请求。

    试一试 使用 post 方式, 发送请求。

    - urllib 模块发起POST请求。  实验一个,爬去百度翻译的翻译结果
    - 浏览器中, 开发者工具, Network 中。 XHR 类型的请求,就是 基于Ajax的 POST请求。
    - 在其中的所有的,请求中。寻找 Form Date 的参数。是我在 文本框中,输入的这个值的那条请求。就是我想要的。
    In [26]:
     
    # urllib
    import urllib.request
    import urllib.parse
    # 指定url 
    url = 'https://fanyi.baidu.com/sug'
    # POST请求携带参数的处理:流程:
    # 1. 将 POST 请求的参数, 封装到字典中:  参数键, 与目标服务器的, 键 保持一致
    data = {
        'kw':"西瓜"
    }
    # 2. 使用 parse.urlencode()  对封装的字典数据, 进行编码的处理. 返回字符串类型。
    data = urllib.parse.urlencode(data)
    # print(data, type(data))    # kw=%E8%A5%BF%E7%93%9C <class 'str'>
    # 3. 将 第二步, 得到的 字符串类型的数据。 转换成  byte 类型。(因为网络传输 都是使用的 byte 类型进行传输)
    data = data.encode()
    # 4. 发起 POST 请求:  data参数表示的就是,经过处理之后的 post 请求携带的参数.
    response = urllib.request.urlopen(url=url, data=data)
    # 这里得到的是 以个 josn 格式的 byte格式字符串。 需要将编码格式进行转换,然后才可查看。
  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/chengege/p/10773642.html
Copyright © 2011-2022 走看看