天天看点

爬虫基础--requests的使用

requests模块

作用:发送网络请求,返回响应数据

1.发送一个get请求

import requests

# 目标的url
url = 'https://www.baidu.com'
# 向目标发送get请求,接受返回的数据
response = requests.get(url)

# 打印网页源码
print(response.text)
           

获取网页源码常用的三种方式:

  • response.content.decode()
  • response.content.decode(“GBK”)
  • response.text

response的常用属性:

  • response.text 响应体 str类型
  • respones.content 响应体 bytes类型
  • response.status_code 响应状态码
  • response.request.headers 响应对应的请求头
  • response.headers 响应头
  • response.request.cookies 响应对应请求的cookie
  • response.cookies 响应的cookie(经过了set-cookie动作)
发送带参数的请求
# 请求参数的用法
kw = {'wd':'长城'}  
requests.get(url,params=kw)
# 第二种方法是将参数写在目标url后面
# url = 'https://www.baidu.com/s?wd='长城'
# requests.get(url)
           

2.发送带header的请求

从用户的 headers 进行反爬是最常见的反爬虫策略,相应的解决措施是

把相应的 headers 传输给 python 的 requests,模拟浏览器请求,获取和浏览器一致的内容

# 在header中添加"User-Agent",模拟浏览器请求
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
requests.get(url, headers=headers)
           

3.发送post请求

目标url一定要找准确

传递的参数一定要和浏览器发送的post参数一致

用法:

import requests
import json


def fanyi_baidu():
    # 1.请输入 翻译的内容
    translate_content = input('请输入 翻译的内容:')

    # 2.url
    url = 'http://fy.iciba.com/ajax.php?a=fy'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Mobile Safari/537.36'
    }
    # 3.传递参数
    data = {
        "f": "auto",
        "t": "auto",
        "w": translate_content
    }
    # 4.请求数据
    response = requests.post(url, data=data, headers=headers)

    # 5.输出翻译结果
    # print(response.content.decode())

    # 6. 字符串 转成 字典
    dict_data = json.loads(response.content.decode())

    result = dict_data['content']['word_mean']

    print('翻译的结果是:',result)



if __name__ == '__main__':
   fanyi_baidu()
           

4.使用cookie

作用:

  • 能够访问登录后的页面
  • 能够解决部分反爬手段

使用requests处理cookie有三种方法:

1.cookie字符串放在headers中

headers中的cookie:使用分号(;)隔开,左边的表示cookie的键,右边的表示cookie的值

headers = {
"Cookie":" Pycharm-26c2d973=dbb9b300-2483-478f-9f5a-16ca4580177e; Hm_lvt_98b9d8c2fd6608d564bf2ac2ae642948=1512607763; Pycharm-26c2d974=f645329f-338e-486c-82c2-29e2a0205c74; _xsrf=2|d1a3d8ea|c5b07851cbce048bd5453846445de19d|1522379036"}
           
  1. 把cookie字典放传给请求方法的cookies参数接收
cookies = {"cookie的name":"cookie的value"}
requests.get(url,headers=headers,cookies=cookie_dict}
           

3.用requests提供的session模块

requests 提供了一个叫做session类,来实现客户端和服务端的会话保持

会话保持有两个内涵:

保存cookie,下一次请求会带上前一次的cookie

实现和服务端的长连接,加快请求速度

使用方法\

session = requests.session()
response = session.get(url,headers)
           

session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie

5.使用代理

作用:\

  • 一些网站会根据你的 IP 地址访问的频率,次数进行反爬。解决方法就是构造自己的 IP 代理池,然后每次访问时随机选择代理
  • 防止我们的真实地址被泄露,防止被追究\

请求使用的协议可以分为:

  • http代理
  • https代理
  • socket代理等

不同分类的代理,在使用的时候需要根据抓取网站的协议来选择

# 用法:
proxies = { 
    "http": "http://12.34.56.79:9527", 
    "https": "https://12.34.56.79:9527", 
    }
    
requests.get(url,  proxies = proxies)
           

6.requests中cookirJar的处理方法

使用requests获取的resposne对象,具有cookies属性,能够获取对方服务器设置在本地的cookie

response.cookies是CookieJar类型,使用requests.utils.dict_from_cookiejar,能够实现把cookiejar对象转化为字典

7.requests处理证书错误

解决方案:

添加一个’verify’参数

8.超时参数的使用

在爬虫中,一个请求很久没有结果,就会让整个项目的效率变得非常低,这个时候我们就需要对请求进行强制要求,让他必须在特定的时间内返回结果,否则就报错

超时参数(timeout)使用方法如下:

通过添加timeout参数,能够保证在3秒钟内返回响应,否则会报错

9.retrying模块的使用

retrying 模块的使用

1.使用retrying模块提供的retry模块

2.通过装饰器的方式使用,让被装饰的函数反复执行

3.retry中可以传入参数stop_max_attempt_number,让函数报错后继续重新执行,达到最大执行次数的上限,如果每次都报错,整个函数报错,如果中间有一个成功,程序继续往后执行

from retrying import retry

#最大重试3次,3次全部报错,才会报错
@retry(stop_max_attempt_number=3) 
def parse_url(url)
    #超时的时候会报错并重试
    response = requests.get(url, headers=headers, timeout=3) 
    
    return response