Advertisement

python爬虫(一)Requests库

阅读量:

一、概述

1、爬虫,应称为网络爬虫,也叫网页蜘蛛、网络机器人、网络蚂蚁等;

2、搜索引擎,就是网络爬虫的应用者;

二、爬虫分类

1、通用爬虫:常见的就是搜索引擎;

2、聚焦爬虫:有针对性的编写特定领域数据的爬取程序,是面向主题的爬虫;

三、Robots协议

简单来说就是告诉爬虫引擎什么可以爬取,“爬亦有道”;

四、爬虫的HTTP请求和响应处理

其实质就是获取网页内容是基于HTTP协议从服务器端获取数据;然而通常情况下,用户通过浏览器进行操作属于人的主观行为;将这一过程自动化为程序化的操作流程.

1、最常用的HTTP交互数据的方法是GET、POST;

GET方法的数据经由URL传输至客户端;即数据位于HTTP报文中对应的header字段。

  1. POST方法,数据是放在HTTP报文的body部分体骄傲的;

一些网站具备防反爬虫特性;为了实现网页抓取而不被识别为爬虫机器人,通常采用的方法是:通过模拟真实用户行为来模仿真实浏览器行为.

五、urllib包

在Python 2版本中,默认包含了 urllib 和 urllib2 模块。其中 urllib 提供了相对底层的网络功能接口,而 urllib2 对 urllib 进行了更为完善的封装设计。在 Python 3版本中,默认将 urllib 移动至 urllib2 中作为标准库模块命名。

urllib是标准库,它是一个工具包模块,包含下面常用模块来处理url:

1、urllib.request用于打开和读写url

2、urllib.error包含了由urllib.request引起的异常

3、urllib.parse用于解析url

urllib.request库:该库提供了用于在身份验证(包括基本和摘要式)、重定向以及设置cookies等场景中打开HTTP相关 url 的函数与类;此外还包含了支持HTTPS协议的URL处理功能。

urllib.request模块下主要的方法和类:

1 )urlopen( url,data=None )

url是链接地址字符串,或请求类的实例;

提供的数据中,当data为None时发送 ** GET请求** ;否则发送 ** POST请求** 。

该方法返回http.client.HTTPResponse类的响应实例;这是一个(类)文件对象;可以通过with语法进行操作。

2 )Request类:Request(url, data=None, headers={})

通过初始化方法创建一个请求对象,并允许在其中添加一个headers字典。根据data参数的值来确定是GET还是POST请求类型。

add_header(key, val)为header中增加一个键值对;

( 2 )urllib.parse模块:该模块可以完成对url的** 编解码** ;

通常情况下,在URL地址中避免使用中文路径以防止混淆。然而,在采用GET或POST方法处理参数时,请注意其中可能会包含斜杠、等号和问号等特殊符号。这些字符代表数据内容而不作为元字符存在。直接发送给服务器会导致接收方无法明确区分哪些是元字符编码前的原始数据。为了确保传输的安全性,在传输过程中通常会对数据中的各个字符进行 URL 编码处理;随后还可以将带有中文的参数进行 URL 编码处理。具体来说,则是按照字符集的标准 encoding 转换为字节序列后,每个字节对应的十六进制字符串前面添加一个 % 即可完成编码。

六、urllib3包

标准库urllib在功能完整性上存在不足,在并发处理能力上相对薄弱;相应的第三方库urllib3则包含了这些缺失的功能,并支持连接池管理等高级功能。

(1)安装:$pip install urllib3

七、requests包

requests库采用了urllib3模块,并因其API接口更加友好直观而备受关注;
我们强烈推荐采用该库作为基础架构;
特别适合用于爬虫场景中

(1)安装:

复制代码
    $pip install requests

(2)引入

复制代码
    import requests

(3)基本请求

复制代码
 r = requests.get("https://www.baidu.com/")

    
 r = requests.post("https://www.baidu.com/")
    
 r = requests.put("https://www.baidu.com/")
    
 r = requests.delete("https://www.baidu.com/")
    
 r = requests.head("https://www.baidu.com/")

(4)基本GET请求

复制代码
    r = requests.get("https://www.baidu.com/")

如果想要加参数,可以利用 params参数

复制代码
 import requests

    
  
    
 payload = {'key1':'value1','key2':'value2'}
    
 r = requests.get("https://www.baidu.com/" , params=payload)
    
  
    
 print(r.url)

运行结果

复制代码
    https://www.baidu.com/?key1=value1&key2=value2

还可以通过 headers参数 ,增加请求头中的headers信息

复制代码
 1、s.headers.update({})方法设置headers的变量,追加在headers中;

    
 2、headers参数,直接覆盖headers;

(5)基于POST请求

对于POST请求来说,form表单传参最基本的传参方法使用data参数

复制代码
 import requests

    
  
    
 payload = {'key1':'value1','key2':'value2'}
    
 r = requests.post("https://www.baidu.com/" , data=payload)

JSON 格式的数据显示出来

JSON 格式的数据显示出来

复制代码
 import json

    
 import requests
    
  
    
 url = 'https://www.baidu.com/'
    
 payload = {'key':'value'}
    
 r = requests.post(url, data=json.dumps(payload))

files参数 ,上传文件

复制代码
 import requests

    
  
    
 url = 'https://www.baidu.com/'
    
 files = {'file':open('test.txt' , 'rb')}
    
 r = requests.post(url , files=files)

requests具备流式传输功能,在处理大体积数据或文件时特别实用。要实现流式上传操作,则只需为请求提供一个类文件对象即可完成

复制代码
 with open('test.txt') as f:

    
     requests.post('https://www.baidu.com/' , data=f)

cookies变量 ,响应包含了cookie使用cookies变量来拿到

复制代码
 import requests

    
  
    
 url = 'https://www.baidu.com/'
    
 r = requests.get(url)
    
 print(r.cookies)

还可以使用 cookies变量来向服务器发送 cookies信息

复制代码
 import requests

    
  
    
 url = 'https://www.baidu.com/'
    
 cookies = dict(.....)
    
 r = requests.get(url , cookies=cookies)

timeout变量,超时配置

注:timeout 仅对连接过程很效,与响应体的下载无关;

即仅约束请求的时间。即使响应中包含大量数据,下载过程会消耗一定时间也不会受到影响;

复制代码
 import requests

    
  
    
 requests.get('https://www.baidu.com/' , timeout=0.001)

会话对象

复制代码
 import requests

    
  
    
 s = requests.Session()
    
 r = s.get('https://www.baidu.com/')

SSL证书验证:

verify参数,verify=False跳过安全证书验证;

复制代码
 import requests

    
  
    
 r = requests.get('https://kyfw.12306.cn/otn/' , verify=False)

代理

proxies参数来配置单个请求;

复制代码
 import requests

    
  
    
 proxies = {
    
     "https":"http://41.118.132.69:4433"
    
 }
    
  
    
 r = requests.post("https://www.baidu.com/" , proxies=proxies)

全部评论 (0)

还没有任何评论哟~