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)广度优先搜索

  • 相关阅读:
    SQLMAP注入教程-11种常见SQLMAP使用方法详解
    VS2012/2013/2015/Visual Studio 2017 关闭单击文件进行预览的功能
    解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题
    Spring Data JPA one to one 共享主键关联
    JHipster 问题集中
    Spring Data JPA 定义超类
    Spring Data JPA查询关联数据
    maven命名
    maven仓库
    Jackson读取列表
  • 原文地址:https://www.cnblogs.com/nuochengze/p/12287207.html
Copyright © 2011-2022 走看看