python爬虫——利用requests库BeautifulSoup定向爬取网页内容写入txt文件

简单爬取“最好大学网2018大学排名”,爬取结果存入指定 目录下txt文件中

爬取对象 url = http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html

工具:python3.6 IDLE

程序总体上也是分为三步:一、requests.get()获取url信息,并返回r.text;二、用BeautifulSoup解析r.text内容,后去标签中的信息,将爬取到的类似于 “大学名称”、“省份”、“排名”等信息用存入 ulist 列表中;三、对存入ulist列表中的信息进行:打印、输出、保存等进一步详细的操作。

附上程序所有代码:(同样生成了.exe程序文件)

import requests
from bs4 import BeautifulSoup
import bs4
import os

def getHTMLText(url):
    try:
        r = requests.get(url, timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):     #如果tr标签不是bs4库定义的Tag类型将过滤掉
            tds = tr('td')                      #将所有的td标签存为一个列表类型tds
            ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string, tds[4].string])
            
def printUnivList(ulist, num, province):
    root = "F://pics//"
    tplt = "{0:^4}\t{1:{5}^10}\t{2:{5}^6}\t{3:^4}\t{4:^16}"
    print(tplt.format("排名", "学校名称", "省市", "总分", "新生高考成绩得分", chr(12288)))
    if not os.path.exists(root):
        os.mkdir(root)
    with open('F://pics//university_infos.txt', 'a', encoding = 'utf-8') as f:
        f.write(tplt.format("排名", "学校名称", "省市", "总分", "新生高考成绩得分", chr(12288)) + '\n')
        f.close()
    for i in range(num):
        u = ulist[i]
        p = province[0:2] #获取省份的前两个字符
        if p in u[2]:
            print(tplt.format(u[0], u[1], u[2], u[3], u[4], chr(12288)))
            with open('F://pics//university_infos.txt', 'a', encoding = 'utf-8') as f:
                f.write(tplt.format(u[0], u[1], u[2], u[3], u[4], chr(12288)) + '\n')
                f.close()
        elif province in ["所有"]:
            print(tplt.format(u[0], u[1], u[2], u[3], u[4], chr(12288)))
            with open('F://pics//university_infos.txt', 'a', encoding = 'utf-8') as f:
                f.write(tplt.format(u[0], u[1], u[2], u[3], u[4], chr(12288)) + '\n')
                f.close()


def check(inputchar):
    a = ['北京市', '天津市',  '上海市', '江苏省', '浙江省', '安徽省', '福建省', '江西省', '湖南省',\
          '山东省', '河南省', '内蒙古自治区', '湖北省', '宁夏回族自治区', '新疆维吾尔自治区', \
         '广东省', '海南省', '四川省','西藏自治区', '广西壮族自治区', '河北省', '贵州省', \
         '重庆省', '陕西省', '山西省', '云南省', '辽宁省','吉林省', '甘肃省', '黑龙江省', '青海省'\
         '北京', '天津',  '上海', '江苏', '浙江', '安徽', '福建', '江西', '湖南',\
          '山东', '河南', '内蒙古', '湖北', '宁夏', '新疆', \
         '广东', '海南', '四川','西藏', '广西', '河北', '贵州', \
         '重庆', '陕西', '山西', '云南', '辽宁','吉林', '甘肃', '黑龙江', '青海','所有']
    if inputchar[0:2] in a:
        main(inputchar[0:2])
    else:
        cha = input("请正确输入省/市: ")
        check(cha)

    
def main(province):
    uinfo = []
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 600, province)
    while True:
        comd = input("是否继续检索(是/否):")
        if comd in ["是"]:
            str_province = input("请输入需要查询的'省份或所有':")
            check(str_province)
        else:
            break

if __name__ == '__main__':
    print('爬取《最好大学网》2018大学排名,输出信息,保存到F:/pics/university_infos.txt')
    str_province = input("请输入需要查询的'省份或所有':")
    check(str_province)

check函数主要是用来检验 输入的信息是否符合要求,自己觉得代码写的太繁琐,以后养成好习惯,慢慢完善。

运行实例:




猜你喜欢

转载自blog.csdn.net/wang903039690/article/details/80113683