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格式字符串。 需要将编码格式进行转换,然后才可查看。
  • 相关阅读:
    mysql----SELECT names/zh
    Java开源博客My-Blog(SpringBoot+Docker)系列文章
    shell脚本中字符串的常见操作及"command not found"报错处理(附源码)
    运行shell脚本时报错"[[ : not found"解决方法
    使用ajax方法实现form表单的提交
    Spring+SpringMVC+MyBatis整合优化篇
    Spring+SpringMVC+MyBatis整合基础篇
    Spring+SpringMVC+MyBatis整合(easyUI、AdminLte3)
    Java开源博客My-Blog之docker容器组件化修改
    短信发送接口被恶意访问的网络攻击事件(四)完结篇--搭建WAF清理战场
  • 原文地址:https://www.cnblogs.com/chengege/p/10773642.html
Copyright © 2011-2022 走看看