数据采集与融合技术作业1

  • 作业①:

排名

学校名称

省市

学校类型

总分

1

清华大学

北京

综合

852.5

2......

       

  代码如下:

 
import urllib.request
import bs4
from bs4 import BeautifulSoup
def getHTMLText(url):
    url = "http://www.shanghairanking.cn/rankings/bcur/2020"
    try:
        req = urllib.request.Request(url)#访问url网址
        data = urllib.request.urlopen(req)#读取数据
        data = data.read().decode()
        return data
    except Exception as err:
        print(err)

def fillUnivList(list, html):
    soup = BeautifulSoup(html, "html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            a = tr('a')#定义一个列表a存放学校名称
            tds = tr('td')#定义列表存放学校信息
            list.append([tds[0].text.strip(), a[0].string.strip(), tds[2].text.strip(),
                         tds[3].text.strip(), tds[4].text.strip()])

#打印输出结果
def printUnivList(list1, num):
    tplt = "{0: ^10}\t{1: ^10}\t{2: ^12}{3: ^10}\t{4: ^10}"
    print(tplt.format("排名","学校名称","省份","学校类型","总分"))
    for i in range(num):
        u = list1[i]
        print(tplt.format(u[0], u[1], u[2], u[3], u[4]))
    print()
    print("以上共有记录" + str(num) + "条。")

#主函数main
def main():
    list = []
    url = "https: // www.shanghairanking.cn / rankings / bcur / 2020"
    html = getHTMLText(url)
    fillUnivList(list, html)
    printUnivList(list, 22)

main()

输出结果截图如下:

 

心得:

因为是重新使用vscode完成python,导致中文输出乱码,查找了好多办法都没用,将文件改成gbk格式又会出现新的报错,后来参考了 https://blog.csdn.net/didi_ya/article/details/107883798 的方法一才得以解决。

这份代码本来是从网上查找得到的,后来在几次作业之后才慢慢理解了。

 

 

 

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

 

        

 

 

  代码如下:

import requests
from bs4 import BeautifulSoup
from pprint import pprint
import io
import sys
import urllib.request
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

url="http://search.dangdang.com/?key=%CA%E9%B0%FC&act=input"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.36"
}

resp=requests.get(url,headers=headers).text
soup=BeautifulSoup(resp,'lxml')
data_list=soup.select('ul[class="bigimg cloth_shoplist"] li')
data=[]
for li in data_list:
    name=li.a.attrs['title']
    price=li.select('p[class="price"] span')[0].text
    data.append((name,price))
pprint(data)

 

 输出结果如下(后面还有很长一串):

 

心得:

在这次写代码的过程中遇到了很多问题。首先是老师教会了我用headers规避反爬。然后在同学的帮助下查看网页的信息,找到需要爬取页面所在的相似之处,来完成代码的构造。

代码在完成的过程中也出现了很多问题,因为pycharm用不了了,只能在vscode上运行,导致需要重新下载python库。

然后紧接着又出现了一下问题:

 

查询了csdn发现是print的格式可能出现了问题,后来在代码头加入了以下代码才解决:

 

import io
import sys
import urllib.request
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

 

 

  • 作业③:
  • 要求:爬取一个给定网页( https://xcb.fzu.edu.cn/info/1071/4481.htm )或者自选网页的所有JPEG和JPG格式文件
  • 输出信息:将自选网页内的所有JPEG和JPG文件保存在一个文件夹中

 

代码如下:

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent

url = "https://xcb.fzu.edu.cn/info/1071/4481.htm"
headers = {
    'User-Agent':UserAgent().chrome
}

response = requests.get(url,headers)
# print(response)
soup = BeautifulSoup(response.text,'lxml')

imgs = soup.find_all('img',attrs={'width':'600'})
# print(imgs)
img_address = []
for img in imgs:
    picture_address = "https://xcb.fzu.edu.cn"+img['src']
    img_address.append(picture_address)
# print(img_address)

for i in range(len(img_address)):
    res = requests.get(img_address[i],headers)
    with open(f".\picture{i+1}.jpg","wb") as f:
        f.write(res.content)
        print(f"第{i+1}副图片下载完毕")

 

输出结果如下:

 心得:

在这份代码中,我学会了如何查看土拍你所在地址,并会打开图片查看需要在前面加的头地址(因为在f12中的图片rul和网页中的不同),也学会了如何循环打开并输出图片。

 

 

posted @ 2023-09-26 23:48  lichouben  阅读(34)  评论(0)    收藏  举报