一、概述
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)