2023数据采集与融合技术实践作业一

发布时间 2023-09-26 22:41:21作者: I服了U123
第一次作业

排名

学校名称

省市

学校类型

总分

1

清华大学

北京

综合

852.5

2......

 

 

 

 

   1)作业代码和图片:

      代码内容:

import requests
from bs4 import BeautifulSoup
import bs4

#将url信息从网络中爬取下来,并且将它其中的html页面返回给其他的函数
def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "getHTMLText(url) error"

#提取html信息中关键的数据,并且填到一个列表中
def fillUnivList(ulist,html):
    soup = BeautifulSoup(html,"html.parser")

    for tr in soup.find("tbody").children:

        if isinstance(tr,bs4.element.Tag):
            #print(tr)
            tds = tr('td')
            tds1 = tr('a')
            #print(tds[3].text)
            #print(tds1[0].string)
            ulist.append([tds[0].string.strip(),tds1[0].string.strip(),tds[2].text.strip(),tds[3].text.strip(),tds[4].string.strip()])


#格式化打印学校列表信息
def printUnivList(ulist,num):
    tplt="{0:^8}{1:{5}^10}{2:{6}^10}{3:{7}^10}{4:^6}"
    print(tplt.format("排名 ","学校名称 "," 省市 ","学校类型","总分 ",chr(12288),chr(12288),chr(12288)))
    for i in range(num):
        u=ulist[i]
        # print(u[0])
        print(tplt.format(u[0],u[1],u[2],u[3],u[4],chr(12288),chr(12288),chr(12288)))

def main():
    uinfo = []
    url = 'http://www.shanghairanking.cn/rankings/bcur/2020'
    html = getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivList(uinfo,30)
main()

      输出结果图片:

  2)心得体会:

      这个作业一有几个比较值得要注意的地方,第一个就是他的学校名称是单独放在a标签下面的,导致读取的时候要单独读取他,而其他的内容则是放在td标签下面的;第二个就是读取省市和学校类型的信息要用.text而不能用.string,否则会读取成None的内容;第三个是输出的时候会出现不对齐的情况,是因为当中文字符宽度不够的时候,默认采用西文字符填充,而中西文字符占用的宽度不同,从而导致输出的信息是歪歪扭扭的,这个时候就需要采用中文字符的空格填充chr(12288),即可实现输出居中对齐并且不会歪歪扭扭。

  • 作业:
  • 要求:requestsre库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词书包搜索页面的数据,爬取商品名称和价格。
  • 输出信息:

序号

价格

商品名

1

65.00

xxx

2......

 

 

   1)作业代码和图片:

      代码内容:

import requests
import re
from bs4 import BeautifulSoup
import urllib.request
import urllib.parse

def parsePage(ilt,html):
    try:
        plt = re.findall(r'\&yen\;[\d\.]*',html)
        # print(plt)
        tlt = re.findall(r'alt\=\'.*?\'',html)
        # print(tlt)
        for i in range(len(plt)):
            price = eval(plt[i].split(';')[1])
            # print(price)
            title = eval(tlt[i].split('=')[1])
            # print(title)
            ilt.append([price,title])
            # print(ilt)
    except:
        print("")

def printGoodsList(ilt):
    tplt="{:4}\t{:8}\t{:16}"
    print(tplt.format("  序号","    价格","         商品名"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count,g[0],g[1]))
def main():
    # 更改头部信息模拟浏览器访问
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36"
    }
    # 设置搜索关键词
    wood = '书包'
    # 将中文转换为url编码
    urlwood = urllib.parse.quote(wood, safe='/', encoding='utf-8')
    # 自定义爬取页数
    page = 3
    # 初始化下载页数显示
    a = 1
    # 循环遍历每一页
    infoList = []
    for i in range(1, page):
        try:
            # 获取url内容
            r = requests.get(f"https://search.dangdang.com/?key={urlwood}&act=input&page_index={i}", headers=headers)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            html = r.text
            # print(html)
            parsePage(infoList,html)
        except:
            continue
    printGoodsList(infoList)

main()

      输出结果图片:

  2)心得体会:

      这题主要就是要用正确的正则表达式来去匹配商品页面的价格和名称,我们可以通过查看网页源代码加上ctrl+f查找关键词来查看商品的价格和名称是被什么包围的,从而写出合适的正则表达式去匹配商品价格和名称,可以通过print函数来检查自己的正则表达式匹配的内容是否正确。

   1)作业代码和图片:

      代码内容:

import requests
from bs4 import BeautifulSoup
import urllib.request
def getPhotoImg():
    url=requests.get("https://xcb.fzu.edu.cn/info/1071/4481.htm")
    htm=url.text
    soup = BeautifulSoup(htm,'html.parser')
    jpeg = soup.find_all('img')
    a = 1
    for i in jpeg:
        imgsrc = 'https://xcb.fzu.edu.cn'+i.get('src')
        # print(i.get('src'))
        filename = 'D:/学习/数据采集与融合技术/爬取图片/%s.jpg'%a
        urllib.request.urlretrieve(imgsrc , filename)
        print('下载第%d张' % a)
        a += 1
    print('下载完成!')

getPhotoImg()

      输出结果图片:

  2)心得体会:

      这题比较简单,就是找到url信息里面的所有img标签的内容,再加上https://xcb.fzu.edu.cn得到每一张图片的的地址,然后再将图片一个个下载即可