zoukankan      html  css  js  c++  java
  • python3获取一个网页特定内容

    我们今天要爬取的网址为:https://www.zhiliti.com.cn/html/luoji/list7_1.html

    一、目标:获取下图红色部分内容


    即获取所有的题目以及答案。

    二、实现步骤。

    分析:
    1,首先查看该网站的结构。

     

     

    分析网页后可以得到:

    我们需要的内容是在该网页<li>标签下,详细内容链接在<small>的<a>的href中。

    但是这样我们最多只能获取这一页的内容

     

    别着急

    我们点击第二页看一下目标网址有什么变化

     

    我们发现目标网址最后的数字变成了2

    再看一下最后一页

     

    我们可以分析出最后那个数字即第几页,所以我们待会可以直接用一个for循环拼接字符串即可。

    分析详细页面:

    我们随便点击进入一个阅读全文

     

    同样分析网页结构。

     

    发现我们要的内容在一个块<div class="info-zi mb15"/>的<p>标签中,我们在看一下其他题是不是也是这样的

     

    很明显是这样的,所以我们只需要获取class为info-zi mb15下的<p>标签下的内容即可。

    所以我们接下来开始实现。

    Let's Go

    实现:

    1,获取所有页

    def getall():
        for i in range(1,31,1):
            getalldoc(i)    


    i表示第i页,一共30页所以i从1变化到30,每次增加1。

    2,获取当前页详细页面的连接

    #获取目标网址第几页
    def getalldoc(ii):
    #字符串拼接成目标网址
    testurl = "https://www.zhiliti.com.cn/html/luoji/list7_"+str(ii)+".html"
    #使用request去get目标网址
    res = requests.get(testurl,headers=headers)
    #更改网页编码--------不改会乱码
    res.encoding="GB2312"
    #创建一个BeautifulSoup对象
    soup = BeautifulSoup(res.text,"html.parser")
    #找出目标网址中所有的small标签
    #函数返回的是一个list
    ans = soup.find_all("small")
    #用于标识问题
    cnt = 1
    #先创建目录
    mkdir("E:\Python爬取的文件\问题\第" + str(ii) + "页\")
    for tag in ans:
        #获取a标签下的href网址
        string_ans=str(tag.a.get("href"))
        #请求详细页面
        #返回我们需要的字符串数据
        string_write = geturl(string_ans)
        #写文件到磁盘
        writedoc(string_write,cnt,ii)
        cnt = cnt+1
    print("",ii,"页写入完成")


    先拼接处目标网页url,然后调用request去请求,更改网页编码,使用BeautifulSoup对html文档进行解析,找出所有<small>标签,存入一个list,然后遍历该list,获取每一个<small>标签里的<a>标签的href属性,并将其转换为字符串string_ans。

    得到详细页面的url之后我们调用geturl(自定义函数下面讲解)返回我们所需要的题目字符串,最后调用writedoc写入文件。

    3,得到详细页面的url后筛选目标字符串

    #根据详细页面url获取目标字符串
    def geturl(url):
        #请求详细页面
        r = requests.get(url, headers=headers)
        #改编码
        r.encoding = "GB2312"
        soup = BeautifulSoup(r.text, "html.parser")
        #找出类名为 info-zi mb15 下的所有p标签
        ans = soup.find_all(["p", ".info-zi mb15"])
        #用来储存最后需要写入文件的字符串
        mlist = ""
        for tag in ans:
            #获取p标签下的string内容,并进行目标字符串拼接
            mlist=mlist+str(tag.string)
        #返回目标字符串
        return mlist

    首先请求网页构建一个BeautifulSoup对象,筛选出class=info-zi mb15的对象下的<p>标签内容,返回类型为list,遍历list,将每个item的string拼接到目标字符串并返回。

    4,将目标字符串写进文件

    #写文件
    def writedoc(ss, i,ii):
        #打开文件
        #编码为utf-8
        with open("E:\Python爬取的文件\问题\第" + str(ii) + "页\"+"问题" + str(i) + ".txt", 'w', encoding='utf-8') as f:
            #写文件
            f.write(ss)
        print("问题" + str(i) + "文件写入完成" + "
    ")

    5,创建指定目录

    def mkdir(path):
        # 去除首位空格
        path = path.strip()
        # 去除尾部  符号
        path = path.rstrip("\")
        # 判断路径是否存在
        # 存在     True
        # 不存在   False
        isExists = os.path.exists(path)
        # 判断结果
        if not isExists:
            # 如果不存在则创建目录
         # 创建目录操作函数
            os.makedirs(path)
            return True
        else:
            # 如果目录存在则不创建,并提示目录已存在
            return False

    三,最终python文件

    import requests
    from bs4 import BeautifulSoup
    import os
     
    # 服务器反爬虫机制会判断客户端请求头中的User-Agent是否来源于真实浏览器,所以,我们使用Requests经常会指定UA伪装成浏览器发起请求
    headers = {'user-agent': 'Mozilla/5.0'}
     
    #写文件
    def writedoc(ss, i,ii):
        #打开文件
        #编码为utf-8
        with open("E:\Python爬取的文件\问题\第" + str(ii) + "页\"+"问题" + str(i) + ".txt", 'w', encoding='utf-8') as f:
            #写文件
            f.write(ss)
        print("问题" + str(i) + "文件写入完成" + "
    ")
     
    #根据详细页面url获取目标字符串
    def geturl(url):
        #请求详细页面
        r = requests.get(url, headers=headers)
        #改编码
        r.encoding = "GB2312"
        soup = BeautifulSoup(r.text, "html.parser")
        #找出类名为 info-zi mb15 下的所有p标签
        ans = soup.find_all(["p", ".info-zi mb15"])
        #用来储存最后需要写入文件的字符串
        mlist = ""
        for tag in ans:
            #获取p标签下的string内容,并进行目标字符串拼接
            mlist=mlist+str(tag.string)
        #返回目标字符串
        return mlist
     
    #获取目标网址第几页
    def getalldoc(ii):
        #字符串拼接成目标网址
        testurl = "https://www.zhiliti.com.cn/html/luoji/list7_"+str(ii)+".html"
        #使用request去get目标网址
        res = requests.get(testurl,headers=headers)
        #更改网页编码--------不改会乱码
        res.encoding="GB2312"
        #创建一个BeautifulSoup对象
        soup = BeautifulSoup(res.text,"html.parser")
        #找出目标网址中所有的small标签
        #函数返回的是一个list
        ans = soup.find_all("small")
        #用于标识问题
        cnt = 1
        #先创建目录
        mkdir("E:\Python爬取的文件\问题\第" + str(ii) + "页\")
        for tag in ans:
            #获取a标签下的href网址
            string_ans=str(tag.a.get("href"))
            #请求详细页面
            #返回我们需要的字符串数据
            string_write = geturl(string_ans)
            #写文件到磁盘
            writedoc(string_write,cnt,ii)
            cnt = cnt+1
        print("",ii,"页写入完成")
     
     
    def mkdir(path):
        # 去除首位空格
        path = path.strip()
        # 去除尾部  符号
        path = path.rstrip("\")
        # 判断路径是否存在
        # 存在     True
        # 不存在   False
        isExists = os.path.exists(path)
        # 判断结果
        if not isExists:
            # 如果不存在则创建目录
         # 创建目录操作函数
            os.makedirs(path)
            return True
        else:
            # 如果目录存在则不创建,并提示目录已存在
            return False
     
    def getall():
        for i in range(1,31,1):
            getalldoc(i)
     
     
    if __name__ == "__main__":
        getall()

    四,运行结果

     


    五,总结
    一般网页的编码为utf-8编码,但是这个网页就不一样编码为GB2312,我第一次请求返回的是乱码,如果python向一个不存在的目录进行写文件会报错,所以写文件之前要先判断路径是否正确存在,不存在就要创建路径,请求头请使用下面这个

    # 服务器反爬虫机制会判断客户端请求头中的User-Agent是否来源于真实浏览器,所以,我们使用Requests经常会指定UA伪装成浏览器发起请求
    headers = {'user-agent': 'Mozilla/5.0'}



  • 相关阅读:
    严蔚敏数据结构线性表操作
    strcpy/strncpy、strcat/strncpy的替代方案strlcpy,strlcat
    使用DNS的反向区域,解决通过IP反向查询主机名,适合web环境通过IP定位故障主机名
    FreeBSD漏洞程序升级
    定义制造业操作(定义 MES/MOM 系统)
    定义制造业操作(定义 MES/MOM 系统)
    EF / EF CORE 打印SQL
    远程连接桌面Azure AD(Azure AD Joined Computer)
    《精通CSS第3版》(6)Flexbox
    FastNat内网穿透,给开发人员送的硬货福利限时送
  • 原文地址:https://www.cnblogs.com/Anderson-An/p/10226854.html
Copyright © 2011-2022 走看看