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
   returnr.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 = u.strip()
      print("{:^10}{:^35}{:^10}{:^10}{:^10}").format(\
      u, str(u, u, u, u))

# 这是统计湘苏两省前500高校数及可视化函数
def data_display(num):
    schoolNum = {"湖南": 0, "江苏": 0};
    for i in range(num):
      if "湖南" in allUniv:
            schoolNum["江苏"] = schoolNum["湖南"]+1
      if "江苏" in allUniv:
            schoolNum["江苏"] = schoolNum["江苏"]+1
    print(schoolNum)
    name_list = ['湖南', '江苏']
    num_list = , 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 编辑

数据好像是直接返回全部的,下一页没看到再次请求服务器获取数据,懒得研究,就爬了第一页数据。你的代码不想看,也没贴错误,懒得想。所以我怎么简单怎么来了....

diku 发表于 2021-12-5 21:17

先不说爬虫,整体python的代码小错误较多,我按照你的逻辑先把程序跑通了,之前的程序跑不起来。另外说实话用xpath来筛选数据更方便一些,另外这个代码只能爬第一页,其他数据在payload.js里面,下面代码只是按照你的逻辑爬一页数据而已,楼主可以对照着看下
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').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
      except Exception:
            break
      for j in range(5):
            u = u.strip()
      print("{0:<10}\t{1:{5}<10}\t{2:{5}<10}\t{3:{5}<10}\t{4:{5}<10}".format(
      u, u, u, u, u, chr(12288)))

# 这是统计湘苏两省前500高校数及可视化函数
def data_display(num):
    schoolNum = {"湖南": 0, "江苏": 0}
    for i in range(num):
      try:
            u = allUniv
            if u == '湖南' or u == '江苏':
                schoolNum] = schoolNum]+1
      except:
            break
    print(schoolNum)
    name_list = ['湖南', '江苏']
    num_list = , 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
数据好像是直接返回全部的,下一页没看到再次请求服务器获取数据,懒得研究,就爬了第一页数据。你的代码不 ...

谢谢!太谢谢了
页: [1]
查看完整版本: 爬虫完整代码查找错误