作业四:爬虫

发布时间 2023-12-12 16:48:24作者: Enly_321

1.请用requests库的get()函数访问如下一个网站20次,打印返回状态,text()内容,计算text()属性和content属性所返回网页内容的长度。

 1 import requests
 2 
 3 url = "https://www.baidu.com/"  # 将此URL替换为您要访问的网站
 4 
 5 for i in range(20):
 6     response = requests.get(url)
 7     print("第{}次访问:".format(i + 1))
 8     print("返回状态:", response.status_code)
 9     print("text()内容:", response.text)
10     print("text()内容长度:", len(response.text))
11     print("content属性所返回网页内容长度:", len(response.content))
12     print("")

运行结果:

 

 

 

2.这是一个简单的html页面,请保持为字符串,完成后面的计算要求。

a.打印head标签内容和你的学号后两位‪‬‪‬‪‬‪:

b.获取body标签的内容‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬c. 获取id 为first的标签对象‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭d. 获取并打印html页面中的中文字符

from bs4 import BeautifulSoup

html_doc = """
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h1>我的第一个标题</h1>
<p id="first">我的第一个段落。</p>
</body>
<table border="1">
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>
</html>
"""

print("学号:02")
soup = BeautifulSoup(html_doc, 'html.parser')
print("a:", soup.head)
print("b:", soup.body)
first_element = soup.find(id="first")
print("c:", first_element)
chinese_characters = "".join([char for char in html_doc if '\u4e00' <= char <= '\u9fff'])
print("d:", chinese_characters)

运行结果:

 

‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

 

3.爬中国大学排名网站内容,‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬https://www.shanghairanking.cn/rankings/bcur/201811‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬要求:(一),爬取大学排名(学号尾号1,2,爬取年费2020,a,爬取大学排名(学号尾号3,4,爬取年费2016,)a,爬取大学排名(学号尾号5,6,爬取年费2017,)a,爬取大学排名(学号尾号7,8,爬取年费2018,))a,爬取大学排名(学号尾号9,0,爬取年费2019,)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬(二)把爬取得数据,存为csv文件

# e23.1CrawUnivRanking.py
import re
import pandas as pd
import requests
from bs4 import BeautifulSoup

allUniv = []  #储存


def getHTMLtext(url):  #获取指定URL的HTML文本,设置超时时间为30秒
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        return ""


def fillUnivList(soup):
    soup.encode('utf-8')
    data = soup.find_all('tr')  #遍历解析后的HTML中的所有表格行
    list1=[]
    for tr in data:
        ltd = tr.find_all('td')   #对于每一行,提取其中的所有单元格(td标签)
        if len(ltd) == 0:
            continue
        singleUniv = []    #如果单元格数量不为0,用于存储当前行的大学排名信息
        for td in ltd:
            temp=re.findall('[\u4e00-\u9fff]+' ,str(td))    #使用正则表达式提取其中的中文字符
            if td.string!=None and td.string!="[]":
                singleUniv.append(td.string)
            if temp!=[]:
                if type(temp)==list:
                    str1=''
                    for i in temp:
                        str1+=i
                    singleUniv.append(str1)
        allUniv.append(singleUniv)
    return allUniv


def printUnivList(num):
    print("{:^4}{:^10}{:^5}{:^8}{:^10}".format("排名", "学校名称", "省市", "类型", "总分"))   #表头
    for i in range(num):
        u = allUniv[i]
        u[0]=u[0][29:31]
        u[1]=u[1][:4]
        u[4]=u[4][25:31]
        print("{:^5}{:^10}{:^5}{:^8}{:^10}".format(u[0], u[1], u[2], u[3], u[4]))
def main(flag):
    url = 'https://www.shanghairanking.cn/rankings/bcur/201711'
    html = getHTMLtext(url)
    soup = BeautifulSoup(html, "html.parser")
    list1=fillUnivList(soup)
    if flag==0:
        printUnivList(30)   #爬取多少行
    else:
        return  list1
#  定义一个函数,将里面的嵌套列表的第一个元素取出
def combination(list1,count):
    list2=[]
    for i in list1:
        list2.append(i[count])
    return list2
main(0)
list1=main(1)
#  定义一个函数,处理一下获取到的数据
def deal_data(list1):
    list_1=combination(list1,0)
    list_2=combination(list1,1)
    list_3=combination(list1,2)
    list_4=combination(list1,3)
    list_5=combination(list1,4)
    data = pd.DataFrame({
        "排名": list_1,
        "学校名称": list_2,
        '省市': list_3,
        '类型': list_4,
        '总分': list_5
    })
    return data
data=deal_data(list1)
data.to_csv('University_grade.csv',index=False)

运行结果:

 csv文件: