聊聊python内置抓包urllib的get与post案例分析与requests库的简单应用

案例分析

使用get请求爬取百度贴吧信息

  • 第一步明确需求

    • 抓取指定主题的贴吧数据
  • 第二步网址分析

    贴吧首页
    https://tieba.baidu.com/index.html
    python爬虫吧网址
    https://tieba.baidu.com/f?ie=utf-8&kw=python%E7%88%AC%E8%99%AB
    在这里插入图片描述
    python爬虫会被转换成python%E7%88%AC%E8%99%AB
    镇魂街吧网址
    https://tieba.baidu.com/f?ie=utf-8&kw=%E9%95%87%E9%AD%82%E8%A1%97
    在这里插入图片描述
    镇魂街会被转会成%E9%95%87%E9%AD%82%E8%A1%97
    这个转换很明显我们可以通过上一节说到的urllib.parse.urlencode()来完成
    通过对比我们就可以知道百度贴吧的每一个吧首页的网址就是
    https://tieba.baidu.com/f?ie=utf-8&kw=(贴吧主题经过编码转换后的形式)

    • 接下来我们再来分析随着页数的变化url的变化规律
      # 我们首先就以爱情公寓吧为例
      # 爱情公寓吧首页网址:
      https://tieba.baidu.com/f?ie=utf-8&kw=%E7%88%B1%E6%83%85%E5%85%AC%E5%AF%93&fr=search
      # 或者是
      https://tieba.baidu.com/f?kw=%E7%88%B1%E6%83%85%E5%85%AC%E5%AF%93&ie=utf-8&pn=0
      # 爱情公寓吧第二页网址:
      https://tieba.baidu.com/f?kw=%E7%88%B1%E6%83%85%E5%85%AC%E5%AF%93&ie=utf-8&pn=50
      # 爱情公寓吧第三页网址:
      https://tieba.baidu.com/f?kw=%E7%88%B1%E6%83%85%E5%85%AC%E5%AF%93&ie=utf-8&pn=100
      # 爱情公寓吧第四页网址:
      https://tieba.baidu.com/f?kw=%E7%88%B1%E6%83%85%E5%85%AC%E5%AF%93&ie=utf-8&pn=150
      # 爱情公寓吧第五页网址:
      https://tieba.baidu.com/f?kw=%E7%88%B1%E6%83%85%E5%85%AC%E5%AF%93&ie=utf-8&pn=200
      # 我们可以明白随着页数的增加,pn后面的数值是以50递增的,即第i页的pn=(i-1)*50
      
      
    • 所以完整的贴吧网址就是:https://tieba.baidu.com/f?ie=utf-8&kw=(贴吧主题经过编码转换后的形式)&ie=utf-8&pn=(页数-1)*50
    • 我们也要找到User-Agent
      在这里插入图片描述
  • 第三步确定并准备不变的数据

    # 通过上面的分析我们可以知道,变化的数据是主题和页码,这一块我们可以通过input()函数让用户输入。所以我们对不变化的数据的处理就是:
    url_1 = 'https://tieba.baidu.com/f?ie=utf-8&'
    url_2 = '&ie=utf-8&pn='
    hea = {
    	'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57'
    }
    
  • 第四步确定并准备可输入变化数据

    # 在这一步中我们需要注意变化的部分是用input()函数以字符串的形式输入的
    key = input('请输入你所想要搜索的主题:')
    kw_1 = {'kw':key}
    # kw数据需要经过urllib.parse.urlencode()处理
    kw = urllib.parse.urlencode(kw_1)
    begin_page = input('请输入起始页页码:')
    end_page = input('请输入终止页页码:')
    # 变化的页码可以通过for函数来实现,但是要注意使用range()函数时我们要将页码用int()函数转换成int类型,终止页页码需要+1,之后可以确定文件名
    file_name = key+'吧第'+(页码的字符串形式)+'页.html'
    
  • 第五步向网址发起请求、抓取数据并保存

    import urllib.request
    import urllib.parse
    for i in range(int(begin_page),int(end_page)+1):
    	# 拼接完整的url
    	url = url_1+kw+url_2+str(i)
    	# 向url发起请求
    	requ = urllib.request.Request(url,headers=hea)
    	req = urllib.request.urlopen(requ)
    	# 抓取已请求的url的数据
    	res = req.read().decode('utf-8')
    	# 确定文件的页码
    	file_name = key+'吧第'+str(i)+'页.html'
    	# 打开文件写入内容并保存
    	with open(file_name,'w',encoding='utf-8') as f:
    		f.write(res)
    	print(file_name+'已成功保存!!!')
    
  • 第六步优化代码

    • 我们可以将打开文件的做成一个函数,写入文件的的做成一个函数,主要信息做成一个函数,这样就变成了调用函数就简单多了
    import urllib.request
    import urllib.parse
    
    
    
    # 定义函数writepage来写入数据并保存
    def writepage(file_name,res):
        with open(file_name, 'w', encoding='utf-8') as f:
            f.write(res)
        print(file_name + '已成功保存!!!')
    
        pass
    
    # 定义函数readpage向服务器发起请求并抓取数据
    def readpage(url):
        hea = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57'
        }
        # 向url发起请求
        requ = urllib.request.Request(url, headers=hea)
        req = urllib.request.urlopen(requ)
        # 抓取已请求的url的数据
        res = req.read().decode('utf-8')
        return res
        pass
    
    # 主函数需要调用抓取函数与写入函数
    def main():
        # 在这一步中我们需要注意变化的部分是用input()函数以字符串的形式输入的
        key = input('请输入你所想要搜索的主题:')
        begin_page = input('请输入起始页页码:')
        end_page = input('请输入终止页页码:')
        kw_1 = {'kw': key}
        # kw数据需要经过urllib.parse.urlencode()处理
        kw = urllib.parse.urlencode(kw_1)
        # 通过上面的分析我们可以知道,变化的数据是主题和页码,这一块我们可以通过input()函数让用户输入。所以我们对不变化的数据的处理就是:
        url_1 = 'https://tieba.baidu.com/f?ie=utf-8&'
        url_2 = '&ie=utf-8&pn='
    
        for i in range(int(begin_page), int(end_page) + 1):
            # 拼接完整的url
            url = url_1 + kw + url_2 + str(i)
            # 调用readpage函数
            rea = readpage(url)
            # 确定文件的页码
            file_name = key + '吧第' + str(i) + '页.html'
            # 调用writepage函数
            writepage(file_name, rea)
            
        pass
    
    if __name__ == '__main__':
        try:
            main()
        except:
            print('你的程序出现bug了!!!')
        pass
    

