天天看点

python爬虫(一)Requests库

一、概述

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

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

二、爬虫分类

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

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

三、Robots协议

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

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

其实就是爬取网页就是通过HTTP协议访问网页,不过通过浏览器访问往往是人的行为,把这种行为变成使用程序来访问;

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

  1) GET方法,数据是通过URL传递的,也就是说数据是在HTTP报文的header部分;

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

有些网站是反爬虫的,所以要把爬虫伪装成浏览器,使用User-Agent来伪装为浏览器;

五、urllib包

Python2中提供了urllib和urllib2。urllib提供较为底层的接口,urllib2对urllib进行了进一步封装。Python3中将urllib合并到了urllib2中,并更名为标准库urllib包;

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

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

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

3、urllib.parse用于解析url

( 1 )urllib.request模块:该模块定义了在基本和摘要式身份验证、重定向、cookies等应用中打开url(主要是HTTP)的函数和类;

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

1 )urlopen( url,data=None )

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

  data提交的数据,如果data为None发起 GET请求;data不为None发起 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编码,这样就不会有歧义了;后来可以传送中文,同样会做编码,一般先按照字符集的encoding要求转换成字节序列,每一个字节对应的十六进制字符串前加 %百分号即可;

六、urllib3包

标准库urllib缺少了一些关键的功能,非标准库的第三方库urllib3提供了,比如说连接池管理;

(1)安装:$pip install urllib3

七、requests包

requests使用了urllib3,但是API更加友好,推荐使用,爬虫建议使用requests库;

(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格式数据,我们可以使用  json.dumps()把表单数据序列化。

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 仅对连接过程很效,与响应体的下载无关;

也就是说,这个时间只限制请求的时间。即使返回的 response包含很大内容,下载需要一定时间,也并不影响;

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)