谨以此文,怀念那再也回不去的高中。
1.程序准备
半夜写python小程序的时候,突然怀念起高中的生活。于是我打开高中学校官网:合肥八中官网
我们点击“进入主页”,然后下拉,点击高三年级新闻版块右上角的more
进入了这个界面:高三年级新闻
如图,我们需要爬取的是红框圈出来的标题
首先,我们需要了解网页的代码结构:
我们可以通过按F12,大致查看一下网页的代码如下图。
2.开始写程序
接着我们需要找到我们需要找到的文字在何处位置,找到后再通过寻找能够正好选中该位置的div盒子来定位,按照这样的步骤分析网页代码。
分析好了网页代码,那么我们开始写程序:
1.引入库
首先引入我们需要的库:requests
、beautifulsoup4
、os
(前两个库如果没有的话需要下载,os库是内置库无需下载,下载方式可以去看Python使用pip安装库的四种方法以及一些异常的解决办法)
import os
import bs4
import requests
2.对文件操作的一些准备
#指定文件的保存路径为D盘
os.chdir("D:\\")
#打开文件,编码方式记得用中文(很重要)
file=open("合肥八中高三年级最新100条新闻.txt",'w',encoding='utf-8')
3.代码主体
#因为我们想要获取前10页的信息,所以我们要循环十次
for i in range(1,11):
#每一页设定地址,让程序可以自动翻页
url='http://www.hfbz.com/index/detail-700030002?page={}'.format(str(i))
#观察得知每一页网址的变动只是更改了url中page=后的内容,因此我们每次设定地址也只需更改这一处
print("正在解析第{}页".format(i))
#获取链接内容,以及指定编码格式
r = requests.get(url)
r.encoding='utf-8'
#创建soup解析器
soup=bs4.BeautifulSoup(r.text,'html.parser')
#定位到包含所有标题的最小div中,缩小范围
title=soup.find('div', {'class': 'list-content'})
file.write("第{}页标题:\n".format(i))
#num用来给每一页的标题标序号
num=1
#对该div中的所有标题进行遍历
for a in title.find_all('div',{'class':'list-xx'}):
file.write("{}.".format(num)) #标序号
num=num+1
tex=a.span.string
file.write(tex) #写标题
file.write('\n') #换行
file.write("\n") #每页结束的换行,为了更加清晰
file.write("合肥八中高三年级最新100条新闻如上所示\n网址:http://www.hfbz.com/index/detail-700030002?page=1")
#关闭文件
file.close()
3.最终结果
代码如下:
# -*- coding: utf-8 -*-
import requests
import os
import bs4
os.chdir("D:\\") #指定文件的保存路径为D盘
#打开文件
file=open("合肥八中高三年级最新100条新闻.txt",'w',encoding='utf-8')
#循环10次,获取并写入最新10页的标题
for i in range(1,11):
#设定地址
url='http://www.hfbz.com/index/detail-700030002?page={}'.format(str(i))
print("正在解析第{}页".format(i))
r = requests.get(url)
r.encoding='utf-8'
#创建soup解析器
soup=bs4.BeautifulSoup(r.text,'html.parser')
#定位到包含所有标题的最小div中,缩小范围
title=soup.find('div', {'class': 'list-content'})
file.write("第{}页标题:\n".format(i))
#num用来给每一页的标题标序号
num=1
#对该div中的所有标题进行循环
for a in title.find_all('div',{'class':'list-xx'}):
file.write("{}.".format(num)) #标序号
num=num+1
tex=a.span.string
file.write(tex) #写标题
file.write('\n') #换行
file.write("\n") #每页结束的换行,为了更加清晰
file.write("合肥八中高三年级最新100条新闻如上所示\n网址:http://www.hfbz.com/index/detail-700030002?page=1")
#关闭文件
file.close()
print("获取合肥八中高三年级最新100条新闻成功!")
print("也谨以此,怀念那再也回不去的高中")
4.最新版代码(八中网页居然重写了!)
八中网页居然重写了!所以上面的程序会运行出错,最新版的是下面这个。
目标页面:http://www.hfbz.com/detail-9101?page=1
点这里可以快速访问
# -*- coding: utf-8 -*-
import requests
import os
import bs4
os.chdir("D:\\") #指定文件的保存路径为D盘
file=open("合肥八中最新100条新闻.txt",'w',encoding='utf-8')
#循环10次,获取并写入最新10页的标题
for i in range(1,11):
#设定地址
url='http://www.hfbz.com/detail-9101?page={}'.format(str(i))
print("正在解析第{}页".format(i))
r = requests.get(url)
r.encoding='utf-8'
#创建soup解析器
soup=bs4.BeautifulSoup(r.text,'html.parser')
#定位到包含所有标题的最小div中,缩小范围
title=soup.find('ul', {'class': 'r-list'})
file.write("第{}页标题:\n".format(i))
num=1 #num用来给每一页的标题标序号
#对该div中的所有标题进行循环
for a in title.find_all('a'):
file.write("{}.".format(num)) #标序号
num=num+1
tex=a.string
file.write(tex) #写标题
file.write('\n') #换行
file.write("\n") #每页结束的换行,为了更加清晰
file.write("合肥八中最新100条新闻如上所示\n网址:http://www.hfbz.com/detail-9101?page=1")
file.close()
print("获取合肥八中最新100条新闻成功!")
print("也谨以此,怀念那再也回不去的高中")