确定爬虫方案是否可行
1)页面信息是否在HTML代码中。
- 有一些页面内容是通过javascript 动态生成的。
2)查看robot 约定。
- 一般来说爬虫需要遵守相关的robot 协议。
程序的结构设计
1)获取网页内容。
2)提取网页内容,并将信息储存在合适的数据结构中。
3)利用数据结构,展示并输出信息。
程序的结构化实现
根据程序设计的三步结构,设计相关的函数。并最后封包在一个函数中输出。
代码
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
# 通过request库获取页面信息
try:
hd = {'user-agent': 'Chrome/10'} # 修改头部信息
r = requests.get(url, timeout = 30, headers = hd)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ''
def fillUnivList(ulist, html):
# 利用bs4 解析页面
soup = BeautifulSoup(html, 'html.parser')
for tr in soup.tbody.children:
if isinstance(tr, bs4.element.Tag): # 筛选tbody 中的子节点 tr 的类型,需要为tag 类型
tds = tr('td') # 将 tr 标签中的 td赋值给tds
ulist.append([tds[0].string, tds[1].string, tds[4].string])
# 分别对应td标签中的第1,2,5 列信息,并定义为str类型,添加到ulist中,并封包为一个表格。
def printUnivList(ulist, num):
# 将提取结果打印
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format('排名', '学校名称', '总分', chr(12288))) # 输出信息的第一行打印基本信息
# 当中文宽度不够,系统默认采用西文空白填充
# format 中输出内容分别为10,10,10 字号,居中。并将空格天空修改为中文类型
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
print('Num: ' + str(num))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2020.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 限制输出的结果数目
main()