2020排名 | 全部层次 | 学校类型 | 总分 |
---|---|---|---|
1 | 前2% | 中国人民大学 | 1069.0 |
2 | |||
3 | |||
... | ... |
if __name__ == "__main__": url="https://www.shanghairanking.cn/rankings/bcsr/2020/0812" html = getHTMLText(url) #使用requests爬取网页 list = parsePage(html) #解析网页内容得到列表 printlist(list) #打印得到的列表
def getHTMLText(url): try: headers = { #构造请求头,告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" } # 使用requests req = requests.get(url=url, headers=headers) req.encoding = 'utf-8' data = req.text return data except Exception as err: print(err)
代码如下:
def parsePage(html): soup = BeautifulSoup(html, 'html.parser') # 使用正则表达式提取相关内容 findrank2020 = re.compile(r'<divclass="ranking"data-v-68e330ae="">(.*?)</div>') findlayer = re.compile('</td><tddata-v-68e330ae="">(.*?)<!----></td>') findname = re.compile('imgalt="(.*?)"') findscore = re.compile('</div></td><tddata-v-68e330ae="">(.*?)</td></tr>') try: data = [] # 用于记录得到的内容 for item in soup.find_all('tr')[1:]: item = str(item) item = re.sub("\r|\n|\\s", "", item) #先将空格、换行等内容都删除 rank2020 = re.findall(findrank2020, item)[0] #观察html页面内容得到 layer = re.findall(findlayer, item)[0] name = re.findall(findname, item)[0] score = re.findall(findscore, item)[0] data.append([rank2020,layer,name,score]) return data except Exception as err: print(err)
def printlist(list): tplt = "{0:^10}\t{1:^10}\t{2:^8}\t{3:^8}\t" #调整输出格式 print(tplt.format("2020排名", "全部层次", "学校类型", "总分", chr(12288))) tplt = "{0:^10}\t{1:^10}\t{2:^10}\t{3:^10}" for items in list: rank2020 = items[0] layer = items[1] name = items[2] score = items[3] # 进行半角字符转全角使输出数据对齐 print(tplt.format(strtrans(rank2020), layer, name, strtrans(score), chr(12288)))
序号 | 城市 | AQI | PM2.5 | SO2 | NO2 | CO | 首要污染物 |
---|---|---|---|---|---|---|---|
1 | 北京 | 55 | 6 | 5 | 1.0 | 225 | —— |
2 | |||||||
3 | |||||||
... | ... |
结构与作业一相同
if __name__ == "__main__": url = "https://datacenter.mee.gov.cn/aqiweb2/" html = getHTMLText(url) #使用requests爬取网页 list = parsePage(html) #解析网页内容得到列表 printlist(list) #打印得到的列表
该函数与作业一中的getHTMLText(url)相同
def getHTMLText(url)
分析html页面得到需要提取内容的正则表达式
观察该网页html源代码,发现需要的信息都在 tbody 标签内
并且每一条信息都在tr标签内,于是find所有的tr标签,再进行信息提取
代码如下:
def parsePage(html): soup = BeautifulSoup(html, 'html.parser') body = soup.find("tbody") #解析 html页面内容得到 lis = body.find_all("tr") data = [] try: for i in range(len(lis)): tr = lis[i] td = tr.find_all("td") city = td[0].text #观察html页面内容得到 AQI = td[1].text PM = td[2].text SO2 = td[3].text NO2 = td[4].text CO = td[5].text pollution = td[8].text.strip() data.append([city,AQI,PM,SO2,NO2,CO,pollution]) return data except Exception as err: print(err)
def printlist(list): tplt = "{0}\t\t{1}\t\t{2}\t\t{3}\t\t{4}\t\t{5}\t\t{6}\t\t{7}" #调整输出格式 print(tplt.format("序号", "城市", "AQI", "PM2.5", "SO2", "NO2", "CO", "首要污染物", chr(12288))) for items in list: city = items[0] # 观察html页面内容得到 AQI = items[1] PM = items[2] SO2 = items[3] NO2 = items[4] CO = items[5] pollution = items[6] print(tplt.format(city,AQI,PM,SO2,NO2,CO,pollution, chr(12288)))
if __name__ == "__main__": url = 'http://news.fzu.edu.cn/' html = getHTMLText(url) # 爬取指定网页 picture_list = parsePage(html) # 解析网页 printList(picture_list) # 输出图片链接列表 path = r"D:/mymymy!/爬虫实践/图片" #图片保存路径 save2file(picture_list,path) #将图片保存到本地文件
该函数与作业一中的getHTMLText(url)相同
def getHTMLText(url)
观察该网页html源代码,图片链接所在格式如下:
于是构造如下的正则表达式提取图片链接:
'<img src="(.*?)"'
解析html页面代码如下:
def parsePage(html): # 解析网页 try: p_picture = re.compile(r'<img src="(.*?)"', re.S) # 观察html文件内容后提取出关键字,re.S表示忽略换行符 picturelist = re.findall(p_picture, html) # 查找图片链接 list=[] #用于记录处理后的图片链接(加上 http://news.fzu.edu.cn/才能访问) for link in picturelist: link = "http://news.fzu.edu.cn" + link list.append(link) return list except: return ""
def printList(list): tply="{0:^4}\t{1:^30}" #用于调整输出格式 print(tply.format("序号","图片链接",chr(12288))) count=1 for p in list: print(tply.format(count,p,chr(12288))) count = count + 1
def save2file(img_url_list,path): i=1 for img in img_url_list: new_path = path + str(i) + ".jpg" #给保存的图片命名 urllib.request.urlretrieve(img, new_path) #定义存取本地图片路径 i += 1
1.学到了: 在以往的作业中都有做过类似的题目,实验一进行过程中其实没遇到实质性的难题,学到了更多的是观察html内容然后使用正则表达式提取需要的内容,其二是更熟练地使用了进行爬虫的框架:爬取网页-解析页面-获得数据,用这样的结构能够清晰的完成所做任务(以上三题都是这个结构)。
2.还欠缺: 学到了也是正则表达式,欠缺的也是正则表达式,正则的规则不够熟悉,导致大量时间都是花在正则表达式的选择中,应该多加记忆,多加使用。