第一次作业——结合三次小作业

作业①:
要求:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
输出信息:

排名 学校名称 省市 学校类型 总分
1 清华大学 北京 综合 852.5
2 ... ... ... ...
1)代码:
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 ... ...
1)代码
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一看觉得挺难的,后面大佬11zhi讲解了一下,为有源头活水来!此次作业我对正则的理解更加深入,有催人跑的意思。

posted @ 2020-09-28 16:48  家住海边所以浪  阅读(161)  评论(1编辑  收藏  举报