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

作业①

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

(1)实验代码与结果1

代码部分:

import urllib.request
from bs4 import BeautifulSoup
def gethtml(url):
    html=urllib.request.urlopen(url)
    return html
def printdata(html):
    soup = BeautifulSoup(html, "html.parser")
    title=['排名','学校名称','省市','类型','总分']  #标题
    for i in range(5):
        print(title[i].center(12,chr(12288)),end=' ') #居中对齐,中文空格填充
    print('')
    for tr in soup.find('tbody').children: #通过.children找到tr标签
        t=0
        for td in tr.children: #通过.children找到td标签
            t+=1
            print(td.text.strip().center(12,chr(12288)),end=' ') #格式化输出td的text
            if(t>4): #输出前5个,即办学层次不输出
                break
        print('') #执行换行
if __name__ == '__main__':
    url="http://www.shanghairanking.cn/rankings/bcur/2020"
    html=gethtml(url)
    printdata(html)

输出结果:

(2)心得体会1

1.这次使用了find()方法来找到tbody,再通过遍历其子节点的前五个子节点来获取数据。
2.加深了对html的树结构和beautifulsoup的方法的了解。

作业②

要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。

(1)实验代码与结果2

代码部分:

import requests
import re
# 爬取的是淘宝网的书包,爬取价格和商品名称
# headers是登录搜索书包后复制了search文件中的user-agent和cookie
def getHtml(url):
    header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36',
              'cookie':'lLtC1_=1; xlly_s=1; t=4be53b788938ea8ce9ba7c2e103de98a;       enc=GX0DYtGxbBUlvdX66bMfRDodgbpE9C1%2FNqxvecoWgtOtwL8CFEcgWnBVbXt1Yr79npACCvd74X1XnLKiebe%2Fgw%3D%3D; thw=cn; hng=CN%7Czh-CN%7CCNY%7C156; _m_h5_tk=8e20996d7b9cef4d7ab1f184ca684931_1600684874391; _m_h5_tk_enc=8cc9385faf7ee9e5f1784d542595aba0; XSRF-TOKEN=345eba8b-4b17-4841-b6da-6e5aa97f0321; cookie2=1650903b671126e609c6ac4e51d5eaab; _tb_token_=ebea86eebb348; '
                       '_samesite_flag_=true; cna=dk1jF5nMz1sCAXjQepw3F2cQ; sgcookie=E100SAdOj4bjiEGc4C2Vd7jSY3RKwiXrLxV5zj%2FY2jBmqnm6HIYKSOmp6Nt%2BLp0n8%2BMshtdxQt0pL1Ue5%2BaO6r0Yeg%3D%3D; unb=4159438384; uc3=vt3=F8dCufeKwhcCBR4P9kA%3D&nk2=F5RMGoDRDG%2FrDn8%3D&lg2=UIHiLt3xD8xYTw%3D%3D&id2=Vy0WqANXyLs4Bg%3D%3D; csg=e5661e8b; lgc=tb934518942; cookie17=Vy0WqANXyLs4Bg%3D%3D; dnk=tb934518942; skt=3bac74297569de66; existShop=MTYwMDY3NzYwOA%3D%3D;'
                       ' uc4=id4=0%40VXqYzIs5jcyTW1R6Gw44QvvD0%2BT6&nk4=0%40FY4HX7Jz67CCTN9fBvcCkaRbls9olQ%3D%3D; tracknick=tb934518942; _cc_=W5iHLLyFfA%3D%3D; _l_g_=Ug%3D%3D; sg=249; _nk_=tb934518942; cookie1=ACixLlTxxu3%2FZy9T9EI0xT8Y8Rw1mzsO%2Fp4bffR5oCE%3D; mt=ci=0_1; uc1=cookie15=UtASsssmOIJ0bQ%3D%3D&cookie14=Uoe0bU5TpnKklA%3D%3D&pas=0&cookie21=Vq8l%2BKCLjA%2Bl&cookie16=VFC%2FuZ9az08KUQ56dCrZDlbNdA%3D%3D&existShop=false; '
                       'tfstk=ciwNB0mj7OBakxkfwAM2h2cJjIDOZqgmPporsSAJvHWOMchGil8xxMTxYmuRKff..;'
                       ' l=eBxbtxR7OFMOT5GbBOfahurza77OSIRYluPzaNbMiOCP9Ifp5BDNWZrtTzL9C3hVhs_9R3-WSGYuBeYBq3xonxvtNSVsr4Dmn; isg=BAwM2mnSvzcEIKtLcF2RaC9H3Wo-RbDvKvdMV2bNGLda8az7jlWAfwJDkPlJ_-hH',}
    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'"view_price":"[\d\.]*"',html)  #[\d\.]匹配数字或小数点
    t = re.findall(r'"raw_title":".+?"',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://s.taobao.com/search?q=书包"
    page = int(input("要爬取的页数:"))   #获取需要爬取的页数
    for i in range(page):
        print('-'*30+'第'+str(i+1)+'页'+'-'*30)
        url = url +'&s='+str(44*i)  # 用修改s属性的方式进行翻页
        html = getHtml(url)
        getdata(html)

输出结果:

(2)心得体会2

在淘宝搜索书包,F12找到商品名称和价格如下图:

1.通过正则表达式来匹配这样的键值对,然后用冒号分割,得到商品名称和价格。
2.".+?"问号懒惰匹配,匹配到第一个"结束。
3.爬取淘宝数据要设置请求头Headers,headers是登录搜索书包后复制了F12->network->find all->search文件中的user-agent和cookie,来解决反爬机制。
4.对于翻页:
对比1,2,3页网址
第一页:https://s.taobao.com/search?q=书包&s=0
第二页:https://s.taobao.com/search?q=书包&s=44
第三页:https://s.taobao.com/search?q=书包&s=88
可以通过修改s属性的方式翻页。

作业③

要求:爬取一个给定网页(http://xcb.fzu.edu.cn/html/2019ztjy)或者自选网页的所有JPG格式文件

(1)实验代码与结果3

代码部分:

import urllib.request
from bs4 import BeautifulSoup
import re
import os
#爬取了福大新闻网的jpg形式图片
def gethtml(url):
    html=urllib.request.urlopen(url)
    return html
def get_save_jpg(html,path):
    soup = BeautifulSoup(html,"html.parser")
    img=".+\.(jpg|JPG)"   #所有jpg图片
    jpg = soup.find_all("img",{"src":re.compile(img)})    #beautifulsoup和正则表达式结合
    for r in jpg:
        name = r.attrs["src"]    #获取src值
        rename=name.replace("/","_")   #图片名中的"/"会和路径冲突,所以换成下划线
        img_url=url+name   #绝对路径
        urllib.request.urlretrieve(img_url, path+rename)   #保存到F:/image/下
    print("文件保存成功")
if __name__ == '__main__':
    url = "http://news.fzu.edu.cn/"    #福大新闻网
    path = "F:/image/"
    os.mkdir(path)  #新建一个目录
    html=gethtml(url)
    get_save_jpg(html,path)

文件保存结果:

(2)心得体会3

1.爬取图片要找到图片链接,通过beautifulsoup和正则表达式结合来找到所有的jpg图片的相对路径,再用url+相对路径换成绝对路径,通过urllib.request.urlretrieve来复制到本地。
2.有的图片是JPG后缀,一开始忽略了。
3.保存时图片名中有'/',保存时会被当成保存路径,所以替换成了下划线。

posted @ 2020-09-26 22:51  lumos1  阅读(425)  评论(0编辑  收藏  举报