作业一:
要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
输出信息:
| 排名 | 学校名称 | 省市 | 学校类型 | 总分 |
|---|---|---|---|---|
| 1 | 清华大学 | 北京 | 852.5 | 综合 |
| 2...... |
实验:
import requests # 方式1获取URL信息
import urllib.request # 方式2获取URL信息
from bs4 import BeautifulSoup
import bs4
# 从网络上获取大学排名网页内容。
def getHTMLText(url): # 获取URL信息,输出内容
# =========================方式1获取=========================
try:
res = requests.get(url) # 使用requests库爬取
res.raise_for_status() # 产生异常信息
res.encoding = res.apparent_encoding # 修改编码
return res.text # 返回网页编码
except Exception as err:
print(err)
# =========================方式2获取=========================
try:
req = urllib.request.Request(url)
# 打开URL网站的网址,读出二进制数据,二进制数据转为字符串
data = urllib.request.urlopen(req).read.decode()
return data
except Exception as err:
print(err)
# 提取网页内容中信息到合适的数据结构.
def fillUnivList(ulist, html): # 将html页面放到ulist列表中(核心)
# 解析网页文件(使用html解释器)
soup = BeautifulSoup(html, "html.parser")
# soup.prettify() # 把soup对象的文档树变换成一个字符串
# 数据结构:所用数据都封装在一个表格(标签tbody)中,单个学校信息在tr标签中,详细信息在td标签中
# 学校名称在a标签中,定义一个列表单独存放a标签内容
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag): # 如果tr标签的类型不是bs4库中定义的tag类型,则过滤掉
a = tr('a') # 把所用的a标签存为一个列表类型
tds = tr('td') # 将所有的td标签存为一个列表类型
ulist.append([tds[0].text.strip(), a[0].string.strip(), tds[2].text.strip(),
tds[3].text.strip(), tds[4].text.strip()])
# 使用strip()函数,它的作用是用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
# 利用数据结构展示并输出结果:定义函数
def printUnivList(ulist1, num): # 打印出ulist列表的信息,num表示希望将列表中的多少个元素打印出来
# 格式化输出
tplt = "{0:^10}\t{1:^10}\t{2:^12}\t{3:^12}\t{4:^10}"
print(tplt.format("排名", "学校名称", "省份", "学校类型", "总分"))
for i in range(num):
u = ulist1[i]
print(tplt.format(u[0], u[1], u[2], u[3], u[4]))
def main():
uinfo = [] # 将大学信息放到列表中
url = "https://www.shanghairanking.cn/rankings/bcur/2020"
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 25) # 一个界面的数据
if __name__ == '__main__':
main()
结果:

心得体会:
本次实验我使用了urllib和bs4库完成对大学排名信息的爬取,难点在于多页爬取。主要的解决方法是:一是查找数据接口,找到不同数据页面所需要的请求格式,二是使用selenium找到解析html源码,找到按钮标签。
作业二:
要求:
用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
输出信息:
| 序号 | 价格 | 商品名 |
|---|---|---|
| 1 | 65.00 | xxx |
| 2...... |
实验:
import re
import requests
from bs4 import BeautifulSoup
from pprint import pprint
def parsePage(ilt, html):
try:
plt = re.findall(r'\"view_price\"\:\"{\d.}*\"', html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
for i in range(plt):
price = eval(plt[i].split(':')[1])
title = eval(tlt[1].split(':')[1])
ilt.append([price, title])
except:
print("")
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():
depth = 2
infoList = [] # 输出结果保存
for i in range(depth):
try:
url = 'http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input' + '&page_index={}'.format(i+1)
zymk = requests.get(url)
html=zymk.text
html1 = BeautifulSoup(html, "lxml")
html2 = html1.select("ul[class='bigimg cloth_shoplist'] li")
parsePage(infoList, html2)
for i in html2:
name = i.a.attrs['title']
price = i.select('p[class="price"]')[0].text
infoList.append((name, price))
except:
continue
printGoodsList(infoList)
main()
结果:

心得体会:
本次任务用requests和re库方法爬取当当商品比价,以关键词“书包”搜索页面的数据,爬取商品名称和价格。通过这个任务,我掌握了REQUEST库和BEAUTIFULSOUP,还掌握了一些翻页知识。我开始觉得任务十分困难,后来,在同学的帮助下,我成功爬取了网页。
作业三:
要求:
爬取一个给定网页(https://xcb.fzu.edu.cn/info/1071/4481.htm)或者自选网页的所有JPEG和JPG格式文件
输出信息:
将自选网页内的所有JPEG和JPG文件保存在一个文件夹中
实验:
import requests
import urllib.request
from bs4 import BeautifulSoup
import os
import re
def pku():
url = 'https://xcb.fzu.edu.cn/info/1071/4481.htm'
filename = r'C:\Users\zlf\Desktop\作业\image'
html = requests.get(url)
html1 = html.text
soup = BeautifulSoup(html1,'html.parser')
soup1 = soup.findAll('img')
img_re = re.compile(r'src="(.*?)" ')
soup2 = img_re.findall(str(soup1))
x = 1
for i in soup2:
if not i.startswith('http'):
i = 'http://xcb.fzu.edu.cn'+i
zymk = requests.get(i).content
with open(os.path.join(filename, str(x)+'.jpg'), 'wb') as f:
try:
f.write(zymk)
print('下载第%d张' % x)
except:
print("URLError")
x += 1
print('**下载完成!**')
pku()
结果:

心得体会:
本次任务将网页(https://xcb.fzu.edu.cn/info/1071/4481.htm)所有JPEG和JPG格式文件下载。
通过这个任务,我学习了正则表达式re的引用。作业其实不是特别难,但是寻找图片是最困难的一步。我试了很多种方法,终于成功了。