zoukankan      html  css  js  c++  java
  • 五、request模块

    描述:requests是python的一个第三方HTTP(Hypertext Transfer Protocol,超文本传输协议)库,它比python自带的网络库urllib更加简单、方便和人性化;使用requests可以让python实现访问网页并获取源代码的功能;使用requests获取网页的源代码,最简单的情况下只需要两行代码

    # 使用requests获取源代码
    import requests
    source = requests.get('https:www.baidu.com').content.decode()
    

     1、安装requests库

    sudo apt install requests
    或者
    sudo pip3 install requests -i https://mirrors.aliyun.com/pypi/simple
    

    2、使用requests获取网页源代码

      2.1 GET方式

      对于使用get方式的网页,在python中可以使用requests的get()方法获取网页的源代码:

    1 import requests
    2 html = requests.get('网址')
    3 html_bytes = html.content
    4 html_str = html_bytes.decode('utf-8')

      说明:(1)第1行导入requests库。

         (2)第2行使用get方法获取了网页,得到一个response对象。

         (3)第3行使用.content这个属性来显示bytes型网页的源代码,中文无法正常显示。

         (4)第4行将bytes型的网页源代码解析为字符串型的源代码。utf-8为编码格式

      代码合并

    import requests
    html_str = requests.get('网址').content.decode()

      2.2 POST方式

      对于使用post方式的网页,在python中可以使用requests的post()方法获取网页的源代码:

    1 import requests
    2 date = {'key1':'value1',
    3             'key2':'value2'}
    4 html_formdata = requests.post('网址', data=data).content.decode()
    5 # 利用formdata提交数据    

      说明:(1)data这个字典视情况而定,构造这个字典是任务之一。

         (2)当一些网址提交的内容为json时,post()方法的参数会进行调整

           1 html_json = requests.post('网址',json=data).content.decoade() # 使用json提交数据 

            requests可以自动将字典转换为JSON字符串

    3、 结合requests与正表达式

      说明:通过requests获得了网页的源代码,就可以对源代码字符串使用正则表达式来提取文本信息。

    4、多线程爬虫

      说明:(1)python这门语言有一个全局解释器锁(Global Interpreter Lock,GIL),导致python的多线程都是伪多线程,本质上是一个线程,不过线程间隔时间很短,宏观上是连续的。这种机制对I/O密集型的操作上影响不大,但是对于CPU计算密集型的操作上面,因为只能使用CPU的一个核,对性能产生很大的影响;涉及计算密集型的程序,需要使用多进程,python的多进程不受GIL的影响。

      4.1 多进程库(multiprocessing)

       说明:(1)multiprocessing本身是python的多进程库,用来处理与多进程相关的操作。但是由于进程与进程之间不能直接共享内存和堆栈资源,而且启动新的进程开销也比线程大得多,因此使用多线程来爬取比使用多进程有更多的优势。

          (2)multiprocessing下面有一个dummy模块,它可以让python的线程使用multiprocessing的各种方法。

          (2)dummy下面有一个Pool类,它用来实现线程池,这个线程池有一个map()方法,可以让线程池里面的所有线程都“同时”执行一个函数。

              例子:

    1 from multiprocessing.dummy import Pool
    2 def calc_num(num):
    3     return num*num
    4 pool = Pool(5)
    5 origin_num = [x for x in range(10)]
    6 result = pool.map(calc_num, origin_num)
    7 print(result)

        说明:线程池的map()方法接收两个参数,第1个参数是函数名,第2个参数是一个列表。

        注意:第1个参数仅仅是函数的名字,不能带括号。第2个参数是一个可迭代的对象,这个可迭代对象里面的每一个元素都会被函数calc_num()接收作为参数。

           除了列表,元组、集合或则字典都可以作为map()的第2个参数。

      4.2 开发多线程爬虫

        说明:爬虫是I/O密集型的操作,特别是在请求网页源代码的时候,如果使用单线程来开发,会浪费大量的时间来等待网页返回,所以把多线程技术应用到爬虫中,可以大大提高爬虫的运行效率。

        例子:

     1 from multiprocessing.dummy import Pool
     2 import requests
     3 
     4 def query(url):
     5     requests.get(url)
     6 url_list = []
     7 for i in range(100):
     8     url_list.append('https://baidu.com')
     9 pool = Pool(5)
    10 pool.map(query, url_list)

      4.3 爬虫的常见搜索算法

        (1)深度优先搜索

        (2)广度优先搜索

  • 相关阅读:
    爬虫案例-爬运维工单
    pandas数据库mysql交互
    pandas数据分析之三:数据重塑与轴向转化、数据分组与分组运算、离散化处理、多数据文件合并操作
    pandas数据分析之二:数据格式转换、排序、统计、函数
    pandas数据分析之一:数据类型及读写
    pandas的透视表pivot_table使用及筛选
    HTML5+CSS3学习笔记(一) 概述
    HTML5+CSS3学习笔记(二) 页面布局:HTML5新元素及其特性
    HTML基础笔记
    Linux札记1- centos7 桌面GNOME安装,语言设置,hostname设置
  • 原文地址:https://www.cnblogs.com/nuochengze/p/12287207.html
Copyright © 2011-2022 走看看