第一次作业
- 作业①:
- 要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
- 输出信息:
|
排名 |
学校名称 |
省市 |
学校类型 |
总分 |
|
1 |
清华大学 |
北京 |
综合 |
852.5 |
|
2...... |
|
|
|
1)作业代码和图片:
代码内容:
import requests from bs4 import BeautifulSoup import bs4 #将url信息从网络中爬取下来,并且将它其中的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 "getHTMLText(url) error" #提取html信息中关键的数据,并且填到一个列表中 def fillUnivList(ulist,html): soup = BeautifulSoup(html,"html.parser") for tr in soup.find("tbody").children: if isinstance(tr,bs4.element.Tag): #print(tr) tds = tr('td') tds1 = tr('a') #print(tds[3].text) #print(tds1[0].string) ulist.append([tds[0].string.strip(),tds1[0].string.strip(),tds[2].text.strip(),tds[3].text.strip(),tds[4].string.strip()]) #格式化打印学校列表信息 def printUnivList(ulist,num): tplt="{0:^8}{1:{5}^10}{2:{6}^10}{3:{7}^10}{4:^6}" print(tplt.format("排名 ","学校名称 "," 省市 ","学校类型","总分 ",chr(12288),chr(12288),chr(12288))) for i in range(num): u=ulist[i] # print(u[0]) print(tplt.format(u[0],u[1],u[2],u[3],u[4],chr(12288),chr(12288),chr(12288))) def main(): uinfo = [] url = 'http://www.shanghairanking.cn/rankings/bcur/2020' html = getHTMLText(url) fillUnivList(uinfo,html) printUnivList(uinfo,30) main()
输出结果图片:

2)心得体会:
这个作业一有几个比较值得要注意的地方,第一个就是他的学校名称是单独放在a标签下面的,导致读取的时候要单独读取他,而其他的内容则是放在td标签下面的;第二个就是读取省市和学校类型的信息要用.text而不能用.string,否则会读取成None的内容;第三个是输出的时候会出现不对齐的情况,是因为当中文字符宽度不够的时候,默认采用西文字符填充,而中西文字符占用的宽度不同,从而导致输出的信息是歪歪扭扭的,这个时候就需要采用中文字符的空格填充chr(12288),即可实现输出居中对齐并且不会歪歪扭扭。
- 作业②:
- 要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
- 输出信息:
|
序号 |
价格 |
商品名 |
|
1 |
65.00 |
xxx |
|
2...... |
|
1)作业代码和图片:
代码内容:
import requests import re from bs4 import BeautifulSoup import urllib.request import urllib.parse def parsePage(ilt,html): try: plt = re.findall(r'\¥\;[\d\.]*',html) # print(plt) tlt = re.findall(r'alt\=\'.*?\'',html) # print(tlt) for i in range(len(plt)): price = eval(plt[i].split(';')[1]) # print(price) title = eval(tlt[i].split('=')[1]) # print(title) ilt.append([price,title]) # print(ilt) except: print("") def printGoodsList(ilt): tplt="{:4}\t{:8}\t{:16}" print(tplt.format(" 序号"," 价格"," 商品名")) count = 0 for g in ilt: count = count + 1 print(tplt.format(count,g[0],g[1])) def main(): # 更改头部信息模拟浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36" } # 设置搜索关键词 wood = '书包' # 将中文转换为url编码 urlwood = urllib.parse.quote(wood, safe='/', encoding='utf-8') # 自定义爬取页数 page = 3 # 初始化下载页数显示 a = 1 # 循环遍历每一页 infoList = [] for i in range(1, page): try: # 获取url内容 r = requests.get(f"https://search.dangdang.com/?key={urlwood}&act=input&page_index={i}", headers=headers) r.raise_for_status() r.encoding = r.apparent_encoding html = r.text # print(html) parsePage(infoList,html) except: continue printGoodsList(infoList) main()
输出结果图片:

2)心得体会:
这题主要就是要用正确的正则表达式来去匹配商品页面的价格和名称,我们可以通过查看网页源代码加上ctrl+f查找关键词来查看商品的价格和名称是被什么包围的,从而写出合适的正则表达式去匹配商品价格和名称,可以通过print函数来检查自己的正则表达式匹配的内容是否正确。
- 作业③:
- 要求:爬取一个给定网页( https://xcb.fzu.edu.cn/info/1071/4481.htm)或者自选网页的所有JPEG和JPG格式文件
- 输出信息:将自选网页内的所有JPEG和JPG文件保存在一个文件夹中
1)作业代码和图片:
代码内容:
import requests from bs4 import BeautifulSoup import urllib.request def getPhotoImg(): url=requests.get("https://xcb.fzu.edu.cn/info/1071/4481.htm") htm=url.text soup = BeautifulSoup(htm,'html.parser') jpeg = soup.find_all('img') a = 1 for i in jpeg: imgsrc = 'https://xcb.fzu.edu.cn'+i.get('src') # print(i.get('src')) filename = 'D:/学习/数据采集与融合技术/爬取图片/%s.jpg'%a urllib.request.urlretrieve(imgsrc , filename) print('下载第%d张' % a) a += 1 print('下载完成!') getPhotoImg()
输出结果图片:


2)心得体会:
这题比较简单,就是找到url信息里面的所有img标签的内容,再加上https://xcb.fzu.edu.cn得到每一张图片的的地址,然后再将图片一个个下载即可