Python爬虫学习 2 —— 使用requests

  学习爬虫最先尝试的是requests模块,requests拥有简便的API,它是最基本的HTTP请求模块,可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样。



一、安装requests库

step1:Windows+ R打开cmd
step2:使用pip快速安装request,输入下面的命令

 pip install requests


二、发送请求

在这里插入图片描述

语法:requests.get(url, params=None, **kwargs)

  • url:拟获取页面的url链接
  • url:url中的额外参数,字典或字节流格式,可选
  • url:12个控制访问的参数

request库中的定义:get()方法调用了request函数,传入’get’参数

def get(url, params=None, **kwargs):
    r"""Sends a GET request.

    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary, list of tuples or bytes to send
        in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    kwargs.setdefault('allow_redirects', True)
    return request('get', url, params=params, **kwargs)


二、response对象

response对象属性

属性说明
r.status_codeHTTP请求返回的状态,200表示连接成功,404表示失败
r.textHTTP响应内容的字符串,即url页面的内容
r.contentHTTP响应内容的二进制形式
r.encording从HTTP header中猜测的内容编码方式
r.apparent_encoding根据内容分析处的响应内容的拜尼马方式(备选编码方式)

例子:使用get函数,返回一个response对象

import requests
url = "https://www.baidu.com"
r = requests.get(url)
print(r.status_code)
print(type(r))
print(r.headers)

输出结果:

200
<class 'requests.models.Response'>
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 15 Aug 2019 02:04:52 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}

***Repl Closed***

response的编码

属性说明
r.encording从HTTP header中猜测的内容编码方式
r.apparent_encoding根据内容分析处的响应内容的拜尼马方式(备选编码方式)

r.encoding:如果HTML代码header中不存再对charset的说明,则默认编码为ISO-8859-1
r.apparent_encoding:根据页面内容分析处的编码方式(一般来说以它为准)

举个栗子

step1:初始代码

import requests
url = "http://www.baidu.com"
r = requests.get(url)
print(r.encoding)
print("content:", r.text)

step2:此时输出内容出现了乱码:

ISO-8859-1 
content: <!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“</title></head>

***Repl Closed***

step3:接着,我们使用r.apparent_encoding来解码:

import requests
url = "http://www.baidu.com"
r = requests.get(url)
print(r.apparent_encoding)
r.encoding = r.apparent_encoding
print("content:", r.text)

step4:此时,就不出现乱码啦

utf-8
content: <!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head>

提示:UTF-8是一种多字节编码,可以表示任何Unicode字符。ISO 8859-1是一个单字节编码,可以代表前256个Unicode字符。两者都以完全相同的方式编码ASCII



三、request库的异常

常见异常分类

异常说明
requests.ConnectionError网络连接错误异常,如DNS擦寻IP失败,服务器拒绝连接等
requests.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
requests.TooManyRedirests超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超时异常


四、爬取网页的通用代码框架

使用try异常处理机制:

import requests

def getHTMLText(url):
	try:
		r = requests.get(url, timeout=20)
		r.raise_for_status() # 若状态码不是200,引发HTTPError异常
		r.encoding = r.apparent_encoding
		return r.text
	except:
		return "Error"

url = "http://www.baidu.com"
text = getHTMLText(url)
print(text)

这里使用了 r.raise_for-status()函数 ,如果状态码 r.status_code 不是200,则会引发异常处理。



五、requests库方法的参数

requests.request(methode, url, kwargs)

1st :params

import requests
kv = {"key1": "value1", "key2": "value2"}
r = requests.request("GET", "http://www.baidu.com", params = kv)
print(r.url)

输出:

http://www.baidu.com/?key1=value1&key2=value2

2nd :data字典/字节序列

import requests
kv = {"key1": "value1", "key2": "value2"}
r = requests.request("POST", "http://www.baidu.com", data = kv)

3rd :JSON格式数据

import requests
kv = {"key1": "value1", "key2": "value2"}
r = requests.request("POST", "http://www.baidu.com", json = kv)

4st :headers字典,HTTP定制头
可以应用于伪装成为浏览器

import requests
hd = {"user-agent": "Chrome/10"}
r = requests.request("POST", "http://www.baidu.com", headers = hd)

5st :timeout,设定超时时间,秒为单位

r = requests.request("GET", "http://www.baidu.com", timeout = 10)

6st :proxies,字典类型,设定访问代理服务器
可以隐藏原IP地址信息,防止被逆追踪

import requests
pxs = {"http": "http://user:pass@10.10.10.1:1234",
	"https": "http://user:pass@10.10.10.1:4321"}
r = requests.request("GET", "http://www.baidu.com", proxies = pxs)
print(r.text)


六、requests库的其他方法

主要的7个方法

requests.request() # 构造一个请求,止程剩下的方法
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.patch('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')

requests.request(method, url, kwargs)

  • method:请求方式,对应get/put/post等7中方式,如:requests.request(‘POST’, url, **kwargs)
  • url:拟获取页面的url连接
  • **kwargs:控制访问的13个参数

head()方法:我们可以根据头部信息来划分网页层次,分不同部分爬取信息

import requests
url = "http://www.baidu.com"
r = requests.get(url)
r.encoding = r.apparent_encoding
print(r.headers)
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 15 Aug 2019 02:59:08 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:36 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}

***Repl Closed***

put()方法

import requests
url = "http://www.baidu.com"
payload = {"key1": "value1", "key2": "value2"}
r = requests.put(url, data = payload)
r.encoding = r.apparent_encoding
print(r.text)


七、响应状态码

通过下面的代码,可以检测响应状态码:

import requests

url = "http://www.baidu.com"
r = requests.get(url)
print(r.status_code)
print(r.status_code == requests.codes.ok)

此时输出:

200
True

  有时候,我们会发送一个错误的请求(一个4XX客户端错误或5XX服务器错误响应),可以通过Response.raise_for_status()来抛出异常:

bad_r = requests.get('http://httpbin.org/status/404')
print(bad_r.status_code)
bad_r.raise_for_status()

此时输出如下:

404
Traceback (most recent call last):
xxxxxxx
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND for url: http://httpbin.org/status/404


八、保存响应内容

我们可以使用文件操作,将响应内容保存到文件中:
如果要将这个网站上的内容保存到本地 http://www.gutenberg.org/cache/epub/1112/pg1112.txt

import requests
 
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')

file_name = 'RomeoAndJuliet.txt'
with open(file_name, 'wb') as file_obj:
	for chunk in res.iter_content(100000):
		file_obj.write(chunk)

注意:必须要用'wb' 模式打开文件
在这里插入图片描述




第二篇python爬虫学习笔记完结啦 cheers ??

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值