爬虫的基本原理:爬虫本质上是模拟人浏览信息的过程,只不过他通过计算机来达到快速抓取筛选信息的目的。所以我们想要写一个爬虫,最基本的就是要将我们需要抓取信息的网页原原本本的抓取下来。这个时候就要用到requests库了。
1、requests的安装
requests库本质上就是模拟了我们用浏览器打开一个网页,发起请求是的动作。它能够迅速的把请求的html源文件保存到本地。
requests安装比较简单,pip install requests
2、requests的使用
开始要导入 Requests 模块:
1 import requests
然后,尝试获取某个网页。
1 r = requests.get('https://douban.com')
现在,有一个名为 r
的Response 对象。可以从这个对象中获取所有我们想要的信息。
Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的。例如,你可以这样发送一个 HTTP POST 请求:
1 r = requests.post("http://httpbin.org/post")
其他 HTTP 请求类型:PUT,DELETE,HEAD 以及 OPTIONS
1 r = requests.put("http://httpbin.org/put") 2 r = requests.delete("http://httpbin.org/delete") 3 r = requests.head("http://httpbin.org/get") 4 r = requests.options("http://httpbin.org/get")
传递 URL 参数
requests.get(url,params=None,**kwargs)方法
1 #这个方法可以接收三个参数,其中第二个默认为None 第三个可选 2 def get(url, params=None, **kwargs) 3 #作用是模拟发起GET请求 4 Sends a GET request. 5 #模拟获取页面的url链接 6 :param url: URL for the new :class:Request object. 7 #额外参数 字典或字节流格式,可选 8 :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:Request. 9 # 十二个控制访问参数,比如可以自定义header 10 :param **kwargs: Optional arguments that request takes. 11 # 返回一个Response对象 12 :return: :class:Response <Response> object 13 :type: requests.Response
下面着重讲一下 **kwargs 这个参数
kwargs: 控制访问的参数,均为可选项 params : 字典或字节序列,作为参数增加到url中 data : 字典、字节序列或文件对象,作为Request的内容 json : JSON格式的数据,作为Request的内容 headers : 字典,HTTP定制头 cookies : 字典或CookieJar,Request中的cookie auth : 元组,支持HTTP认证功能 files : 字典类型,传输文件 timeout : 设定超时时间,秒为单位 proxies : 字典类型,设定访问代理服务器,可以增加登录认证 allow_redirects : True/False,默认为True,重定向开关 stream : True/False,默认为True,获取内容立即下载开关 verify : True/False,默认为True,认证SSL证书开关 cert : 本地SSL证书路径 url: 拟更新页面的url链接 data: 字典、字节序列或文件,Request的内容 json: JSON格式的数据,Request的内容
例如:
1 payload = {'key1': 'value1', 'key2': 'value2'} 2 r = requests.get("http://httpbin.org/get", params=payload) 3 4 #结果 5 print(r.url) 6 http://httpbin.org/get?key2=value2&key1=value1
注意字典里值为 None
的键都不会被添加到 URL 的查询字符串里。
还可以将一个列表作为值传入:
1 payload = {'key1': 'value1', 'key2': ['value2', 'value3']} 2 3 r = requests.get('http://httpbin.org/get', params=payload) 4 print(r.url) 5 http://httpbin.org/get?key1=value1&key2=value2&key2=value3
响应内容:
我们能读取服务器响应的内容。
requests.Response
- status_code状态码
- headers应答的http头
- json应答的json数据
- text应答的Unicode编码的文本
- content应答的字节流数据
- cookies应答的cookies.自动处理。
常用的两个控制访问参数:
a. 假设我们需要在GET请求里自定义一个header头文件:
1 import requests 2 3 hd = {'User-agent':'123'} 4 r = requests.get('http://www.baidu.com', headers=hd) 5 print(r.request.headers) 6 ''' 7 OUT: 8 {'User-agent': '123', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive 9 '} 10 '''
b. 假设我们要自定义一个代理池
1 pxs = { 'http': 'http://user:pass@10.10.10.1:1234', 2 'https': 'https://10.10.10.1:4321' } 3 r = requests.get('http://www.baidu.com', proxies=pxs)
3、requests抓取网页的通用框架
1 import requests 2 3 def getHtmlText(url): 4 try: 5 r = requests.get(url, timeout=30) 6 # 如果状态码不是200 则应发HTTOError异常 7 r.raise_for_status() 8 # 设置正确的编码方式 9 r.encoding = r.apparent_encoding 10 return r.text 11 except: 12 return "Something Wrong!"