第一次作业——结合三次小作业
作业①:
要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
输出信息:
排名 | 学校名称 | 省市 | 学校类型 | 总分 |
1 | 清华大学 | 北京 | 综合 | 852.5 |
2 | ... | ... | ... | ... |
import requests,re
from bs4 import BeautifulSoup
url = "http://www.shanghairanking.cn/rankings/bcur/2020"
r = requests.get(url)
r.encoding="UTF-8"
soup = BeautifulSoup(r.text, "html.parser")
trList = soup.select("tr")
for tr in trList[1:]:
# 清除tr.text里的\n和*(因为学校名称带个*),替换成空格,然后以空格为分隔得到数组,数组里有很多空字符串"",取数组里的非空字符串,格式化输出
data = [x for x in re.sub("[%s]+" % "\n*"," ",tr.text).split(" ") if x!=""]
p = lambda x:format(x,"<"+str(30)) if x.isdigit() else format(x,"<"+str(30-len(x)))
print(p(data[0]),p(data[1]),p(data[2]),p(data[3]),p(data[4]))
图片:
...
2)心得体会:作业1一看觉得挺难的,后面大佬牛哥讲解了一下,一语中的,让我大致熟悉了爬虫的流程,就是输出格式要思考一番.
作业②:
要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
输出信息:
序号 | 价格 | 商品名 |
1 | 65.00 | xxx |
2 | ... | ... |
import requests
import re
def gethtml(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}
r = requests.get(url,headers=headers)
r.encoding = "UTF-8"
return r.text
def getGoodsMsg(msg):
# 每件商品的信息都包含在<li data-sku=...></li>标签中
m = re.findall("<li data-sku.*>", msg)
# 一开始用其它的爬60项,会有重复的,而且顺序不是从小到大,需要排序一下(由于要求使用requests,实力限制仅有30项)
pos = sorted(list(set([msg.index(i) for i in m])))
print("序号\t价格"+"\t"*5+"商品名")
for i in range(len(pos)):
# 在每个<li>标签中匹配数据
start = pos[i]
end = msg.rindex("</ul>") if i==len(pos)-1 else pos[i+1]
item = msg[start:end]
try:
price = re.search("<i>(\d|\.)+</i>",item).group(0)
name = re.search("<em>[^¥]*?</em>",item).group(0)
# 有的商品名带有 京东超市 ,会带有\n\t,用replace方法去除
print(str(i+1)+"\t"+re.sub("<[^>]*>","",price)+"\t"+re.sub("<[^>]*>","",name).replace("\n","").replace("\t"," "))
except AttributeError as e:
print(e)
continue
if __name__=="__main__":
url = "https://search.jd.com/search?keyword="
goods = "口红"
pageurl = url+goods
msg = gethtml(pageurl)
getGoodsMsg(msg)
图片:
2)心得体会:作业2一看觉得挺难的,后面大佬晟新讲解了一下,茅塞顿开,只用正则还是花了挺长时间,代码原来是处理60项的,爬30项好像没那么多问题,直接两个findAll就行.
作业③:
要求:爬取一个给定网页(http://xcb.fzu.edu.cn/html/2019ztjy )或者自选网页的所有JPG格式文件
输出信息:将自选网页内的所有jpg文件保存在一个文件夹中
1)代码:
import requests
import re
import os
# 存储图片
def saveImg(url, path):
r = requests.get(url)
with open(path, 'wb') as f:
f.write(r.content)
f.close()
print(name+"保存成功")
url = "http://xcb.fzu.edu.cn/"
# 文件夹结尾有\\,便于后续字符串拼接
savepath = "C:\\image\\fzu\\"
# 有jpg和JPG
r = requests.get(url).text.lower()
# 清理注释 注释里的cast1234.jpg 会重复
r = re.sub("<!--(.|\n)*?-->", "", r)
# 从第6位开始取 前5位是src=" | 后面不在<img>标签里
imglist = [imgurl[5:] for imgurl in re.findall("src=\".*?jpg", r)] + re.findall("/attach.*?jpg", r)
# 不存在存储文件夹则创建
if not os.path.exists(savepath):
os.mkdir(savepath)
for imgurl in imglist:
# 相对路径=>绝对路径
if imgurl[0] == "/":
imgurl = url+imgurl
# 找最后一个/出现的位置 取后面的字串作为名字 因为路径都是http://xcb.fzu.edu.cn/cxcgg/fuji.jpg这样的
name = imgurl[imgurl.rindex("/")+1:]
if os.path.exists(savepath+name):
print(name+"已存在")
else:
saveImg(imgurl, savepath+name)
图片:
2)心得体会:作业3一看觉得挺难的,后面大佬11和zhi讲解了一下,为有源头活水来!此次作业我对正则的理解更加深入,有催人跑的意思。