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) + "文件写入完成" + "\n")

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) + "文件写入完成" + "\n")

#根据详细页面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‘}

原文地址:https://www.cnblogs.com/Anderson-An/p/10226854.html

时间: 2024-11-07 22:40:04

python3获取一个网页特定内容的相关文章

利用cURL会话获取一个网页

1.curl_init 作用: 初始化一个新的会话,返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用. 格式:    curl_init ([ string $url = NULL ] ) 如果提供了参数 $url ,CURLOPT_URL 选项将会被设置成这个值.或者使用curl_setopt()函数手动地设置这个值. 函数执行如果成功,返回一个cURL句柄:出错返回 FALSE. 2.curl_setopt 作用:    为给定

获取目标网页的内容

HttpWebRequest request = WebRequest.Create("http://www.1314721.com.cn/") as HttpWebRequest;             HttpWebResponse response = request.GetResponse() as HttpWebResponse; if (response.StatusCode == HttpStatusCode.OK)             {             

Scala 获取一个url的内容存到本地文件

1, 下载有效url的内容 /** * 获取一个有效的url地址的内容存到本地的本件中 * @param url * @param file */ def downloadUrlFile(url: String, file: String) = { val pw = new PrintWriter(file) pw.write(Source.fromURL(url, "utf-8").mkString) }

python3获取中文网页乱码的问题

在python3中读取网页的时候,会有乱码的问题,如果直接打开,会有错误 Traceback (most recent call last): File "E:/Source_Code/python34/HTMLParser_in_3.py", line 81, in <module> context = f.read() UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 175: ille

python3获取文件中url内容并下载

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-12-25 11:33 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : get_video_audio_file.py 7 8 import xlrd as xl 9 import requests 10 11 12 13 # 创建文件夹 14 def mkdir_floder(pa

scrapy爬虫获取网页特定内容

上次把scrapy环境配置好了,这次试着来做些实际的东西. 关于scrapy抓取网页的文章已经有很多了,但大多数的内容已经过期,不再适用于最新的scrapy版本,故在此另作一文,记录学习过程. 目标是一个政府网站,红框内的部分. 思路很简单: 有了url之后,用xpath表达式提取出来,再写到文件里即可 如果之前没有scrapy的经验,可以先看看这两篇文章: http://www.cnblogs.com/txw1958/archive/2012/07/16/scrapy-tutorial.htm

python3获取指定网页,指定保存位置

import osimport request def DownloadFile(url, savePath): if not os.path.exists(savePath): print("downloading {0}".format(url)) kv={'user-agent':'Mozilla/5.0'} try: r = requests.get(url,headers=kv, timeout=60) r.raise_for_status() # 如果响应状态码不是 200

asp发送http请求,获取一个url的内容

response.Write("http://"&Request.ServerVariables("HTTP_HOST")&"/jfclear"&Request.ServerVariables("REQUEST_URI")) Response.Write(GetHttpPage("http://www.baidu.com/","UTF-8")) Function

写一个函数来获取一个网页中用到的html标签有多少种

代码段 const getTagNameNum = () => { return new Set([...document.querySelectorAll('*')].map(el => el.tagName)).size } 知识点 DOM选择器的种类和用法. ES6扩展运算符用法,本次是用于将类数组对象转换成数组对象. ES6 Set数据结构,以及Set用于"数组去重"的作用 原文地址:https://www.cnblogs.com/Plortinus/p/85365