get案例
需求:爬取贴吧数据
- 输入要爬取的贴吧主题
- 输入起始页和终止页
- 把每一页的数据保存到本地(例如 第一页.html 第二页.html)
分析:
url里面kw对应的是贴吧的主题,pn和页数有关,其余部分没有变化
# 贴吧每一页的url分析
'''
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&pn=0 第一页
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&pn=50 第二页
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&pn=100 第三页
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&pn=150 第四页
'''
pn = (page - 1) * 50
发起请求 -> 获得数据 ->保存数据
import urllib.request
import urllib.parse
class BaiduSpider:
def __init__(self):
self.headers = {
'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'
}
self.base_url = 'https://tieba.baidu.com/f?'
def readPage(self,url):
req = urllib.request.Request(url, headers=self.headers)
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
return html
def writePage(self,filename,html):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
def main(self):
name = input('输入贴吧名称:')
begin = int(input('输入起始页:'))
end = int(input('输入终止页:'))
kw = {'kw': name}
result = urllib.parse.urlencode(kw)
for i in range(begin, end + 1):
pn = (i - 1) * 50
url = self.base_url + result + '&pn=' + str(pn)
# 调用函数
html = self.readPage(url)
filename = '第' + str(i) + '页.html'
self.writePage(filename, html)
if __name__ == '__main__':
spider = BaiduSpider()
spider.main()
post案例
有道翻译
- 请求的url地址 用post发送数据给服务器
http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule
传递form data 里面的数据
解析数据 得到翻译的结果
import urllib.request
import urllib.parse
import json
# 输入内容
content = input('请输入您要翻译的内容:')
# 获取form data 里面的数据
data = {
'i': content,
'from': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15880623642174',
'sign': 'c6c2e897040e6cbde00cd04589e71d4e',
'ts': '1588062364217',
'bv': '42160534cfa82a6884077598362bbc9d',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
data = urllib.parse.urlencode(data)
data = bytes(data, 'utf-8')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers = {
'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 '
}
req = urllib.request.Request(url, data=data, headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
r_dict = json.loads(html)
r = r_dict['translateResult'] # [[{'src': 'age', 'tgt': '年龄'}]]
result = r[0][0]['tgt']
print(result)
'''
{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 1, 'translateResult': [[{'src': 'age', 'tgt': '年龄'}]]}
'''
有道翻译返回的数据是一个字符串:
'{'type': 'EN2ZH_CN', 'errorCode': 0, 'elapsedTime': 1, 'translateResult': [[{'src': 'age', 'tgt': '年龄'}]]}'
解析这个字符串,获取翻译结果
requests
- 安装
pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple requests
- 重写有道翻译的案例
import requests
content = input('请输入您要翻译的内容:')
data = {
'i': content,
'from': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15880623642174',
'sign': 'c6c2e897040e6cbde00cd04589e71d4e',
'ts': '1588062364217',
'bv': '42160534cfa82a6884077598362bbc9d',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
headers = {
'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 '
}
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
res = requests.post(url, data=data, headers=headers)
html = res.text()
print(html)