数据采集第一次作业

作业①

(1)实验要求:

   ------用urllib和re库方法定向爬取给定网址(https://www.shanghairanking.cn/rankings/bcsr/2020/0812 )的数据

   ------输出结果

2020排名 全部层次 学校类型 总分
1 前2% 清华大学 1069.0
...      

 

 

 

 

(2)题目分析:

首先用函数 getHTMLTextUrllib,来获取网页的信息:

 1 def getHTMLTextUrllib(url):
 2     try:
 3         headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
 4         req=urllib.request.Request(url,headers=headers)
 5         resp=urllib.request.urlopen(req)
 6         data =resp.read()
 7         unicodeData =data.decode()
 8         #dammit = UnicodeDammit(data,["utf-8","gbk"])
 9         #unicodeData= dammit.unicode_markup
10         return unicodeData
11     except:
12         return ""

然后通过分析网页源代码,来定义四个正则表达式reg1,reg2,reg3,reg4,分别对应2020排名,全部层次,学校类型,总分:

reg1=r'data-v-68e330ae>\n.*?\n                        </div>'

reg2=r'<td data-v-68e330ae>\n.*?%'

reg3=r'class="name-cn" data-v-b80b4d60>(.*?)</a>'

reg4=r'<td data-v-68e330ae>(\n\s*?.*\s*?)<\/td>'

接着定义函数 fillList 来将HTML页面的内容存到列表中:

 1 def fillList(ulist, html):
 2     reg1=r'data-v-68e330ae>\n.*?\n                        </div>' #用来正则匹配2020排名
 3     reg2=r'<td data-v-68e330ae>\n.*?%' #用来匹配全部层次
 4     reg3=r'class="name-cn" data-v-b80b4d60>(.*?)</a>' #用来匹配学校类型
 5     reg4=r'<td data-v-68e330ae>(\n\s*?.*\s*?)<\/td>' #用来匹配总分
 6     r=re.findall(reg1,html)
 7     l=re.findall(reg2,html)
 8     n=re.findall(reg3, html)
 9     s=re.findall(reg4,html)
10     for i in range(len(r)):
11         R=r[i].split("\n")[1].strip()
12         L=l[i].split("\n")[1].strip()
13         N=n[i].strip()
14         S=s[i].strip()
15         ulist.append([R, L, N, S])

然后定义一个输出函数,用chr(12288)来调整对齐:

1 def printList(ulist, num):
2     #中西文混排时,要使用中文字符空格填充chr(12288)
3     tplt = "{0:^10}\t{1:^5}\t{2:{4}^10}\t{3:^5}"
4     #对中文输出的列,进行用第4个参数即中文空格chr(chr12288)填充
5     print(tplt.format("2020排名", "全部层次", "学校名称", "总分",chr(12288)))
6     for i in range(num):
7         u = ulist[i]
8         print(tplt.format(u[0], u[1], u[2], u[3],chr(12288)))

最后定义并调用主函数即可:

1 def main():
2     rank = []
3     url = 'https://www.shanghairanking.cn/rankings/bcsr/2020/0812'
4     html = getHTMLTextUrllib(url)
5     fillList(rank, html)
6     printList(rank, 25)
7 
8 main()

输出结果:

 码云地址:(https://gitee.com/shuai321/data-acquisition/blob/master/作业1/作业1.1.py)

(3)心得体会:

第一题在之前有做过相关的练习,但是之前是利用beautifulsoup库来完成的,这次利用re库正则表达遇到了很多问题,一直没有找到正确的正则表达式,一直乱码。后来发现有的有换行符会影响,总之对于正则表达式不够熟练,今后还要多加练习!

 

作业② 

 (1)实验要求:

-----用requests和Beautiful Soup库方法设计爬取https://datacenter.mee.gov.cn/aqiweb2/ AQI实时报。

-----输出结果

序号 城市 AQI PM2.5 SO2 NO2 CO 首要污染物
1 北京 ... ... ... ... ... ....
2              

 

 

 

 

 (2)题目分析:

首先用函数getHTML来获取网页内容:

1 def getHTML(url):
2     try:
3         headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
4         r =  requests.get(url,headers=headers,timeout=30) #用get函数来获取URL信息
5         r.raise_for_status() #用来产生异常信息
6         r.encoding = r.apparent_encoding #用来修改它的编码
7         return r.text
8     except:
9         return ""

分析网页源代码发现,整个信息是存在tbody标签中,每一个城市又存在于tr标签中,每一个信息在td标签中

 因为本题要求用beautifulsoup,代码如下:

1 def fillUnivList(ulist, html):
2     soup = BeautifulSoup(html, "html.parser")
3     for tr in soup.find('tbody').children:
4         if isinstance(tr, bs4.element.Tag):#检查tr标签,排除tr为普通字符串,需要引入bs4库
5             tds = tr('td')
6             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()])

定义一个输出函数:

1 def printUnivList(ulist, num):
2     tplt = "{0:^10}\t{1:{8}^10}\t{2:^10}\t{3:^10}\t{4:^10}\t{5:^10}\t{6:^10}\t{7:{8}^10}"
3     print(tplt.format("序号", "城市", "AQI", "PM2.5", "SO2", "NO2", "CO", "首要污染物",chr(12288)))
4     for i in range(num):
5         u = ulist[i]
6         print(tplt.format(i, u[0], u[1], u[2], u[3], u[4], u[5], u[6],chr(12288)))

最后定义并调用主函数即可:

1 def main():
2     uinfo = []
3     url = 'https://datacenter.mee.gov.cn/aqiweb2/'
4     html = getHTML(url)
5     fillUnivList(uinfo, html)
6     printUnivList(uinfo, 20)
7 
8 main()

输出结果:

 码云地址:(https://gitee.com/shuai321/data-acquisition/blob/master/作业1/作业1.2.py)

(3)心得体会:

本题目相对完成较快,由于之前有做过类似的题目,对于beautifulsoup掌握的比较好,因此完成的比较顺利。

 

作业③

 1)实验要求:

-----使用urllib和requests和re爬取一个给定网页(https://news.fzu.edu.cn/)爬取该网站下的所有图片

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

(2)题目分析:

通过查看网页源代码,来寻找图片所在的标签:

 定义正则表达式:

pic=re.findall(r"/attach.*?.jpg",html)

通过urlretrieve方法来将爬取到图片存放在我们本地文件夹,代码如下:

 1 import urllib.request
 2 import re
 3 count=1 #图片数量
 4 url="http://news.fzu.edu.cn"
 5 html=urllib.request.urlopen(url).read().decode("utf-8")
 6 pic=re.findall(r"/attach.*?.jpg",html)
 7 path="G:/news/img/"
 8 for i in pic:
 9     urllib.request.urlretrieve("http://news.fzu.edu.cn"+i,path+str(count)+".jpg")
10     print (""+str(i)+"张图片爬取成功!")
11     count+=1
12 print("爬取结束!!!")

输出结果:

 码云地址:(https://gitee.com/shuai321/data-acquisition/blob/master/作业1/作业1.3.py)

(3)心得体会:

这个题目在开始时遇到了一些问题,一直无法访问到页面的url,后来将https改成http后成功解决了这个问题,而且本题的正则表达式比较好找。

 

posted @ 2021-09-30 20:00  哈哈哈GS  阅读(63)  评论(0编辑  收藏  举报