吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 962|回复: 6
收起左侧

[讨论] 爬虫完整代码查找错误

[复制链接]
CharlotterJan 发表于 2021-12-5 11:54
这是我打的项目源代码,请哪位大神指出一下错误,三天了,爬不出来
# 这份代码实现第三方库导入以及二维列表的定义
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import matplotlib
allUniv=[]
# 这是给定获取url参数页面的HTML代码的通用函数
def getHTMLText(url):
try:
     r=requests.get(url,timeout=30)
     r.raise_for_status()     
     r.encoding=r.apparent_encodin
     return  r.text
  except:
     print("产生异常")
# 这是提取页面数据的函数模块
def fillUnivList(soup):
    data = soup.find_all('tr')     #找到所有的tr标签,返回列表
    for tr in data:
        ltd = tr.find_all('tr')     #找到所有的td标签,返回列表
        if len(ltd) == 0:
            continue
            singleUniv = []
            for td in ltd:
                singleUniv.append(td.text)       #提取td标签中的信息
            allUniv.append(singleUniv)      #  allUniv存储全部数据

# 这是输出高校排名函数
def printUnivList(num):
    print("{:^10}{:^35}{:^10}{:^10}{:^10}".format(\
        "排名", "学校名称", "省市", "类型", "总分"))
    for i in range(num):
        u = allUniv
        for j in range(5):
            u[j] = u[j].strip()
        print("{:^10}{:^35}{:^10}{:^10}{:^10}").format(\
        u[0], str(u[1], u[2], u[3], u[4]))

# 这是统计湘苏两省前500高校数及可视化函数
def data_display(num):
    schoolNum = {"湖南": 0, "江苏": 0};
    for i in range(num):
        if "湖南" in allUniv[2]:
            schoolNum["江苏"] = schoolNum["湖南"]+1
        if "江苏" in allUniv[2]:
            schoolNum["江苏"] = schoolNum["江苏"]+1
    print(schoolNum)
    name_list = ['湖南', '江苏']
    num_list = [schoolNum["湖南"], schoolNum["江苏"]]
    matplotlib.rcParams['fort.sans-serif']=['simHei']
    plt.bar(range(len(num_list)),num_list,\
            color=['r','g','b'],tick_label=name_list)
    plt.show()
    # 这是主函数
def main(num):
    url = "https://www.shanghairanking.cn/rankings/bcur/2020"
    html = getHTMLText(url)
    soup = BeautifulSoup(html, "html.parser")
    fillUnivList(soup)
    printUnivList(num)
    data_display(num)
main(500)
老师留的小作业—求解答

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

叶凯 发表于 2021-12-5 12:32
先把格式弄好吧,看起来就不舒服,大佬看一眼就不想看内容了,极度不舒适
dft2010 发表于 2021-12-5 12:51
这个格式说实话,我都没看下去。。。一般问问题,不得先说问题在哪么····报错提醒呢
wkfy 发表于 2021-12-5 12:53
你这代码粗略目测就几个错误了,
r.encoding=r.apparent_encodin
schoolNum = {"湖南": 0, "江苏": 0};
确定能运行的起来?
爬不到和不能运行是两码事。
lgsp_Jim 发表于 2021-12-5 13:25
本帖最后由 lgsp_Jim 于 2021-12-5 13:27 编辑

数据好像是直接返回全部的,下一页没看到再次请求服务器获取数据,懒得研究,就爬了第一页数据。你的代码不想看,也没贴错误,懒得想。所以我怎么简单怎么来了....
搜狗截图20211205132703.png
diku 发表于 2021-12-5 21:17
先不说爬虫,整体python的代码小错误较多,我按照你的逻辑先把程序跑通了,之前的程序跑不起来。另外说实话用xpath来筛选数据更方便一些,另外这个代码只能爬第一页,其他数据在payload.js里面,下面代码只是按照你的逻辑爬一页数据而已,楼主可以对照着看下
[Python] 纯文本查看 复制代码
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import matplotlib
allUniv=[]
# 这是给定获取url参数页面的HTML代码的通用函数
def getHTMLText(url):
  try:
     r=requests.get(url,timeout=30)
     r.raise_for_status()
     r.encoding=r.apparent_encoding
     return r.text
  except:
     print("产生异常")
# 这是提取页面数据的函数模块
def fillUnivList(soup):
    data = soup.find_all('tr')     #找到所有的tr标签,返回列表
    for tr in data:
        ltd = tr.find_all('td')     #找到所有的td标签,返回列表
        if len(ltd) == 0:           #移除标题列
            continue
        singleUniv = []
        for td in ltd:
            if td.select('.name-cn'):
                singleUniv.append(td.select('.name-cn')[0].text.strip())
                continue
            singleUniv.append(td.text.strip())       #提取td标签中的信息
        allUniv.append(singleUniv)      #  allUniv存储全部数据


# 这是输出高校排名函数
def printUnivList(num):
    print("{0:10}\t{1:{5}<10}\t{2:{5}<10}\t{3:{5}<10}\t{4:{5}<10}".format(
        "排名", "学校名称", "省市", "类型", "总分",chr(12288)))
    for i in range(num):
        try:
            u = allUniv[i]
        except Exception:
            break
        for j in range(5):
            u[j] = u[j].strip()
        print("{0:<10}\t{1:{5}<10}\t{2:{5}<10}\t{3:{5}<10}\t{4:{5}<10}".format(
        u[0], u[1], u[2], u[3], u[4], chr(12288)))

# 这是统计湘苏两省前500高校数及可视化函数
def data_display(num):
    schoolNum = {"湖南": 0, "江苏": 0}
    for i in range(num):
        try:
            u = allUniv[i]
            if u[2] == '湖南' or u[2] == '江苏':
                schoolNum[u[2]] = schoolNum[u[2]]+1
        except:
            break
    print(schoolNum)
    name_list = ['湖南', '江苏']
    num_list = [schoolNum["湖南"], schoolNum["江苏"]]
    matplotlib.rcParams['font.sans-serif']=['simHei']
    plt.bar(range(len(num_list)),num_list,
            color=['r','g','b'],tick_label=name_list)
    plt.show()

    # 这是主函数
def main(num):
    url = "https://www.shanghairanking.cn/rankings/bcur/2020"
    html = getHTMLText(url)
    soup = BeautifulSoup(html, "html.parser")
    fillUnivList(soup)
    printUnivList(num)
    data_display(num)
main(500)
 楼主| CharlotterJan 发表于 2021-12-9 17:52
lgsp_Jim 发表于 2021-12-5 13:25
数据好像是直接返回全部的,下一页没看到再次请求服务器获取数据,懒得研究,就爬了第一页数据。你的代码不 ...

谢谢!太谢谢了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表