爬虫Requests基本使用

爬虫Requests

Requests 库的基本使用
  • 首先安装Requests库
    #打开终端,注意本机的虚拟环境保持和项目环境一致
    pip3 install requests
    
  • 使用requests库进行最基本的下载
    # 下载百度首页,requests库将下载结果封装成response类
    response = requests.get("http://www/baidu.com")
    # dir可以查看类的内部行为方法
    print(dir(response))
    # text 会使用默认的编码方式转换字符串
    print(response.text)
    
  • 将下载内容存入文件
    # with as 能够实现自动清理的条件是相应类必须实现__enter__, __exit__两个魔法方法
    with open('baidu.html', 'w+') as f:
    	#response.content 是bytes类型使用decode方法还原为相应编码的字符串
    	f.write(response.content.decode('utf-8'))
    
乱码是如何产生的
  • 产生乱码的原因: 使用不同字库上的编码序号进行了解码操作
    • 例如:
      b'\xe4\xbd\xa0\xe5\xa5\xbd'在utf-8编码库中对应你好,
      在gbk编码库中对应'浣犲ソ'
      # 字符在字库的编码就是字符在字库的序号
      
回顾HTTP协议
  • 什么是HTTP
    - HTTP是超文本传输协议,具体概念参考HTTP协议
    - 主要用在浏览器和Web服务器之间通信
  • HTTP协议的主要特点
    • 无状态
    • 无连接
    • 支持多种媒体格式
  • HTTP消息格式
    • 请求
    GET /hello.txt?name=jack&age=21 HTTP/1.1
    #请求的方式及请求的文件路径以及http协议版本号
    #后续信息是HTTP协议定义的Key-Value键值对,Key不能乱写,必须符合HTTP协议的要求
    # GET方法没有消息体, 参数通过在url后面缀上问号传递
    User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
    Host: www.example.com
    
    • 响应
    # POST方法含有消息体,消息在消息头后方加空行来传递
    HTTP/1.1 200 OK
    Date: Mon, 27 Jul 2009 12:28:53 GMT
    Server: Apache
    Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
    ETag: "34aa387-d-1568eb00"
    Accept-Ranges: bytes
    Content-Length: 51
    Vary: Accept-Encoding
    Content-Type: text/plain
    //后续内容为消息体,与消息头之间有一个空行。
    <html>
    	<head>
    	</head>
    	<body>
    	</body>
    </html> 
    

示例:使用POST方法实现有道翻译

步骤:

  • 使用火狐打开有道翻译
  • 右键->检查元素
  • 在弹出的调试界面选择网络
  • 找到响应是json类型的地址,一般情况下就是我们的接口地址
  • 选中相应接口地址,点击参数,在表单数据中是我们要提交的数据
  • 分析完接口数据,添加如下代码:
    import json
    import requests
    # 构建POST消息体
    post_data =  {}
    post_data[i] = 'world'
    post_data['doctype'] = json
    
    # 发送POST请求,返回json数据结构的网址称为网络接口或Web Api
    response = requests.post('http://fanyi.youdao.com/translate',data=post_data)
    # 解析返回的json结果
    json_data = json.loads(response.text)
    print("翻译结果是:",json_data['translateResult'][0][0]['tgt'])
    

cookies 和 session

  • 什么是cookies和session
    • 主要是为了解决HTTP协议无连接,无状态的特点,使服务器能够识别用户
    • cookies是保存在客户端的一组识别信息(例如会员卡),session是存在服务器端的数据
    • cookies和session通过sessionid关联
    • 当客户机登录成功后,关闭了相关页面,一段时间之内(没有到超时时间)再次访问相关网页,浏览器会自动携带相应的cookie信息,并发送给服务器(cookies中携带sessionid),服务器检查相应sessionid的超时状态,如果未超时,按照已登录提供服务
    • 使用浏览器cookies实现免登陆
      # Set-Cookie(在响应头中)  服务器发给客户端,用来设置客户端cookie内容
      Cookie(在请求头中) 是客户端发给服务器,用来向服务器表明身份
      **怎么选择:优先使用Set-Cookie,如果Set-Cookie不生效,尝试不同页面的Cookie**
      

实现一个基本的爬虫-贴吧爬虫

第一版代码

按照需求规格说明书的流程写程序,直观的实现,不考虑结构

"""
1.抓取百度贴吧(lol吧)前10页内容(https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0)
2.存入文件
"""
import requests
for i in range(10):
    download_url = "https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn={}".format(i * 50)
    response = requests.get(download_url)
    print(response.text)
    file_name = "{}-第{}页.html".format("lol",i+1)
    with open(file_name,"wb") as f:
        f.write(response.content)
第二版代码

考虑更灵活的参数配置,可以指定贴吧名称及下载页数,按照面向过程的思想实现函数

def download_tieba(tieba_name,page_nums):
    """
    下载指定贴吧的前page_nums页内容
    :param tieba_name: 贴吧名称
    :param page_nums: 要下载多少页
    :return: 无
    """
    for i in range(page_nums):
        download_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}".format(tieba_name,i * 50)
        response = requests.get(download_url)
        print(response.text)
        file_name = "{}-第{}页.html".format(tieba_name, i + 1)
        with open(file_name, "wb") as f:
            f.write(response.content)

download_tieba("python",9)
第三版代码(面向对象的爬虫)
#import requests

class TiebaSpider(object):
    """
    实现下载某个贴吧指定页码前的内容,存储下载内容
    """
    def __init__(self,name,pages):
        """
        初始化方法
        """
        self.tieba_name = name
        self.pages_download = pages
        self.base_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"
        self.header = {"User-Agent": "Python"}

    def make_url_list(self):
        """
        获取待下载的url列表
        :return:返回生成的url列表
        """
        url_lists = []
        for i in range(self.pages_download):
            download_url = self.base_url.format(self.tieba_name, i * 50)
            url_lists.append(download_url)
        return url_lists

    #注意maybe static 警告,怎么消除警告?
    def save_url(self,content,file_name):
        """
        将指定内容进行存储
        :param content:要存储的内容,这里传入的参数要求是二进制
        :param file_name:文件名
        :return:无
        """
        with open(file_name,'wb') as f:
            f.write(content)

    def download_url(self,url_str):
        """
        下载指定url处的内容
        :param url_str: 要下载的地址
        :return: 返回下载的结果
        """
        response = requests.get(url_str,headers=self.header)
        return response.content #content是二进制数据

    def run(self):
        """
        主业务逻辑,使用run后期可以改造成多线程爬虫
        :return:
        """
        url_lists = self.make_url_list()
        for url_str in url_lists:
            result_content = self.download_url(url_str)
            file_name = "{}-第{}页.html".format(self.tieba_name,url_lists.index(url_str)+1)
            self.save_url(result_content,file_name)


tieba_spider = TiebaSpider('Python',9)
tieba_spider.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值