作业①:
实验内容
题目:
- 要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
- 输出信息:
排名 学校名称 省市 学校类型 总分
1 清华大学 北京 综合 852.5
2 ......
代码:
import urllib.request
from bs4 import BeautifulSoup
url = "http://www.shanghairanking.cn/rankings/bcur/2020"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "html.parser")
print("排名\t学校名称\t省市\t类型\t总分")
for tr in soup.find('tbody').children:
r = tr.find_all("td")
for i in range(5):
if i == 1:
n = r[i].find("a").text.strip()
print(n, end="\t")
else:
print(r[i].text.strip(), end="\t")
print()
运行结果:

心得体会:
观察网页源码时发现我们所需的数据保存在tbody下td的内容中,直接爬就行。但爬第二项大学名称时会发现输出了“清华大学 Tsinghua University 双一流/985/211”,后面跟着我们不需要的内容,发现在第一个a标签下的内容只有清华大学,就只获取这一部分即可。
作业②:
实验内容:
题目:
- 要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
- 输出信息:
序号 价格 商品名
1 65.00 xxx
2 ......
代码:
import re
def getHtml(url):
header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50',
'cookie' : 'shshshfpa=5a8bccff-dc77-5e2f-7965-b4242f91b34e-1637938218; TrackID=1JTlguoTiLQvB4iGSwTgyLJTiQwYXvP--kbxpJhKJvLpH8n5TA-UJ4Mc72cS4oymQHWK6emaLq2988Th3PXi1fzwWq-nO5F1-Qp-Bo7TLz0wiowFAjhv1z5tdTn9VeYVL|||vRWEfAorskVherEWV9N26A; shshshfp=b704ec7f4eb6040223cac23ec1b36e69; areaId=16; ipLoc-djd=16-1303-0-0; PCSYCityID=CN_350000_350100_0; __jdu=1694968655458192479244; shshshfpx=5a8bccff-dc77-5e2f-7965-b4242f91b34e-1637938218; 3AB9D23F7A4B3CSS=jdd03RYBGENB6INY6GAYFFJ3PUZVZEWYHBEPZTCF7HR6PBUDKVEYXTPKKN7KM37WYR4VSXQ5ZXDA7D2MEBWZNDLLCCN2FQYAAAAMKWZ5R5JAAAAAADJYVP3H626GX7QX; _gia_d=1; shshshsID=7fff9901fdb6af97019f9f560307937f_1_1695278643007; shshshfpb=AAjs-e7aKEovM_9x3Xi95ZbQkL5GzThY3k4IYQAAAAAA; unpl=JF8EALJnNSttCxxQAEkBH0EUSVRcWwgNTR4GaDVWBFoPSwEHTwsfEhN7XlVdXxRKHx9sZxRUWFNOUQ4aBysSEXteU11bD00VB2xXXAQDGhUQR09SWEBJJV9dWVkKSxcCbWAMZG1bS2QFGjIbFRhOVVNXWgxPEgdmZw1XWF5DVwAeMhoiF3ttZFhVCk4eAl9mNVVtGh8IAB8HEhsZBl1TVlgATB4Ea2MAUFRYQ1cAHQoYFxV7XGRd; _reuuid=0b61c53b014b469ea528499e628b68db; re_mbp=CDoQ8IvM-gEaLjM4NjUzMTEwMzY4XzBfYmY1NGMyNWI1Mzg5NGQ0Nzg0NmNiYTZmMWQzZTg1MTIgAEICcmlaLjM4NjUzMTEwMzY4XzBfYmY1NGMyNWI1Mzg5NGQ0Nzg0NmNiYTZmMWQzZTg1MTI; __jda=122270672.1694968655458192479244.1694968655.1694968655.1695278637.2; __jdc=122270672; __jdv=122270672|haosou-search|t_262767352_haosousearch|cpc|38653110368_0_bf54c25b53894d47846cba6f1d3e8512|1695278648960; __jdb=122270672.3.1694968655458192479244|2.1695278637; 3AB9D23F7A4B3C9B=RYBGENB6INY6GAYFFJ3PUZVZEWYHBEPZTCF7HR6PBUDKVEYXTPKKN7KM37WYR4VSXQ5ZXDA7D2MEBWZNDLLCCN2FQY',
'Content-Type': 'application/json'
}
r = requests.get(url, headers=header)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
def getdata(html):
print("{:4}\t{:8}\t{:16}".format("序号", "价格", "商品名称"))
p = re.findall(r'"sku_price":"[\d\.]*"', html) #[\d\.]匹配数字或小数点
t = re.findall(r'"ad_title_text":".+?"',html) # 加问号懒惰匹配,匹配到第一个"就结束了
for i in range(len(p)):
price = eval(p[i].split(':')[1])
name = eval(t[i].split(':')[1]) #冒号分割,eval去引号
print("{:4}\t{:8}\t{:16}".format(i, price, name))
if __name__ == '__main__':
url = "https://re.jd.com/search?keyword=%E4%B9%A6%E5%8C%85&enc=utf-8
html = getHtml(url)
# print(html)
getdata(html)
运行结果:

心得体会:
爬取京东中“书包”的商品数据,用requests返回json类的数据,输出返回的数据观察发现里面"sku_price"存的值是价格,"ad_title_text"存的值是商品名称,用re匹配这部分并用split切割出具体值。
作业③:
实验内容:
题目:
- 要求:爬取一个给定网页( https://xcb.fzu.edu.cn/info/1071/4481.htm )或者自选网页的所有JPEG和JPG格式文件
- 输出信息:将自选网页内的所有JPEG和JPG文件保存在一个文件夹中
代码:
import urllib.request
import requests, os
from bs4 import BeautifulSoup
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50',
}
url = "https://xcb.fzu.edu.cn/info/1071/4481.htm"
html = urllib.request.urlopen(url)
soup = BeautifulSoup(html, "html.parser")
if not os.path.exists('./pictures'):
os.mkdir('./pictures')
for p in soup.find_all("p", attrs={"class": "vsbcontent_img"}):
path = str(p).split(" ")[2].split("\"")[1]
detail_url = 'https://xcb.fzu.edu.cn/' + path
detail_name = path.split("/")[-1].split("?")[0]
detail_path = './pictures/' + detail_name
detail_data = requests.get(url=detail_url, headers=headers).content
with open(detail_path, 'wb') as fp:
fp.write(detail_data)
print(detail_name, 'seccess!!')
运行结果:


心得体会:
写代码的时候没想到可以直接搜索"img",而是搜索了img的上一级"p",然后繁琐的把图片的路径分割出来。不过结果一样都是得到图片的路径。点开图片详情页发现图片路径不只我们得到的部分路径,前面还要加上'https://xcb.fzu.edu.cn/'。