头歌:Python应用-网页爬虫

 第1关:爬取网页的表格信息

任务描述

本关任务: 湖南大学讲座信息的第80页的网址为 学术活动-湖南大学

讲座信息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中,如下所示

讲座信息1

相关知识

分析该网页,可以观察到 每个讲座信息放在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标签下的内容

讲座div

在该内容下继续按照class为xinwen-wen-top的条件使用find,可以找到讲座时间的标签 jzsjbq=xw.find("div", class_="xinwen-wen-top")

讲座信息标签2

该标签的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

修改上关的程序,爬取从第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()

都看到这里了,点个赞不过分吧( •̀ ω •́ )✧

  • 30
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值