爬虫作业
一、请用requests库的get()函数访问如下一个网站20次,打印返回状态,text()内容,计算text()属性和content属性所返回网页内容的长度。搜狗主页(尾号3,4学号做)
import requests wan = "https://www.sogou.com/" def pac(wan): print("第",i+1,"次访问") r = requests.get(wan,timeout=30) r.raise_for_status() print("text编码方式:",r.encoding) print("网络状态码:",r.status_code) # print("text属性:",r.text) # print("content属性:",r.content) #由于结果太长,这里将代码改为打印text属性和content属性的长度后展示最后一次访问结果 print("text属性长度:",len(r.text)) print("content属性长度:",len(r.content)) return r.text for i in range(20): if i==19: print(pac(wan))
运行结果:
二、这是一个简单的html页面,请保持为字符串,完成后面的计算要求。
要求:a 打印head标签内容和你的学号后两位
b 获取body标签的内容
c 获取id为first的标签对象
d 获取并打印html页面的中文字符
参考书:P269
from bs4 import BeautifulSoup import re soup = BeautifulSoup('''<!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("head标签:\n",soup.head,"\n学号后两位:03") print("body标签:\n",soup.body) print("id为first的标签对象:\n",soup.find_all(id="first")) st = soup.text pp = re.findall(u'[\u1100-\uFFFDh]+?',st) print("html页面的中文字符:") print(pp)
运行结果:
三、爬取中国大学爬中国大学排名网站内容
https://www.shanghairanking.cn/rankings/bcur/201611
要求:(一)爬取大学排名(学号尾号学号尾号3,4,爬取年份2016)
(二)把爬取的数据,存为csv文件
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("{:^2}{:^10}{:^10}{:^10}{:^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}{:^14}{:^6}{:^12}{:^12}".format(u[0], u[1], u[2], u[3], u[4])) def main(flag): url = 'https://www.shanghairanking.cn/rankings/bcur/201611' html = getHTMLtext(url) soup = BeautifulSoup(html, "html.parser") list1=fillUnivList(soup) if flag==0: printUnivList(10) #爬取的行数 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('UniversityGrade.csv',index=False)
运行结果如下:
存为csv文件: