爬虫请求模块
百度贴吧练习
方法一
需求:
1.输入要爬取的贴吧主题
2.输入爬取的起始页和终止页
3.把每页的内容保存到本地html文件
#分析
#https://tieba.baidu.com/f?kw=%E8%AE%B8%E5%87%AF&ie=utf-8&pn=0 第一页
#https://tieba.baidu.com/f?kw=%E8%AE%B8%E5%87%AF&ie=utf-8&pn=50 第二页
#https://tieba.baidu.com/f?kw=%E8%AE%B8%E5%87%AF&ie=utf-8&pn=100 第三页
#https://tieba.baidu.com/f?kw=%E8%AE%B8%E5%87%AF&ie=utf-8&pn=150 第四页
#pn=(当前页数-1)*50,kw 贴吧的主题
import random
import urllib.request
import urllib.parse
#随机获取一个User-Agent
headers_list=[{'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'},{'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}]
headers=random.choice(headers_list)
print(headers)
name=input('请输入贴吧名:')
start=int(input('请输入起始页:'))
end=int(input('请输入结束页'))
#对贴吧名name做个编码
kw={'kw':name}
kw=urllib.parse.urlencode(kw)
#开始拼接url 发起请求 获取响应
for i in range(start,end+1):
#开始拼接url
pn=(i-1)*50
baseurl='https://tieba.baidu.com/f?'
url=baseurl+kw+'&pn='+str(pn)
#发起请求
req=urllib.request.Request(url,headers=headers)
res=urllib.request.urlopen(req)
html=res.read().decode('utf-8')
#写入文件
filename='第'+str(i)+'页.html'
with open(filename,'w',encoding='utf-8')as f:
print('正在爬取%d页'%i)
f.write(html)
我们在控制台输入自己要爬取的贴吧主题
爬取完之后我们可以看到创建了3个html文件
我们打开这三个文件就能看见爬取的内容
方法二:用函数来实现
import urllib.request
import urllib.parse
#读取页面
def readPage(url):
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
#发起请求 获取响应
req = urllib.request.Request(url, headers=headers)
res=urllib.request.urlopen(req)
html=res.read().decode('utf-8')
return html
#写入文件
def writePage(filename,html):
with open(filename, 'w', encoding='utf-8')as f:
f.write(html)
print('写入成功')
#主函数
def main():
name=input('请输入贴吧名:')
start=int(input('请输入起始页:'))
end=int(input('请输入结束页:'))
#对贴吧名name做个编码
kw={'kw':name}
kw=urllib.parse.urlencode(kw)
for i in range(start,end+1):
#开始拼接url
pn=(i-1)*50
baseurl='https://tieba.baidu.com/f?'
url=baseurl+kw+'&pn='+str(pn)
html=readPage(url)
filename = '第' + str(i) + '页.html'
writePage(filename,html)
if __name__=='__main__':
main()
同样的方法在控制台输入自己要爬取的贴吧主题,爬取成功后能看见创建了3个html文件。
方法三:通过类来实现
import random
import urllib.request
import urllib.parse
class BaiduSpier:
def __init__(self):
#把常用的不变的放到init方法里面
headers_list = [{
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'},
{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}]
self.headers=random.choice(headers_list)
self.baseurl = '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)
print('写入成功')
def main(self):
name = input('请输入贴吧名:')
start=int(input('请输入起始页:'))
end=int(input('请输入结束页:'))
#对贴吧名name做个编码
kw={'kw':name}
kw=urllib.parse.urlencode(kw)
for i in range(start,end+1):
#开始拼接url
pn=(i-1)*50
url=self.baseurl+kw+'&pn='+str(pn)
html=self.readPage(url) #self指的是spider(谁调用,self指的就是谁)
filename = '第' + str(i) + '页.html'
self.writePage(filename,html)
if __name__=='__main__':
#创建类的实例
spider=BaiduSpier()
spider.main()
请求方式
get:查询参数在URL 在地址中显示
post: 在Request方法中添加data参数 urllib.request.Request(url,data=data,headers=headers)
data:表单数据以bytes类型提交,不能是str(必须是字节流数据)
制作一个有道翻译小软件
首先我们需要在有道翻译页面右击检查一下然后找着下面的数据
同样可以看到翻译需要的这个url
#需求:制作一个有道翻译小软件
import urllib.request
import urllib.parse
import json
#请输入要翻译的内容
key=input('请输入要翻译的内容:')
#把提交的form表单数据转换为bytes类型数据
data={
'i': key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15948037115488',
'sign': 'a07392d4aefc2bf19c2c769ae291d140',
'ts': '1594803711548',
'bv': 'd284931f15d55466f9e8224f2c11d7fe',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
data=urllib.parse.urlencode(data)
#把data数据转换成字节流数据
data=bytes(data,'utf-8')
#发起请求 获取响应
#url需要去掉_o
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
req=urllib.request.Request(url,data=data,headers=headers)
res=urllib.request.urlopen(req)
html=res.read().decode('utf-8')
#把json类型的字符串转换成字典
r_dict=json.loads(html)
r=r_dict['translateResult']
content=r[0][0]['tgt'] #一步一步将要的内容取出来
print(content)
然后我们就可以输入想要翻译的内容进行翻译了
requests模块
requests常用方法:requests.get(网址)
响应对象response的方法
response.text 返回unicode格式的数据(str)
response.content 返回字节流数据(二进制)
response.content.decode(‘utf-8’) 手动进行解码
response.encode()=‘编码’
import requests
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
wd={'wd':'许凯'}
#发起请求
response=requests.get('https://www.baidu.com/s?',params=wd,headers=headers)
#获取响应对象
print(response.text) #返回的是str
print(response.content) #返回字节流数据 (bytes)
print(response.url) #返回请求的url
我们分别执行他们就能有下面的结果
import requests
res=requests.get('https://baike.baidu.com/item/%E8%AE%B8%E5%87%AF/20580848?fr=aladdin')
print(res.text) #有乱码 他是先以res.content拿到数据通过某种方式解码,所以可能出现某种错误,就出现了乱码
所以我们可以手动的解码
import requests
res=requests.get('https://baike.baidu.com/item/%E8%AE%B8%E5%87%AF/20580848?fr=aladdin')
print(res.content.decode('utf-8'))#字符串
我们还可以这样
import requests
res=requests.get('https://baike.baidu.com/item/%E8%AE%B8%E5%87%AF/20580848?fr=aladdin')
res.encoding='utf-8'
print(res.text)
同样可以正常输出
request模块发送post请求
我们同样可以做一个有道翻译小软件
import requests
import json
key=input('请输入内容:')
data={
'i': key,
'from': 'en',
'to': 'zh-CHS',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15948080021988',
'sign': 'a10336465db22e5be5b433a7786f0dc6',
'ts': '1594808002198',
'bv': 'd284931f15d55466f9e8224f2c11d7fe',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
res=requests.post(url,data=data,headers=headers)
res.encoding='utf-8'
html=res.text
r_dict=json.loads(html)
r=r_dict['translateResult']
content=r[0][0]['tgt']
print(content)
处理不信任的SSL证书
https://inv-veri.chinatax.gov.cn/这个网址是其他浏览器打不开的
import requests
url='https://inv-veri.chinatax.gov.cn/'
res=requests.get(url)
print(res.text)
所以直接这样就会报错
我们只要稍微改一下就好
import requests
url='https://inv-veri.chinatax.gov.cn/'
res=requests.get(url,verify=False)
print(res.text)
这样我们就访问到啦。