作业①:
- 要求:用urllib和re库方法定向爬取给定网址 (https://www.shanghairanking.cn/rankings/bcsr/2020/0812 )的数据
-
输出信息:
2020排名 全部层次 学校类型 总分 1 前2% 中国人民大学 1069.0 2...... (1.1)爬取大学排名实验
- 实验过程:
1.获取网页源码html文件:
def getHTMLTextUrllib(url): try: headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31"} req=urllib.request.Request(url,headers=headers) resp=urllib.request.urlopen(req) data =resp.read() unicodeData =data.decode() #dammit = UnicodeDammit(data,["utf-8","gbk"]) #unicodeData= dammit.unicode_markup return unicodeData except: return ""
2.开始对页面需要爬取的元素进行检查,编写正则表达式筛选出有用信息(如下):
- 检查展示:
<-------------------------------------------------------------------------------------------->
<-------------------------------------------------------------------------------------------->
<-------------------------------------------------------------------------------------------->
<-------------------------------------------------------------------------------------------->
rank=r'class="ranking" data-v-68e330ae>\n.*?\n </div>' #匹配排名 level=r'<td data-v-68e330ae>\n.*?%' #匹配层次 name=r'class="name-cn" data-v-b80b4d60>(.*?)</a>' #匹配学校 score=r'<td data-v-68e330ae>\n.*?\n </td>' #匹配总分
3.编写打印函数
def printList(ulist, num): #中西文混排时,要使用中文字符空格填充chr(12288) tplt = "{0:^10}\t{1:{4}^8}\t{2:{4}^15}\t{3:^5}" print("{0:^9}\t{1:^10}\t{2:{4}^15}\t{3:^1}".format("2020排名", "全部层次", "学校名称", "总分", chr(12288))) for i in range(num): u = ulist[i] print(tplt.format(u[0], u[1], u[2], u[3],chr(12288)))
4.编写主函数
def main(): rank = [] url = 'https://www.shanghairanking.cn/rankings/bcsr/2020/0812' html = getHTMLTextUrllib(url) fillList(rank, html) printList(rank, 20) main()
- 结果展示:
(1.2)心得
此题之前是是通过beautiful soup的方法做,比较简单,尝试用正则之后发现在本题中“\n”与一连串的空格是我们使用re查找数据的难点,在正则中引入换行符,后面split(\n)来处理。
作业②:
- 要求:用requests和Beautiful Soup库方法设计爬取https://datacenter.mee.gov.cn/aqiweb2/ AQI实时报。
- 输出信息:
- 实验过程:
- 结果展示:
- 要求:使用urllib和requests爬取(http://news.fzu.edu.cn/),并爬取该网站下的所有图片
- 输出信息:将网页内的所有图片文件保存在一个文件夹中
- 实验过程:
1.获取网页源码html文件:
序号 城市 AQI PM2.5 SO2 No2 Co 首要污染物 1 北京 55 6 5 1.0 225 — 2...... (2.1)爬取AQI实验
1.获取网页源码html文件:
def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return ""
2.开始对页面需要爬取的元素进行检查,用beautiful soup筛选出有用信息(如下):
def fillUnivList(ulist, html): soup = BeautifulSoup(html, "html.parser") for tr in soup.find('tbody').children: if isinstance(tr, bs4.element.Tag): #检查tr标签,排除tr为普通字符串,需要引入bs4库 tds = tr('td') ulist.append([tds[0].text.strip(), tds[1].text.strip(), tds[2].text.strip(), tds[4].text.strip(), tds[5].text.strip(), tds[6].text.strip(), tds[8].text.strip()])
3.打印结果:
def printUnivList(ulist, num): # 中西文混排时,要使用中文字符空格填充chr(12288) print("{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}".format("序号","城市", "AQI", "PM2.5", "SO2", "NO2", "CO", "首要污染物")) # 对中文输出的列,进行用第6个参数即中文空格chr(12288)填充 for i in range(num): u = ulist[i] print("{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}\t{:4}".format(i+1, u[0], u[1], u[2], u[3], u[4], u[5], u[6]))
(2.2)心得
此题是通过beautiful soup的方法做,比较简单,直接采用循环方法找到tbody下的所有tr节点,再找到td,获取信息,与之前的作业并无太大差别。
作业③:
def getHtml(url): header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/92.0"} r = requests.get(url, headers=header) r.raise_for_status() r.encoding = r.apparent_encoding return r.text
2.查找li 下的img节点
url='http://news.fzu.edu.cn/' # data=urllib.request.urlopen(url).read().decode("utf-8","ignore") html = getHtml(url) soup = BeautifulSoup(html, "html.parser") imagelist = [] src = [] imagelist = soup.select('li img')
3.提取src
img = r'img.+?src="(.*?)"' for i in imagelist: src.append(re.findall(img, str(i))) print(src)
4.打印图片:
for j in range(0, len(src)): address = src[j][0] print("第"+str(j+1)+"张爬取成功") newurl = "http://news.fzu.edu.cn"+str(address) print(newurl) file="E:/测试/tupian/"+"第"+str(j+1)+"张"+".jpg"#file指先在指定文件夹里建立相关的文件夹才能爬取成功 urllib.request.urlretrieve(newurl, filename=file)
结果如下:
(2.2)心得
此题与之前做的爬取商城图片类型相似(甚至不要翻页处理),主要是构造出正则表达式输出imgz中的src,然后用urllib.request.urlretrieve进行下载。