第1关:爬取网页的表格信息
任务描述
本关任务: 湖南大学讲座信息的第80页的网址为 学术活动-湖南大学
修改上关的程序,爬取从第80页到85页中的讲座信息,存放在jz.txt文件中 每行显示一个讲座信息,讲座时间、讲座标题和主讲人地点用逗号分隔
相关知识
为了完成本关任务,你需要掌握:1.如何爬取多个网页,2.如何将信息存入文件。
获取爬取多个网页
为了爬取多个网页,你需要通过循环产生多个不同url地址,再调用requests库的get方法,获得多个网页的url
如何将信息写入文件
首先以w方式打开文件,再通过文件对象的write方法将字符串写入文件。
测试说明
系统会测试你所生成的jz.txt文件是否正确 可参考下列视频 爬取东方天气网2019年长沙天气
上代码:
import requests
from bs4 import BeautifulSoup
#代码开始
respose = requests.get("https://tjj.hunan.gov.cn/hntj/tjfx/tjgb/pcgbv/202105/t20210519_19079329.html")
respose.encoding = 'utf-8'
content = respose.text.encode()
soup = BeautifulSoup(content, "html.parser")
bg = soup.find('table')
#代码结束
print(bg)
第2关:爬取表格中指定单元格的信息
任务描述
本关任务:
本关任务:根据上个步骤中爬取的表格标签,将表格中从第四行的单元格的文本显示出来
行标签和单元格标签
表格中每行的数据信息被封装在一个<tr></tr>
之间的结构中。 每列内容采用<td></td>
表示。 因此,如果要获得其中的数据,需要首先找到标签,并遍历其中每个标签,获取其值 例如,表格的第四行对应的html代码如下
find_all函数
通过BeautifulSoup的find_all(name)方法,可以找到多个标签,将多个标签的内容返回为一个列表 lb=bg.find_all("tr")
找到表格的所有tr标签,存入列表lb 若需要找每行下的所有td标签,则需要对lb循环,对每个元素执行find_all("td")
获取标签文本
在用find()方法找到特定的标签后,想获取里面的文本,可以用.text属性或者.string属性。 如果该标签下有多层次的子标签,则必须使用text属性。 对于该网页的td标签,如上图所示,需要用text才能返回文本。并且需要用strip去掉换行符。 如果使用最内层的span标签,则可以使用string属性。
编程要求
对于上述获得的表格标签的内容,爬取从第4行开始的文本, 显示每行的地区名称、总人口、城镇人口、乡村人口和城镇化率 各项之间用空格隔开,包括最后一列后面也有空格 每个地区换一行
上代码:
import requests
from bs4 import BeautifulSoup
url = "https://tjj.hunan.gov.cn/hntj/tjfx/tjgb/pcgbv/202105/t20210519_19079329.html"
r=requests.get(url)
r.encoding = 'utf-8'
soup=BeautifulSoup(r.text,"html.parser")
bg=soup.find('table')
#代码开始
alltr = bg.findAll('tr')
for index, i in enumerate(alltr, 1): # 使用enumerate获取索引
if index >= 4: # 从第四行开始输出
allspan = i.findAll('span')
for count, j in enumerate(allspan,1):
print(j.text,end=" ")
print() # 在第二个循环结束后换行
#代码结束
第3关:将单元格的信息保存到列表并排序
任务描述
本关任务:根据上个步骤中爬取的表格内容,将城市名称和人口数存放在列表lb中,按人口数降序排列后输出
提示:存入列表时,只需要存入两列,需将人口数转换为数值型才能按照数值的降序排列,可以用isnumeric方法判断是否数字字符
上代码:
import requests
from bs4 import BeautifulSoup
url = "https://tjj.hunan.gov.cn/hntj/tjfx/tjgb/pcgbv/202105/t20210519_19079329.html"
r=requests.get(url)
r.encoding = 'utf-8'
soup=BeautifulSoup(r.text,"html.parser")
bg=soup.find('table')
lb=[]
#代码开始
name_num = {}
use = []
alltr = bg.findAll('tr')
for index, i in enumerate(alltr, 1): # 使用enumerate获取索引
if index >= 4: # 从第四行开始输出
allspan = i.findAll('span')
name = allspan[0].text
num = allspan[1].text
name_num[name] = int(num)
use.append(int(num))
use.sort(reverse=True)
lb = [ [k,v] for k,v in sorted(name_num.items(),key=lambda item: use.index(item[1]))]
#代码结束
for lbxx in lb:
print(lbxx[0],lbxx[1])
第4关:爬取div标签的信息
任务描述
本关任务:编写一个爬取湖南大学讲座信息网页的程序 湖南大学讲座信息的网址为学术活动-湖南大学 网页如下(注意:随着时间不同,网页的内容会变化)
其对应的代码如下
编写程序,爬取该页第一个讲座的时间、标题、主讲人和地点信息,存储在字符串jzsj、jzbt、jzdd中,如下所示
相关知识
分析该网页,可以观察到 每个讲座信息放在class为xinwen-wen的div标签下, 讲座时间包含在class为xinwen-sj-top的div标签下, 讲座标题包含在class为xinwen-wen-bt的div标签下, 讲座主讲人地点包含在class为xinwen-sj-top的div标签下。
为了完成本关任务,你需要掌握:如何爬取指定属性的div标签下的信息 通过BeautifulSoup的find()方法,可以按照条件找到标签,返回标签的内容 find(name, attrs) name:按照T标签名字检索,名字用字符串形式表示,例如div,li attrs:按照标签属性值检索,需要列出属性名称和值 xw=soup.find("div", class_="xinwen-wen") 可以返回xinwen-wen标签下的内容
在该内容下继续按照class为xinwen-wen-top的条件使用find,可以找到讲座时间的标签 jzsjbq=xw.find("div", class_="xinwen-wen-top")
该标签的text属性即为讲座时间。 注意:该文本中有空格和换行符,需要使用strip去掉
测试说明
系统会测试你爬取的信息否正确 可参考下列视频 爬取东方天气网2019年长沙天气
上代码:
import requests
from bs4 import BeautifulSoup
url = 'https://www.hnu.edu.cn/xysh/xshd.htm'
r = requests.get(url)
r.encoding = 'utf-8'
#代码开始
soup = BeautifulSoup(r.text,'html.parser')
jzsj = soup.find('div',class_= 'xinwen-sj-top').string.strip()
jzbt = soup.find('div',attrs={'class','xinwen-wen-bt'}).string.strip()
jzdd = soup.find('div',attrs={'class','xinwen-wen-zy'}).text.strip()
#代码结束
f1=open("jzxx.txt","w")
f1.write(jzsj+"\n")
f1.write(jzbt+"\n")
f1.write(jzdd+"\n")
f1.close()
第5关:爬取单页多个div标签的信息
任务描述
本关任务:改进上一关的代码。爬取湖南大学讲座网页的多个讲座信息,存储在二维列表jzxx中。 湖南大学讲座信息的网址为学术活动-湖南大学
相关知识
find_all函数 通过BeautifulSoup的find_all(name,attr)方法,可以找到符合条件的多个标签,将多个标签的内容返回为一个列表 lb=bg.find_all("div",class="xinwen-wen")
找到网页的所有class属性为xinwen-wen的div标签,存入列表lb
列表的操作 对于得到的多个标签的列表,使用for循环,可以依次访问每个标签,使用find函数找出其时间、标题和地点的文本,加入到列表,再加入二维列表jzxx中。
编程要求
根据提示,在右侧编辑器补充代码,爬取湖南大学讲座网页的多个讲座信息,存储在二维列表jzxx中。
上代码:
import requests
from bs4 import BeautifulSoup
url = 'https://www.hnu.edu.cn/xysh/xshd.htm'
r = requests.get(url)
r.encoding = 'utf-8'
jzxx=[]
#代码开始
soup = BeautifulSoup(r.text, "html.parser")
lb = soup.find_all('div',class_='xinwen-wen')
for i in lb:
jzsj = i.find('div',class_= 'xinwen-sj-top').text.strip()
jzbt = i.find('div',attrs={'class','xinwen-wen-bt'}).text.strip()
jzdd = i.find('div',attrs={'class','xinwen-wen-zy'}).text.strip()
jzxx.append([jzsj,jzbt,jzdd])
#代码结束
f1=open("jzxx2.txt","w")
for xx in jzxx:
f1.write(",".join(xx)+"\n")
f1.close()
第6关:爬取多个网页的多个div标签的信息
任务描述
本关任务: 湖南大学讲座信息的第80页的网址为 学术活动-湖南大学
修改上关的程序,爬取从第80页到85页中的讲座信息,存放在jz.txt文件中 每行显示一个讲座信息,讲座时间、讲座标题和主讲人地点用逗号分隔
相关知识
为了完成本关任务,你需要掌握:1.如何爬取多个网页,2.如何将信息存入文件。
获取爬取多个网页
为了爬取多个网页,你需要通过循环产生多个不同url地址,再调用requests库的get方法,获得多个网页的url
如何将信息写入文件
首先以w方式打开文件,再通过文件对象的write方法将字符串写入文件。
测试说明
系统会测试你所生成的jz.txt文件是否正确 可参考下列视频 爬取东方天气网2019年长沙天气
上代码:
#湖南大学信科院陈娟版权所有
import requests
from bs4 import BeautifulSoup
f1=open("jz.txt","w",encoding="utf8")
#代码开始
for i in range(80,85,1):
respose = requests.get(f'https://www.hnu.edu.cn/xysh/xshd/{i}.htm')
respose.encoding = 'utf-8'
content = respose.text
soup = BeautifulSoup(content,'html.parser')
all_div = soup.findAll('div',class_='xinwen-wen')
for div in all_div:
jzsj = div.find('div',class_= 'xinwen-sj-top').string.strip()
jzbt = div.find('div',attrs={'class','xinwen-wen-bt'}).string.strip()
jzdd = div.find('div',attrs={'class','xinwen-wen-zy'}).text.strip()
f1.write(jzsj+','+jzbt+','+jzdd+'\n')
#代码结束
f1.close()
都看到这里了,点个赞不过分吧( •̀ ω •́ )✧