爬虫基础- requests

爬虫是一种自动化的网络数据采集工具,它可以自动访问网页并提取所需的信息。在Python中,requests是一个非常流行的HTTP库,用于发送各种HTTP请求。

requests 是一个用Python编写的简单易用的HTTP库,它允许你发送各种HTTP请求来与Web服务进行交互。以下是requests库的一些关键特点和概述:

  1. 简单易用requests 的API设计简洁直观,使得发送HTTP请求变得非常简单。

  2. 支持多种请求类型:可以发送GET、POST、PUT、DELETE等HTTP请求。

  3. 自动处理Cookies:自动处理请求中的Cookies,无需手动处理。

  4. 自动解码内容:自动解码来自服务器的响应内容,例如将gzip压缩的内容解码为原始HTML。

  5. JSON支持:内置对JSON的便捷支持,可以直接将JSON响应解析为Python字典。

  6. Session对象:可以使用requests.Session对象来保持某些参数和Cookie跨请求保持不变。

  7. 连接保持活动:支持连接保持活动,适用于发送多个请求到同一主机。

  8. 流式上传和下载:支持请求和响应的流式传输,适合处理大文件。

  9. Multipart文件上传:支持上传文件,可以发送multipart/form-data类型的POST请求。

  10. 异常处理:提供异常类,可以捕获并处理请求过程中的错误。

  11. SSL/TLS支持:支持HTTPS请求,可以验证服务器SSL证书。

  12. 国际化域名和URL:支持国际化域名(IDN)和URL。

  13. 自定义请求头:可以自定义请求头,例如User-Agent、Accept等。

  14. 代理支持:可以设置代理,用于发送请求。

  15. 超时设置:可以设置请求的超时时间。

  16. 重试机制:可以设置重试策略,自动重试失败的请求。

  17. 会话持久化:可以持久化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可能更高效,因为它在找到第一个匹配项后就会停止搜索。

在实际使用中,你可以根据需要选择使用findfindall。例如,如果你知道文档中只有一个<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渲染、使用代理等,以绕过反爬虫机制。

  • 52
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值