使用post请求爬取有道翻译信息

  • 第一步明确需求

    • post请求与get请求不同的就在于我们需要在请求的同时带入信息,才能得到响应
    • 我们的需求就是发出带有准确信息的请求并抓取响应的数据
  • 第二步信息携带对象分析
    在这里插入图片描述
    像 post请求网站难度不在于网址的规律而在于对于数据安放对象的查找
    在这里插入图片描述
    通过查找我们很明显可以发现它多了一个form data模块,在这里面我们可以传递参数信息

  • 第三步确定并准备不变的数据

    # 在这个网站里面我们发现怎样发起请求其网址都不会发送变化
    # 所以这个网址也是不会改变的的数据
    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    
    # User-Agent主要的我们自己的设备与端口的信息,只要我们的设备和网络没有发生变化就不会发生变化
    hea = {
    		'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57'
    	}
    
    # form里面的信息我们通过实验可以发现i的信息会发生变化所以我们可以将i的内容赋予一个变量来放置
    data = {
        'i': key,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': '16076914228723',
        'sign': 'ee146b04c976386283c963b3f5784e18',
        'lts': '1607691422872',
        'bv': '918d54fa64657a1f6596d831b57344f4',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME'
    }
    
    
  • 第四步确定并准备可输入变化数据

    # 通过分析我们发现只有i的数据会发生变化,这也就是携带我们发送的参数的容器
    key = input('请输入你所要翻译的信息:')
    # data需要经过处理才能被携带
    data = urllib.parse.urlencode(data)
    
    
  • 第五步向网址发起请求、抓取数据

    import urllib.parse
    import urllib.request
    import json
    pos = urllib.request.Request(url, data=data, headers=hea)
    po = urllib.request.urlopen(pos)
    p = po.read().decode('utf-8')
    # 我们还需要通过json模块来处理p的结果来清晰的获取响应的信息
    p_dict = json.loads(p)
    end = p_dict['translateResult']
    en = end[0][0]['tgt']
    print(en)
    
  • 第六步优化代码

    • 我们可以使用定义类的方式来优化代码
    import json
    import urllib.parse
    import urllib.request
    
    class main:
        def __init__(self):
            self.url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
            self.hea = {
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57'
            }
            self.key = input('请输入你所想要翻译的内容:')
            pass
    
        def fa(self):
            data = {
                'i': self.key,
                'from': 'AUTO',
                'to': 'AUTO',
                'smartresult': 'dict',
                'client': 'fanyideskweb',
                'salt': '16076914228723',
                'sign': 'ee146b04c976386283c963b3f5784e18',
                'lts': '1607691422872',
                'bv': '918d54fa64657a1f6596d831b57344f4',
                'doctype': 'json',
                'version': '2.1',
                'keyfrom': 'fanyi.web',
                'action': 'FY_BY_REALTlME'
            }
            data = urllib.parse.urlencode(data)
            data = bytes(data, 'utf-8')
            pos = urllib.request.Request(self.url, data=data, headers=self.hea)
            po = urllib.request.urlopen(pos)
            p = po.read().decode('utf-8')
            return p
            pass
    
        def shou(self,p):
            p_dict = json.loads(p)
            end = p_dict['translateResult']
            en = end[0][0]['tgt']
            print(en)
            pass
    
        def main(self):
            f = self.fa()
            self.shou(f)
            pass
    
        pass
    
    if __name__ == '__main__':
        m = main()
        m.main()
        pass
    

