爬虫请求模块(二)

爬虫请求模块

百度贴吧练习

方法一

需求:
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)

在这里插入图片描述
这样我们就访问到啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值