前言
目标网站:中国国家数字图书馆
目标任务:获取全部图书书名,计算平均书名长度
具体过程
1.分析网站
网站URL“http://read.nlc.cn/allSearch/searchList?searchType=1&showType=1&pageNo=1”
包含“pageNo”元素,借此控制页面切换
网页源代码中书名被包含于“书名”之中,通过string的find函数定位切取出书名
全部书名存放于文件中
爬虫部分的代码:
from stat import S_IFBLK
import requests
User_Agent = "随机浏览器识别码"
fp = open("./BookName.txt","a",encoding='utf-8') #储存文件
for i in range(6061): #一共6060页,72716本书
print("No. {}".format(i))
PageNo = str(i)
Url = "http://read.nlc.cn/allSearch/searchList?searchType=1&showType=1&pageNo="+PageNo+"&searchWord=&classification="
r = requests.get(
Url,
headers={'User-Agent':User_Agent}
)
print("\t{}".format(r.status_code))
if(r.status_code == 200):
r.encoding = "utf-8"
Str = r.text
while(Str.find("<span class=\"tt\">") != -1):
pos1 = Str.find("<span class=\"tt\">")
Str = Str[pos1+17:]
pos2 = Str.find("</span>")
bookName = Str[0:pos2]
bookName.replace("\u200E","")
fp.write(bookName+'\n')
else: #被反爬虫了就弹出并且报出中断位置,下次直接从该位置继续
print("Error! now pageNo is {}".format(i))
2.书名处理
将文件中储存的书名全部读入,累加字符长度,除以书本数量得到平均书名长度
代码:
fp = open("./BookName.txt",'r',encoding="utf-8")
ans, num = 0, 0
while(1):
Str = fp.readline()
if(Str == ""):
break
ans += len(Str)
num += 1
print(ans/num)
3.结果部分
中文一个字和英文一个字母都看作一个长度
结果为“39.66392540843831”平均长度
主要还是英文书名拉长了平均长度,另外国家图书馆的书好像书名也基本上挺长的。