简单百度贴吧改写

目录

爬虫请求模块介绍

urllib.request模块

版本

常用的方法

响应对象

 urllib.parse模块

常用方法

请求方式

requests模块

安装

扫描二维码关注公众号,回复: 14684086 查看本文章

request常用方法

响应对象response的方法

requests模块发送 POST请求

cookie

session

处理不信任的SSL证书

requests 模块源码分析

1、首次获取百度贴吧主页内容

2、获取多页贴吧的内容

3、def函数的改写

4、面向对象改写


爬虫请求模块介绍

urllib.request模块

版本

python2 :urllib2、urllib

python3 :把urllib和urllib2合并

常用的方法

  • urllib.request.urlopen("网址")  作用 :向网站发起一个请求并获取响应
  • 字节流 = response.read()
  • 字符串 = response.read().decode("utf-8")
  • urllib.request.Request("网址",headers="字典")  urlopen()不支持重构User-Agent

响应对象

  • read()  读取服务器响应的内容
  • getcode() 返回HTTP的响应码
  • geturl()  返回实际数据的URL(防止重定向问题)

 urllib.parse模块

常用方法

  • urlencode(字典)
  •  quote(字符串) (这个里面的参数是个字符串)

请求方式

  • GET 特点 :查询参数在URL地址中显示
  • POST
    • 在Request方法中添加data参数 urllib.request.Request(url,data=data,headers=headers)
    • data :表单数据以bytes类型提交,不能是str

requests模块

安装

  • pip install requests
  • 在开发工具中安装

request常用方法

  • requests.get(网址)

响应对象response的方法

  • response.text 返回unicode格式的数据(str)
  • response.content 返回字节流数据(二进制)
  • response.content.decode('utf-8') 手动进行解码
  • response.url  返回url
  • response.encode() = ‘编码’

requests模块发送 POST请求

cookie

cookie :通过在客户端记录的信息确定用户身份

HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。

session

session :通过在服务端记录的信息确定用户身份 这里这个session就是一个指的是会话

处理不信任的SSL证书

什么是SSL证书?

  • SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能

测试网站 国家税务总局全国增值税发票查验平台

requests 模块源码分析

1、首次获取百度贴吧主页内容

import urllib.request
import urllib.parse
name = input("请输入爬取内容:")
name1 = urllib.parse.quote(name)    # 利用parse进行编码
url = f'https://tieba.baidu.com/f?ie=utf-8&kw={name1}&fr=search'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}
# 1、构建请求对象
req = urllib.request.Request(url,headers = headers)
# 2、获取对象
res = urllib.request.urlopen(req)
print(res.read().decode())

2、获取多页贴吧的内容

import urllib .request
import urllib.parse

name = input("请输入百度贴吧名称:")      # 1-5,2-3
begin = int(input("请输入开始页:"))
end = int(input("请输入结束页:"))
#编码
name1 = urllib.parse.quote(name)    # kw已经完成
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}
for page in range(begin,end+1):    # 左闭右开
    pn = (page-1)*50
    # print(pn)
# 拼接URL
    url = f'https://tieba.baidu.com/f?kw={name1}&pn={pn}'
    print(url)
    # 发请求,获取相应
    req = urllib.request.Request(url,headers=headers)
    # 获取相应,相应结果给response
    response = urllib.request.urlopen(req)
    # 获取的相应结果给了html
    html = response.read().decode('utf-8')
    print(html)

    # 写入文件 第{page}页.html
    filename = f'第{page}页.html'
    with open(filename,'w',encoding='utf-8') as f:
        f.write(html)

3、def函数的改写

为了增强可读性,采用def函数的改写

'''
考虑实现功能:读取页面,写入文件,主函数
'''
import urllib.request
import urllib.parse

def readPage(url): # 发请求,作相应,只是负责读取页面
    # 那么就需要给页面发送请求,获得响应
    # 获得响应以后就需要将响应结果拿给response接收
    # 接收以后把结果给到html网页
    # 最后再将获取的网页放到write下进行写入到文件里面
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
    }
    # 发请求,获取响应
    req = urllib.request.Request(url, headers=headers)
    # 获取相应,响应结果给response
    response = urllib.request.urlopen(req)
    # 获取的响应结果给了html
    html = response.read().decode('utf-8')
    return html     # 返回函数的调用处(def main())


def writePage(filename,html):   # 将内容写入到文件里面
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(html)


def main():     # 主要调用处
    name = input("请输入百度贴吧名称:")  # 1-5,2-3
    begin = int(input("请输入开始页:"))
    end = int(input("请输入结束页:"))
    # 编码
    name1 = urllib.parse.quote(name)  # kw已经完成,进行编码,因为浏览器不认识中文,因此需要编码进行转换为计算机读得懂的
    for page in range(begin, end + 1):  # 左闭右开
        pn = (page - 1) * 50
        # print(pn)
        # 拼接URL
        url = f'https://tieba.baidu.com/f?kw={name1}&pn={pn}'  # 对URL进行拼接
        # 获取URL,发请求,获取相应的页面
        html = readPage(url)  # 函数名加()来进行调用
        # 目的:获取页面的内容。将def readPage中的html得到,等价于调用里面的函数来进行使用\
        # 接下来应该如何拿到html页面的内容呢?,通过(def readPage)进行return返回得到html

        # 此时拿到页面以后,然后保存在def write(),然后再进行调用
        filename = f'第{page}页.html'
        writePage(filename, html)  # 调用writePage中的文件\


main()          # 最后通过调用main函数调用,完成

4、面向对象改写

利用面向对象进行改写

import urllib.request
import urllib.parse


class BaiduSpider(object):
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'

        }

    #  发请求,获取响应
    def readPang(self, url):
        # 发请求,获取响应
        req = urllib.request.Request(url, headers=self.headers)
        # 获取相应,响应结果给response
        response = urllib.request.urlopen(req)
        # 获取的响应结果给了html
        html = response.read().decode('utf-8')
        return html  # 返回函数的调用处(def main())

    def writePang(self, filename, html):
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(html)

    def main(self):
        name = input("请输入百度贴吧名称:")  # 1-5,2-3
        begin = int(input("请输入开始页:"))
        end = int(input("请输入结束页:"))
        # 编码
        name1 = urllib.parse.quote(name)  # kw已经完成,进行编码,因为浏览器不认识中文,因此需要编码进行转换为计算机读得懂的
        for page in range(begin, end + 1):  # 左闭右开
            pn = (page - 1) * 50
            # print(pn)
            # 拼接URL
            url = f'https://tieba.baidu.com/f?kw={name1}&pn={pn}'  # 对URL进行拼接
            # 获取URL,发请求,获取相应的页面
            html = self.readPage(url)  # 函数名加()来进行调用
            # 目的:获取页面的内容。将def readPage中的html得到,等价于调用里面的函数来进行使用\
            # 接下来应该如何拿到html页面的内容呢?,通过(def readPage)进行return返回得到html

            # 此时拿到页面以后,然后保存在def write(),然后再进行调用
            filename = f'第{page}页.html'
            self.writePage(filename, html)  # 调用writePage中的文


spider = BaiduSpider()  # 调用
# 调用类里面的方法--对象,方法名
spider.main()

喜欢记得点赞喔!!!

猜你喜欢

转载自blog.csdn.net/m0_56331594/article/details/123713044