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


    作业一:

    1)UniversitiesRanking实验:

  • 代码:
  • import requests
    from bs4 import BeautifulSoup
    
    t = requests.get("http://www.shanghairanking.cn/rankings/bcur/2020")
    t.encoding = 'utf-8'  # 以'utf-8'编码
    soup = BeautifulSoup(t.text, "html.parser")
    print("{0:^4}{1:{5}^16}{2:^6}{3:^8}{4:^9}".format('排名', '学校名称', '省份', '学校类型', '总分',
                                                                chr(12288)))
    # chr(12288):中文空格,{x:^6}:参数x在6个长度中居中对齐,最长的学校名长度为13,于是设置第二项长度为16
    for i in soup.find("tbody").children:  # 查找tbody的下一级子节点
        line = i.find_all(
            "td")
        '''i是标签,为网页中表格的一行,line是查找到该行的所有单元格,line[0]为排名,line[1]为学校名称,line[2]为省份,
        line[3]为学校类型,line[4]为总分'''
        print("{0:^6}{1:{5}^16}{2:^6}{3:^8}{4:^9}".format(line[0].text.strip(), line[1].text.strip(),
                                                                      line[2].text.strip(), line[3].text.strip(),
                                                                      line[4].text.strip(), chr(12288)))
    

    学校排名的表格在tbody标签中

    ...

  • 代码结果:
  • 2)心得体会:

    本次实验中体会对html的编码读取,beautifulsoup中对html的节点查找,以及对html子节点的相关操作,注意网页节点规划的特点,在本次实验中,排名表格的内容都在tbody下,整个网页也只有一个tbody标签,因此遍历tbody下的内容,对其包含的表格进行读取并print出来

    作业二:

    1)GoodPrice实验:

  • 代码:
  • import re
    import requests
    import bs4
    
    
    def get_html(url):
        # 使用自己的cookie模仿个人访问网站
        a = {
            'cookie': 'hng=CN%7Czh-CN%7CCNY%7C156; thw=cn; '
                      'enc=OKoR22O6wnUkrK%2B2KQ85C6uN921B3BjCy2jM7rIAgmfDNt0Y8CZjNGdYoCGbAA9yDJfCdlOXksVX6XrxFXc3Ag%3D%3D'
                      '; t=57dff2bbd10073249db2a33942981f45; _m_h5_tk=f16cdb464113f733659a47165e532890_1600609442057; '
                      '_m_h5_tk_enc=d5b5c5ec9fc4d4d54957007ec52215bb; cookie2=2a39cc31318294aa2c2df033a22542db; '
                      '_tb_token_=eb33e5fe5eede; xlly_s=1; _samesite_flag_=true; alitrackid=www.taobao.com; '
                      'lastalitrackid=www.taobao.com; mt=ci=0_0; JSESSIONID=6CCF0A80A9AF49EAF03D3A83B5C6CE4E; '
                      'cna=H/+XF0R3j2MCAXAx1E/hmp3S; '
                      'l=eBPpMlD4OLJ3gBcoBO5ahurza77TqQdffsPzaNbMiInca6KPTFg1uNQ4qDZ97dtjgt5bShtrb3kJjReXPqaU'
                      '-K1Hrt7APlUOrbvpJe1..; isg=BC4udjUl_X5-hgnsmUYtSOhAf4TwL_IpUz-lxVj0VDHsO8mV1LtsOAM586fX4-pB; '
                      'tfstk=clX1BAtOXV01A3NqQGZeuwEY8jvcZCmWc5TGf1_MZQus1OI1igHyPHoGiqHpwH1..; '
                      'sgcookie'
                      '=E100pz0cuVRkvVWabrl7HUvaJqbCXdomMEEfdcT1OntyWxRSKwvQRYISESfvxrHyGkFCYGTwjLec2vzfzDN2zOYjHA%3D%3D; '
                      'unb=2708419240; uc1=existShop=false&cookie14=Uoe0bU5UsGiZVQ%3D%3D&cookie15=WqG3DMC9VAQiUQ%3D%3D'
                      '&cookie16=URm48syIJ1yk0MX2J7mAAEhTuw%3D%3D&pas=0&cookie21=VT5L2FSpccLuJBreK%2BBd; '
                      'uc3=lg2=W5iHLLyFOGW7aA%3D%3D&id2=UU8INKoJ6JFAjw%3D%3D&nk2=CdC%2F4kd9RFo%3D&vt3=F8dCufeJMxET3BlgYEE'
                      '%3D; csg=4deab7b1; lgc=jchxchhh; cookie17=UU8INKoJ6JFAjw%3D%3D; dnk=jchxchhh; '
                      'skt=5c3397abba15da67; existShop=MTYwMDYwNDkwMg%3D%3D; '
                      'uc4=nk4=0%40C%2B8F3HpVSiLdC4JSbXQh9mqW9A%3D%3D&id4=0%40U22PEY5jIHEY3Ju8b5OmbkYXErKM; '
                      'tracknick=jchxchhh; _cc_=W5iHLLyFfA%3D%3D; _l_g_=Ug%3D%3D; sg=h0d; _nk_=jchxchhh; '
                      'cookie1=BxuR43Et4NErOE2h%2F3c%2F4Cr5mTfpzhK18%2FNI%2FUtmJcw%3D',
            'user-agent': 'Mozilla/5,0'}
        try:
            t = requests.get(url, headers=a)
            t.encoding = 'utf-8'
            return t.text
        except:
            print("网站访问失败")
    
    
    def get_info(html):
        try:
            s = []
            price_list = re.findall(r'"view_price":"[d.]*"', html)  # 在html文本中匹配价格的正则
            good_list = re.findall(r'"raw_title":".*?"', html)  # 在html文本中匹配商品名的所有字符
            for i in range(len(price_list)):
                price = eval(price_list[i].split(":")[1])  # 去除冒号后字符串分隔为两个,选择后面项的值
                good = eval(good_list[i].split(":")[1])
                s.append([price, good])
            return s
        except:
            print("获取商品信息失败")
            return ""
    
    
    def print_good(good):
        print("	{0:^4}{1:^8}	{2:^32}".format('序号', '价格', '商品名'))
        count = 1
        for a in good:
            print("	{0:{3}^4}{1:{3}^8}	{2:{3}^32}".format(count, a[0], a[1],chr(12288)))
            count = count + 1
    
    keyword='辣条'#检索的关键词
    url = 'https://s.taobao.com/search?spm=a21bo.2017.201867-links-7.2.5af911d9sRcfoN&q='+keyword
    html = get_html(url)
    good = get_info(html)
    print_good(good)
    

    商品,价格字段:

    cookie查看:

  • 代码结果:
  • 2)心得体会:

    本次作业在尝试多次爬取时会只返回空值,询问同学后找到了解决办法,利用自己的cookie访问,来模仿个人游览网页。本次实验主要在商品和价格的正则查找,同时额外补充匹配任意字符的正则方法用来匹配双引号中商品名称。

    作业二:

    1)JPG实验:

  • 代码:
  • import requests
    import urllib
    import re
    from bs4 import BeautifulSoup
    res = requests.get('http://xcb.fzu.edu.cn/')
    soup = BeautifulSoup(res.text, 'html.parser')
    s = []
    it_list = re.findall(r'src="(.*?.jpg)"', str(soup))#正则匹配jpg格式的图片,括号内为返回的内容
    print(it_list)#图片地址打印
    for it in it_list:
        if it[0] == '/':
            it = 'http://xcb.fzu.edu.cn' + it#对网页本地服务器索引的图片添加该网址
        s.append(it)
    s1 = set(s)
    for url in s1:
        r = requests.get(url)
        with open('./picture/' + url.rsplit('/', 1)[-1], 'wb') as f:#url.rsplit('/', 1)[-1]返回网址的最后一级内容
            f.write(r.content)
        print("成功下载:" + url.rsplit('/', 1)[-1])
    
  • 代码结果:
  • 2)心得体会:

    本次实验要求下载JPG格式的图片,而jpg图片的地址在标签中,因此直接将爬取到的源码信息转化为文本,对文本进行正则匹配,同时注意到部分重复的图片地址,对爬取到的网址放入set集合中去除重复内容。同时有一些图片网址是对原网站进行检索获取的,需要对其网址补充,最后通过这些图片的链接地址进行下载。

  • 相关阅读:
    Android学习地址
    Android动画设计源码地址
    chromeWebBrowser之浏览器开发
    win8.1蓝屏解决
    打包应用程序
    win8.1解决鼠标右键反应慢的问题
    Rewrite服务器和robots文件屏蔽动态页面
    第08组 Alpha事后诸葛亮
    第08组 Alpha冲刺(6/6)
    第08组 Alpha冲刺(5/6)
  • 原文地址:https://www.cnblogs.com/fzujch/p/13737399.html
  • Copyright © 2020-2023  润新知