requests库的简单应用

requests库的快速入门(对上述两个做法的重现)

	import requests
	
	hea = {
	  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57'
	}
	# 发起get请求以获得响应
	res = requests.get('https://www.cn3k5.com/102/102755/', headers=hea)
	
	print(res)
	# 字符串的数据  requests模块将从网站中获取得到数据解码得到的数据 但是可能会存在乱码
	print(res.text)
	# 字节流的数据  直接从网站获取的数据  无任何处理
	print(res.content)
	print(res.content.decode('gbk'))
	res.encoding = 'gbk'
	print(res.status_code)
	print(res.url)
	
	import json
	# 输入内容
	content = input('请输入您想要翻译的内容:')
	# 获取form date里面的数据
	data = {
	    'i': content,
	    'from': 'AUTO',
	    'to': 'AUTO',
	    'smartresult': 'dict',
	    'client': 'fanyideskweb',
	    'salt': '16076914228723',
	    'sign': 'ee146b04c976386283c963b3f5784e18',
	    'lts': '1607691422872',
	    'bv': '918d54fa64657a1f6596d831b57344f4',
	    'doctype': 'json',
	    'version': '2.1',
	    'keyfrom': 'fanyi.web',
	    'action': 'FY_BY_REALTlME'
	}
	
	hea = {
	    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.57'
	}
	url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
	res = requests.post(url, data=data, headers=hea)
	html = res.text
	print(json.loads(html)['translateResult'][0][0]['tgt'])

reqursts库的源码的下载地址

  • 为什么要下载源码?
    • 了解底层实现原理
    • 了解优秀的框架/代码是如何编写出来
    • 练习英文
    • 提供思路 提供解决方案
    • 程序员最基本的素养 企业开发的要求
  • 下载地址:https://github.com/psf/requests
  • 或者打开命令提示符进入py D:\python\requests-master执行命令:python setup.py install 即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值