[数据采集]实验一

[数据采集]实验一


一、作业①


1 、作业内容

- 要求: 用urllib和re库方法定向爬取给定网址2020中国学科排名的数据。

- 输出信息:

2020排名 全部层次 学校类型 总分
1 前2% 中国人民大学 1069.0
2
3
... ...

2、实现过程

- 主函数部分:

      if __name__ == "__main__":
          url="https://www.shanghairanking.cn/rankings/bcsr/2020/0812"
          html = getHTMLText(url)     #使用requests爬取网页
          list = parsePage(html)      #解析网页内容得到列表
          printlist(list)             #打印得到的列表

(1)使用requests方法爬取网页

      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)

(2)解析html网页内容

代码如下:

      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)

(3)打印得到的信息列表

      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)))

(4)输出结果截图


二、作业②


1 、作业内容

- 要求:用requests和BeautifulSoup库方法设计爬取AQI实时报

- 输出信息:

序号 城市 AQI PM2.5 SO2 NO2 CO 首要污染物
1 北京 55 6 5 1.0 225 ——
2
3
... ...

2、实现过程

- 主函数部分:

结构与作业一相同

      if __name__ == "__main__":
          url = "https://datacenter.mee.gov.cn/aqiweb2/"
          html = getHTMLText(url)     #使用requests爬取网页
          list = parsePage(html)      #解析网页内容得到列表
          printlist(list)             #打印得到的列表

(1)使用requests方法爬取网页

该函数与作业一中的getHTMLText(url)相同

      def getHTMLText(url)

(2)解析html网页内容

分析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)

(3)打印得到的信息列表

      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)))


(4)输出结果截图


三、作业③


1 、作业内容

- 要求:使用urllib和requests和re爬取 福州大学新闻网,得到该网站下的所有图片

- 输出信息:将自选网页内的所有jpg文件保存在一个文件夹中

2、实现过程

  • 主函数部分:
      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)			#将图片保存到本地文件


(1)使用requests方法爬取网页

该函数与作业一中的getHTMLText(url)相同

      def getHTMLText(url)

(2)解析html网页内容

观察该网页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 ""

(3)打印得到的信息列表

      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

(4)将图片保存到本地文件夹

      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

(5)图片链接输出结果截图


(6)保存到本地文件截图

心得体会

1.学到了: 在以往的作业中都有做过类似的题目,实验一进行过程中其实没遇到实质性的难题,学到了更多的是观察html内容然后使用正则表达式提取需要的内容,其二是更熟练地使用了进行爬虫的框架:爬取网页-解析页面-获得数据,用这样的结构能够清晰的完成所做任务(以上三题都是这个结构)。
2.还欠缺: 学到了也是正则表达式,欠缺的也是正则表达式,正则的规则不够熟悉,导致大量时间都是花在正则表达式的选择中,应该多加记忆,多加使用。


附:完整代码地址

posted @ 2021-09-29 23:19  penguin02  阅读(50)  评论(0编辑  收藏  举报