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'}
python3获取一个网页特定内容的更多相关文章
- Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码
通过 正则表达式 来获取一个网页中的所有的 URL链接,并下载这些 URL链接 的源代码 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 ...
- 如何查看一个网页特定效果的js代码(动画效果可js和css)(页面可以看到js的源代码)
如何查看一个网页特定效果的js代码(动画效果可js和css)(页面可以看到js的源代码) 一.总结 1.动画效果可能是 CSS 实现的,也可能是 JS 实现的. 2.直接Chrome的F12调试即可, ...
- 用TcpClient如何获取远程网页的内容
用TcpClient如何获取远程网页的内容 private string GetHTMLTCP(string URL) { string strHTML = "";//用来保存获得 ...
- 利用cURL会话获取一个网页
1.curl_init 作用: 初始化一个新的会话.返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用. 格式: curl_ ...
- 我最近用Python写了一个算法,不需要写任何规则就能自动识别一个网页的内容
我最近用Python写了一个算法,不需要写任何规则就能自动识别一个网页的内容,目前测试了300多个新闻网站的新闻页,都能准确识别
- 你知道怎么从jar包里获取一个文件的内容吗
目录 背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯定可以做到,因 ...
- [skill][telnet] 用telnet获取一个网页
一直也搞不懂, telnet到底是干嘛用的. 然而, 它可以得到一个网页. /home/tong/Data/performance_test [tong@T7] [:] > telnet nyu ...
- python3 保存一个网页为html文件
我使用的python版本为3.5.2. 最近租房子,恨透了中介,想绕过中介去租.结果发现豆瓣同城里有好多二房东,感觉人都还不错.但是豆瓣这里没有信息检索的功能,只能人工地看房子的地址,非常地不方便.所 ...
- 简单的Java网络爬虫(获取一个网页中的邮箱)
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; impo ...
随机推荐
- 【Vue】【Router】手动跳转用 this.$router.push() 时 $router 未定义的问题
初入Vue,手写路由跳转时的问题: toXxxRoute: () => { this.$router.push({'path': '/xxx', 'name': 'xxx'}) } 由于使用了箭 ...
- js中的stopImmediatePropagation方法和stopPropagation方法的区别
看到e.stopImmediatePropagation()这个方法时,记忆有点模糊了.特地回顾一下. 基本概念 stopImmediatePropagation方法:该方法作用在当前节点及事件链的所 ...
- cmd下【java监视和管理控制台】
不需要安装插件,只要jmeter的运行环境配置好就可以了:打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配置,直接 点击:开始——>运行——> ...
- day 72 crm(9) 客户关系系统,整体实现,以及自定制路由内容,客户关系梳理
前情提要: crm(9) ,利用stark 组件和,rbac组键的使用, 明确观点: 一:客户关系需求明确 1:客户关系系统,主要是,本业务逻辑主要是 销售就客户关系的业务逻辑, 二: 创建ap ...
- setAttribute()、getAttribute()与ele[attr]与自定义属性
一.自定义属性设置 1.setAttrbute() var q=document.getElementById("q"); q.setAttribute("index&q ...
- 前端通信:ajax设计方案(八)--- 设计请求池,复用请求,让前端通信快、更快、再快一点
直接进入主题,本篇文章有点长,包括从设计阶段,到摸索阶段,再到实现阶段,最后全面覆盖测试阶段(包括数据搜集清洗),还有与主流前端通信框架进行对比PK阶段. 首先介绍一下一些概念: 1. 浏览器的并发能 ...
- docker namespaces
https://docs.docker.com/engine/security/userns-remap/#prerequisites 注:以下验证环境为centos7.5 docker 18.09. ...
- 一行一行读Java源码——LinkedBlockingQueue
1.LinkedBlockingQueue概述 Linked:链表+Blocking:阻塞+Queue:队列 Queue:首先想到的是FIFO Linked:,Queue:其结构本质上是线性表,可以有 ...
- ant jmeter 优化报告
一:主要内容 报告展示,该报告利用的jmeter.results.shanhe.me.xsl里面加入了自己写的部分代码,优化了展示效果 下载安装ant 修改jmeter.properties 下载jm ...
- Linux 一次杀死多进程
.- | 说明: “grep firefox”的输出结果是,所有含有关键字“firefox”的进程. “grep -v grep”是在列出的进程中去除含有关键字“grep”的进程. “-”是截取输入行 ...