案例分析

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

  • 第一步明确需求
  • 抓取指定主题的贴吧数据
  • 第二步网址分析

贴吧首页 https://tieba.baidu.com/index.html python爬虫吧网址 https://tieba.baidu.com/f?ie=utf-8&kw=python%E7%88%AC%E8%99%ABpython 抓包 进excel 工具_json 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%97python 抓包 进excel 工具_数据_02 镇魂街会被转会成%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:///psf/requests
  • 或者打开命令提示符进入py D:\python\requests-master执行命令:python setup.py install 即可