案例分析
使用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
- 接下来我们再来分析随着页数的变化url的变化规律
-
第三步确定并准备不变的数据
# 通过上面的分析我们可以知道,变化的数据是主题和页码,这一块我们可以通过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 即可