爬虫是一种自动化的网络数据采集工具,它可以自动访问网页并提取所需的信息。在Python中,requests是一个非常流行的HTTP库,用于发送各种HTTP请求。
requests
是一个用Python编写的简单易用的HTTP库,它允许你发送各种HTTP请求来与Web服务进行交互。以下是requests
库的一些关键特点和概述:
-
简单易用:
requests
的API设计简洁直观,使得发送HTTP请求变得非常简单。 -
支持多种请求类型:可以发送GET、POST、PUT、DELETE等HTTP请求。
-
自动处理Cookies:自动处理请求中的Cookies,无需手动处理。
-
自动解码内容:自动解码来自服务器的响应内容,例如将gzip压缩的内容解码为原始HTML。
-
JSON支持:内置对JSON的便捷支持,可以直接将JSON响应解析为Python字典。
-
Session对象:可以使用
requests.Session
对象来保持某些参数和Cookie跨请求保持不变。 -
连接保持活动:支持连接保持活动,适用于发送多个请求到同一主机。
-
流式上传和下载:支持请求和响应的流式传输,适合处理大文件。
-
Multipart文件上传:支持上传文件,可以发送multipart/form-data类型的POST请求。
-
异常处理:提供异常类,可以捕获并处理请求过程中的错误。
-
SSL/TLS支持:支持HTTPS请求,可以验证服务器SSL证书。
-
国际化域名和URL:支持国际化域名(IDN)和URL。
-
自定义请求头:可以自定义请求头,例如User-Agent、Accept等。
-
代理支持:可以设置代理,用于发送请求。
-
超时设置:可以设置请求的超时时间。
-
重试机制:可以设置重试策略,自动重试失败的请求。
-
会话持久化:可以持久化Session的状态,用于保持登录状态或Cookies。
以下是使用 requests库进行基础爬虫操作的一些步骤:
1. 安装requests库:
如果你还没有安装`requests`库,可以通过pip安装:
pip install requests
2. 发送HTTP请求:
使用`requests.get`方法可以发送一个GET请求到指定的URL。
import requests
response = requests.get('http://example.com')
3. 检查响应状态码:
检查HTTP响应的状态码,以确认请求是否成功。
status_code = response.status_code
print('Status Code:', status_code)
4. 获取响应内容:
使用`response.text`获取响应的文本内容,通常是HTML。
html_content = response.text
5. 解析HTML内容:
使用HTML解析库如`BeautifulSoup`来解析HTML内容,并提取你需要的数据。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
6. 提取数据:
使用`BeautifulSoup`的查找方法,如`find`或`find_all`,来提取特定的HTML元素。
title = soup.find('title').get_text()
print('Title:', title)
注意:
find 方法
find
方法用来查找文档中第一个匹配的元素。- 如果找到了匹配的元素,它将返回一个Tag对象;如果没有找到,它将返回
None
。 find
方法只返回一个元素,即使文档中有多个元素符合搜索条件。
用法示例:
from bs4 import BeautifulSoup
html_doc = "<html><head><title>The Dormouse's story</title></head><body><p class='title'><b>The Dormouse's story</b></p></body></html>"
soup = BeautifulSoup(html_doc, 'html.parser')
# 查找第一个<title>标签
title_tag = soup.find('title')
print(title_tag) # 输出: <title>The Dormouse's story</title>
findall 方法
findall
方法用来查找文档中所有匹配的元素。- 它返回一个列表,包含所有匹配的Tag对象。
- 如果没有找到任何元素,它将返回一个空列表。
用法示例:
from bs4 import BeautifulSoup
html_doc = "<html><body><p class='story'>Once upon a time there were three little sisters; and their names were...</p><p class='story'>...</p></body></html>"
soup = BeautifulSoup(html_doc, 'html.parser')
# 查找所有<p>标签
paragraphs = soup.findall('p')
for p in paragraphs:
print(p) # 输出: <p class="story">Once upon a time there were three little sisters; and their names were...</p>
# <p class="story">...</p>
区别
- 返回类型:
find
返回单个元素或None
,而findall
返回所有匹配元素的列表。 - 使用场景:当你只需要文档中的一个元素时,使用
find
;当你需要所有匹配的元素时,使用findall
。 - 性能考虑:在某些情况下,如果只关心第一个匹配元素,使用
find
可能更高效,因为它在找到第一个匹配项后就会停止搜索。
在实际使用中,你可以根据需要选择使用find
或findall
。例如,如果你知道文档中只有一个<title>
标签,使用find
就足够了。但如果你想要获取所有的<p>
标签,就需要使用findall
。
7. 发送POST请求:
如果需要,也可以使用`requests.post`方法发送POST请求。
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('http://example.com', data=payload)
8. 处理Cookies:
有时需要处理cookies,可以使用`response.cookies`来访问。
cookies = response.cookies
9. 设置请求头:
为了模拟浏览器行为,可能需要设置请求头,如User-Agent。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get('http://example.com', headers=headers)
10.自动识别响应体编码
response = requests.get(url)
response.encoding = reponse.apparent_encoding #识别响应体编码
11. 异常处理:
使用`try-except`语句来处理请求过程中可能出现的异常。
try:
response = requests.get('http://example.com')
response.raise_for_status()
except requests.exceptions.HTTPError as err:
print(err)
在使用 `requests` 模块发送HTTP请求时,可以通过关键字参数来定制请求的各个方面。以下是一些常用的关键字参数及其说明:
1. url:
- 指定请求的URL。
2. method:
- 指定请求的方法,默认为`GET`。可以是`GET`、`POST`、`PUT`、`DELETE`等。
3. data:
- 用于发送POST请求的数据,通常是一个字典或字节序列。
4. json:
- 将字典编码为JSON字符串并发送。如果指定了`json`,`content-type`会自动设置为`application/json`。
5. headers:
- 一个字典,包含要发送的HTTP头。
6. cookies:
- 一个字典或`RequestsCookieJar`对象,包含要发送的cookies。
7. files:
- 用于上传文件,通常是一个字典,其中键是文件名,值是文件对象。
8. params:
- 用于发送GET或POST请求的查询字符串参数,通常是一个字典。
9. auth:
- 用于HTTP基本认证的元组,包含用户名和密码。
10. timeout:
- 请求的超时时间,可以是一个数字或元组(连接超时,读取超时)。
11.allow_redirects:
- 是否允许重定向,默认为`True`。
12. proxies:
- 用于设置代理的字典。
13. verify:
- 是否验证SSL证书,默认为`True`。设置为`False`可以忽略SSL证书验证。
14. stream:
- 是否以流的形式下载响应内容,默认为`False`。
15. cert:
- 客户端SSL证书的路径,可以是一个文件路径或元组。
16. **`hooks`**:
- 一个字典,包含可以被调用的函数,用于处理请求和响应。
17. prefetch:
- 是否预读取响应内容,默认为`False`。
18. decompress:
- 是否自动解压缩响应内容,默认为`True`。
19. session:
- 一个`requests.Session`对象,用于保持请求的会话状态。
示例代码
import requests
# 发送GET请求
response = requests.get('https://example.com', params={'key': 'value'})
# 发送POST请求
response = requests.post('https://example.com', data={'key': 'value'})
# 发送POST请求并发送JSON数据
response = requests.post('https://example.com', json={'key': 'value'})
# 设置请求头
headers = {'User-Agent': 'My User Agent'}
response = requests.get('https://example.com', headers=headers)
# 使用代理
proxies = {'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080'}
response = requests.get('https://example.com', proxies=proxies)
# 忽略SSL证书验证
response = requests.get('https://example.com', verify=False)
请注意,爬虫应该遵守目标网站的`robots.txt`文件规定,尊重版权和隐私政策,不要对网站服务器造成过大压力。此外,一些网站可能需要更复杂的技术,如处理JavaScript渲染、使用代理等,以绕过反爬虫机制。